사실 인터넷에는 Flow(흐름 레이아웃 모델), Float(플로팅 레이아웃 모델), Layer(계층적 레이아웃 모델) 등 웹 페이지의 기본 레이아웃을 위한 여러 가지 방법이 있습니다.
흐름 레이아웃 모델은 실제로 기본 웹 페이지 레이아웃 모드입니다. 즉, 기본 상태의 웹 페이지의 HTML 웹 요소는 흐름 모델에 따라 웹 페이지 콘텐츠를 배포합니다.
흐름 레이아웃에는 두 가지 일반적인 특성이 있습니다.
첫 번째, 블록 수준 요소는 가장 가까운 상위 컨테이너 요소 내에서 위에서 아래로 수직 및 순차적으로 배포됩니다. 기본적으로 블록 수준 요소의 너비는 모두 100%입니다(즉, , 상위 요소 너비의 100%). 실제로 블록 요소는 행 형태로 해당 위치를 차지합니다. 다음 코드와 같이
<html><body><h1>我是h1</h1><div>我是div</div></body></html>
위 코드와 같이 외부 스타일의 영향 없이 h1과 div의 너비는 100%(페이지 기본 너비)가 됩니다.
둘째, 흐름 모델에서 인라인 요소는 가장 가까운 상위 컨테이너 요소 내에서 왼쪽에서 오른쪽으로 수평으로 표시됩니다.
<html><body><a>我是a</a><span>我是span</span></body></html>
인라인 요소는 블록 수준 요소처럼 단독으로 한 줄을 차지하지 않습니다.
모든 요소는 기본적으로 전체 문서 흐름에 있으며 플로팅되지 않습니다. float를 요소에 설정하면 요소가 현재 문서 흐름에서 벗어나 부동 요소가 되도록 할 수 있습니다.
다음 코드는 두 div가 나란히 표시될 수 있도록 div 요소에 float를 설정합니다.
div{width:200px;height:200px;border:2px red solid;float:left; }
<div id="div1">我是div1</div> <div id="div2">我是div2</div>
여기서 주의할 점은 div에 설정한 float가 float: right이면 div1은 오른쪽에 연결되고 div2는 div1의 왼쪽에 연결된다는 것입니다.
계층적 레이아웃 모델이란 무엇인가요?
계층적 레이아웃 모델은 이미지 소프트웨어 PhotoShop에서 매우 널리 사용되는 레이어 편집 기능과 같습니다. 그러나 웹 디자인 분야에서는 웹 페이지 크기의 이동성으로 인해 계층적 레이아웃이 사용됩니다. 모델은 인기가 없었습니다. 그러나 웹 페이지에서 로컬로 계층적 레이아웃을 사용하는 것은 여전히 편리합니다.
애플리케이션 계층적 레이아웃에는 위치 지정 속성의 협력이 필요한 경우가 많습니다. CSS에는 3가지 위치 지정 유형이 있습니다.
절대 위치 지정(위치: 절대)
상대 위치 지정(위치: 상대)
고정 위치 지정(위치: 고정)
if 요소의 계층적 레이아웃 모델에서 절대 위치를 설정하려면 position:absolute(절대 위치 지정을 나타냄)를 설정해야 합니다. 이 문의 기능은 요소를 문서 흐름 밖으로 끌어낸 다음 왼쪽을 사용하는 것입니다. , 오른쪽, 위쪽 및 아래쪽 속성을 기준으로 위치 지정 속성이 있는 가장 가까운 상위 포함 블록이 절대적으로 배치됩니다. 그러한 포함 블록이 없으면 본문 요소, 즉 브라우저 창을 기준으로 합니다.
요소의 계층적 레이아웃 모델에서 상대 위치를 설정하려면 왼쪽을 통한 일반 문서 흐름에서 요소의 오프셋을 결정하는 position:relative(상대 위치 지정을 나타냄)를 설정해야 합니다. , 오른쪽, 위쪽 및 아래쪽 속성입니다. 상대 위치 지정 프로세스는 먼저 정적(부동) 모드에서 요소를 생성한 다음(요소가 레이어처럼 부동) 이전 위치를 기준으로 이동하는 것입니다. 이동 방향과 진폭은 왼쪽, 오른쪽에 따라 결정됩니다. , 상단 및 하단 속성, 오프셋 전 위치는 변경되지 않습니다.
상대 위치 지정과 절대 위치 지정의 가장 큰 차이점은 전자는 현재 문서 흐름에서 벗어나지 않고 후자는 이미 현재 문서 흐름에서 벗어났다는 점입니다. 현재 문서 흐름에서 분리된다는 것은 위치와 오프셋을 계산할 때 요소 앞과 뒤의 요소가 더 이상 요소의 크기와 위치를 계산하지 않는다는 것을 의미합니다.
position: 고정, 고정된 위치를 나타냅니다. 절대 위치 지정 유형과 유사하지만 상대 이동 좌표는 뷰(화면 내 웹 페이지 창) 자체입니다. 뷰 자체는 고정되어 있으므로 화면에서 브라우저 창의 화면 위치를 이동하거나 브라우저 창의 표시 크기를 변경하지 않는 한 브라우저 창의 스크롤 막대가 스크롤됨에 따라 뷰는 변경되지 않습니다. 항상 문서의 흐름에 영향을 받지 않는 브라우저 창 내의 특정 위치에 있어야 합니다. 이는 background-attachment:fixed(배경 이미지의 위치를 지정하는 데 사용됨) 속성과 동일한 기능을 갖습니다. .
고정 위치 지정은 페이지 스크롤 막대의 영향을 받지 않고 페이지의 특정 위치에 특정 요소를 고정적으로 표시해야 하는 특정 시나리오에서 유용합니다. 예를 들어 일반적인 "맨 위로 돌아가기" 버튼이 있습니다.
현대 웹 페이지 레이아웃에서는 더 유연한 목적을 달성하기 위해 상대 위치 지정과 절대 위치 지정이 혼합되는 경우가 많습니다. 다음 코드에서
<style>#box1{width:200px;height:200px;position:relative; /* 前辈元素的定位必须设置为relative */ }#box2{position:absolute; /* 相对于最近的一个定位设置为relative的前辈元素的绝对定位 */top:20px;left:30px; }</style><div id="box1"><div id="box2">相对参照元素进行定位</div></div>
는 box2가 box1을 기준으로 절대 위치에 있음을 의미합니다. box1의 위치가 변경되면 box1 내부의 하위 요소는 모두 box1을 기준으로 절대 위치에 있으므로 변경되지 않습니다.
방법 1:
float + calc().right {width: calc(100% - 100px); }
방법 2:
position / float + margin-left//html部分同上//css.left { position:absolute;left: 0; /*或 float:left; */ width: 100px; background: blue; } .right{ margin-left: 100px; background: red; text-align:center; }
1. 왼쪽은 float, 오른쪽은 margin-left 사용, 왼쪽은 길이 고정, 너비는 100%입니다
2.利用的是创建一个新的BFC(块级格式化上下文)来防止文字环绕的原理来实现的。BFC就是一个相对独立的布局环境,它内部元素的布局不受外面布局的影响。它可以通过以下任何一种方式来创建:
float的值不为none
position的值不为static或者relative
display的值为 table-cell, table-caption, inline-block, flex, 或者 inline-flex中的其中一个
overflow的值不为visible
首先有三行,头部和尾部各占一行,中间内容区一行,头尾不重要
中间内容分为三列对应三个div,为了先展示中间的主要内容所以把中间那列放前面,然后是左和右对应的div
中间内容自适应宽度为100%,此时已经把3个div所在的父容器占满了,所以想办法让左右2个div放置在左右侧,
左侧采取margin-left取-100%让其在最左侧,
右侧同理取值-200px(像素值为宽度大小),保证刚好占满自身宽度
这时候测试发现已经有自适应效果了,但是缩小到一定程度页面就出问题了,左右不在了,
所以加上最低宽度就是左右2个DIV的宽度(另外得考虑浏览器默认的body下的margin为8px,做了样式重置不考虑)
这时候发现中间的内容文字被左右遮挡了,对父容器用pading左右值为左右元素宽度,
为什么不对中间的DIV设置padding,我发现设置了不起作用,具体的原因我暂时也搞不懂来龙去脉,
发现padding后左右有留白,这个时候左边需要用 left: -200px;position: relative;来设置DIV位置,
办法确实巧妙。右边实现同理。
这时候发现已经大致有了点样子了,效果也看的到,此时典型的三栏布局,左右固定,中间内容自适应已经完成。
总结:
其实这个布局已经有点年头(圣杯布局),通过左右两块DIV来遮挡了中间div宽度为100%的区域,
然后压缩了三个DIV共有的父容器,来实现对中间内容展示的完善,也使左右2个不在遮挡中间了。
然后我又趁机试了下z-index属性,这里有个小问题要注意(要让z-index起作用有个小小前提,
就是元素的position属性要是relative,absolute或是fixed)我之前的想法是让中间的内容置于顶层,不受div会因为某种hack导致位置变更遮挡了中间内容。
只需要设置下z-index属性值即可,左右可不设置,也可以设置以防万一,不同浏览器对z-index的默认值解析不同,可能会导致问题。基本的布局架构就是如此,根据实际项目需求在此架构上完善,或者以后遇到这种类似的问题能打开思路,便算是有点收获了。
<style>body {/*因为浏览器默认body为margin:8px所以多加了16px*/min-width: 616px; }header {width: 100%;height: 40px;background-color: darkseagreen; }.container {/*height: 200px;*//*overflow: hidden;*/padding: 0 200px; }.middle {width: 100%;height: 200px;background-color: deeppink;float: left;/*position: relative;*/ }.left {width: 200px;height: 200px;background-color: blue;float: left;margin-left: -100%;left: -200px;position: relative; }.right {width: 200px;height: 200px;background-color: darkorchid;float: left;margin-left: -200px;right: -200px;position: relative; }footer {clear: both;width: 100%;height: 30px;background-color: darkslategray; }</style>
<header><h4>Header内容区</h4></header><div class="container"><div class="middle"><h4>中间弹性区</h4><p> 我是各种内容我是各种内容我是各种内容我是各种内容我是各种内容我是各种内容我是各种内容我是各种内容我是各种内容我是各种内容我是各种内容我是各种内容我是各种内容我是各种内容我是各种内容我是各种内容我是各种内容我是各种内容</p></div><div class="left"><h4>左边栏</h4></div><div class="right"><h4>右边栏</h4></div></div><footer><h4>Footer内容区</h4></footer>
双飞翼布局的方式跟圣杯在前部分是一样,不同之处主要在于如何处理中间的内容块被遮挡的问题
圣杯用padding的思路,使之压缩,但是父容器压缩,左右DIV位置变更,只能用相对位置进行left
设置位移为元素宽度来调整
而双飞翼的路线为采用的方式相比圣杯的父容器padding,
改变的是中间内容的内层div的外边框,相对来说对布局的破坏不大,
但是要采用这种方式又不破坏页面结构,就只能在中间内容div内部的再加个DIV设置margin或padding.
使之内容变相“压缩”等同padding效果,并且不会改变中间内容DIV外部的结构,只是内部的。
细心的人留意下我注释的代码,这里其实还有个CSS浮动的样式问题,出现这种情况有各种方式清除浮动,
我就不多讲解。大概有6种。
1.一般目前常用就是用:after伪元素给使用的浮动的父容器设置。
新浪使用方式.clearfix:after{ content: '';display: block;clear: both;height: 0;visibility: hidden; }.clearfix:after{ /*最简方式*/content: '';display: block;clear: both; }
2.给父元素定高
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title></title><style>.outer{border: 1px solid black;width: 300px;height: 50px; }.inner{width: 50px;height: 50px;background-color: #ff4400;margin-right: 20px;float: left; }.footer{background-color: #005FC3;width: 200px;height: 100px; }</style></head><body><div class="outer"><div class="inner"></div><div class="inner"></div><div class="inner"></div></div><div class="footer"></div></body></html>
3.利用 overflow:hidden 属性
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title></title><style>.outer{border: 1px solid black;width: 300px;overflow: hidden;zoom: 1;/*兼容 IE*/ }.inner{width: 50px;height: 50px;background-color: #ff4400;margin-right: 20px;float: left; }.footer{background-color: #005FC3;width: 200px;height: 100px; }</style></head><body><div class="outer"><div class="inner"></div><div class="inner"></div><div class="inner"></div></div><div class="footer"></div></body></html>
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta http-equiv="X-UA-Compatible" content="ie=edge"><title>双飞翼</title><style>header {width: 100%;height: 40px;background-color: darkseagreen; }.container {/*height: 200px;*//*overflow: hidden;*/ }.middle {width: 100%;height: 200px;background-color: deeppink;float: left;word-break: break-all; }.left {width: 200px;height: 200px;background-color: blue;float: left;margin-left: -100%; }.right {width: 200px;height: 200px;background-color: darkorchid;float: left;margin-left: -200px; }footer {width: 100%;height: 30px;background-color: darkslategray;clear: both; }.div-middle {margin: 0 200px;/*padding: 0 200px;*/ }</style></head><body><header><h4>Header内容区</h4></header><div class="container"><div class="middle"><div class="div-middle"><h4>中间弹性区</h4><p> 我是各种内容我是各种内容我是各种内容我是各种内容我是各种内容我是各种内容我是各种内容我是各种内容我是各种内容我是各种内容我是各种内容我是各种内容我是各种内容我是各种内容我是各种内容我是各种内容我是各种内容我是各种内容</p></div></div><div class="left"><h4>左边栏</h4></div><div class="right"><h4>右边栏</h4></div></div><footer><h4>Footer内容区</h4></footer></body></html>
本篇只做阶段性的初级总结,原谅我没有贴出代码的效果图,以后有机会再扩展并进行效果图片展示,希望大家自己在编辑器下尝试效果。
学习过程中遇到什么问题或者想获取学习资源的话,欢迎加入学习交流
위 내용은 CSS 기본 레이아웃 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!