布局模型中经典布局有:
三栏或者二栏布局中主内容自适应宽度且侧栏主栏可随意换位置,本文将针对这个需求进行分析。
这次布局模型将从absolute+margin–>float+margin–>圣杯布局–>双飞翼布局–>flex弹性盒子布局
需要注意的点:在此说明一下。
<div class="wrap">
<header>headerheader>
<div id="content">
<main>
main<br>主栏
main>
<aside>aside<br>中文如果超过宽度会换行,对于连续的英文和数字超过不会自动换行。需要加上break-word:break-all;aside>
div>
<footer>footerfooter>
div>
利用相对定位实现主栏和侧栏的位置。
aside
设置position:absolute
,相对于父元素#content
定位。
aside{
position:absolute;
left:0;
top:0;
width:200px;
background:green
}
main
设置margin-left/right:210px;
,为aside
留出空间。main
元素还是块级元素,宽度自动填充100%,自适应。
main{
margin-left:210px;
background:green;
}
以上是侧栏在左情况,若侧栏在右同样可以,只需css稍微改变。
aside{
position:absolute;
right:0;
top:0;
width:200px;
background:green
}
main{
margin-right:210px;
background:green;
}
absolute
脱离文档流,不影响上下文,所以无法撑起父元素#content
的高度,如果侧栏内容多于主栏内容(侧栏高度低于主栏高度),侧栏则会溢出父元素#content
,这个问题无法修复。如下图所示:
aside
设置float
aside{
float:left;
width:200px;
background:blue;
word-break: break-all;/*连续的英文和数字不会自动换行,此处控制自动换行*/
}
main
设置margin-left/right
,为aside
留出空间。main
元素还是块级元素,宽度自动填充100%,自适应。
main{
margin-left:210px;
background:green;
}
敲完代码,查看结果,把aside放在右边也是一样,这并不是我们想要的,请看:
这个就是浮动换行问题,浮动元素必须放在正常元素的前面,所以html代码需要改。
<div class="wrap">
<header>headerheader>
<div id="content">
<aside>aside<br>中文如果超过宽度会换行,对于连续的英文和数字超过不会自动换行。需要加上break-word:break-all;aside>
<main>
main<br>主栏
main>
div>
<footer>footerfooter>
div>
不能实现主内容优先,因为浮动元素需放前,不然会浮动换行。
以下以循循渐进方式讲述圣杯布局。
给aside
和main
都设成float;left;
main
宽度设成100%。
main{
float:left;
background:green;
width:100%;
}
aside{
float:left;
width:200px;
background:blue;
}
这样aside和main就成为了两行显示,main独占一行。
为aside
设置负margin-left
!!!
aside
设 margin-left:-100%
会上升到main栏左侧。margin-left:-210px;
会上升到main栏右侧。
aside{
float:left;
width:200px;
background:blue;
margin-left:-100%;/*这里负margin要好好理解,-200就是上升在最右边,-100%就是上升在最左边。*/
}
但是你会发现侧栏挡住了主栏。
你想设置main
的margin
?那可不行,main
的宽度100%,设置margin
自己就跑出去了。
那么把main
的父元素设置padding
吧。
#content{
margin-bottom:10px;
padding-left:210px;
}
可是你发现aside
也跟着空出位置来了,因为他也是#content
的子元素,不是我们想要的。
给aside设置position:relative;相对自身进行位移。
aside{
float:left;
width:200px;
background:blue;
margin-left:-100%;/*这里负margin要好好理解,-200就是在最右边,-100%就是在最左边。*/
position:relative;
left:-210px;
}
把侧栏和主栏换位置也是可以的,只需改动css
#content{
margin-bottom:10px;
padding-right:210px;
}
aside{
margin-left:-200px;/*这里负margin要好好理解,-200px就是在最右边,-100%就是在最左边。*/
position:relative;
right:-210px;
}
圣杯布局可以实现主内容优先显示,也可以主栏、侧栏变位置,当然也可以防止溢出父元素。
双飞翼布局为了实现以上效果,多加一个标签,即给main
包裹了一个div
,给div
设置padding
,让main
留出位置给aside
,这样aside
就不用自身定位了,父元素也不用padding
了。
<div id="content">
<main>
<div id="inner">main<br>主栏div>
main>
<aside>aside<br>中文如果超过宽度会换行,对于连续的英文和数字超过不会自动换行。需要加上break-word:break-all;aside>
div>
css代码:
#inner{
margin-left:210px;
background:green;
}
如果你想让main和aside一样高怎么办呢?如图:
用flex弹性盒子解决。
给main
和asdie
父元素设display:flex;
和flex-flow
给main
设置flex:1
,合理分配剩余空间。
#content {
display: flex;
flex-flow: row-reverse;/*如果是row(默认值),则侧栏在右*/
}
main{
flex: 1;/*按比例缩小或者放大,如果没有这一项就会是按照内容宽度显示*/
background:green;
margin-left:10px;
}
aside{
width:200px;
background:blue;
}
盒子满足以上所有优点,但是需要考虑兼容性问题。
在线演示
全部详细代码