最近遇到的问题:三个兄弟Div怎么平分一行内容?希望抛转引玉,吸引了解的同学一起交流
1、父元素宽度为100%,非定值
2、因为我司产品要兼容IE10,甚至IE9,也就没往flex布局想
一、三栏布局
1、流体布局
左右两个div设置float值达到三栏效果,中间模块设置margin值湿使其自适应,注意此时的DOM结构 该方法的缺点就是主要内容无法最先加载,当页面内容比较多时会影响用户体验
<div class="outer">
<div class="left">1</div>
<div class="right">3</div>
<div class="center">2</div>
</div>
.outer {
height: 100%;
border: 1px solid indianred;
}
.left {
float: left;
width: 10%;
background: aquamarine;
}
.right {
float: right;
width: 10%;
background: green;
}
.center {
margin: 0 10%;
}
2、BFC+float
利用BFC不与浮动元素重叠的规则,设置float样式即可完成三栏布局,此时的DOM结构与流体布局一样,缺点与流体布局类似,主要内容模块无法最先加载
.left {
float: left;
width: 25%;
background: aquamarine;
}
.right {
float: right;
width: 25%;
background: green;
}
.center {
margin: 0 25%;
overflow: hidden; /* 创建BFC */
}
3、双飞翼布局
自理解:浮动元素都是一行,只是因为宽度不够,后面的元素被挤到视觉上的下一行,测试根据宽度的设置,设置负的margin值就可把挤下去的元素放到目标位置
<!DOCTYPE html>
<html lang="en">
<head>
<style>
.content {
float: left;
width: 100%; /*占据视觉上第一行*/
}
.main {
height: 200px;
margin-left: 110px;
margin-right: 220px;
background-color: green;
}
.left {
float: left;
height: 200px;
width: 100px;
margin-left: -100%; /* 放到目标位置 */
background-color: red;
}
.right {
width: 200px;
height: 200px;
float: right;
margin-left: -200px; /* 放到目标位置 */
background-color: blue;
}
</style>
</head>
<body>
<div class="content">
<div class="main">content</div>
</div>
<div class="left">left</div>
<div class="right">right</div>
</body>
</html>
4、圣杯布局
和双飞翼布局的原理类似,圣杯布局的样式会根复杂一点,也有一些限制,margin值要是定值,这样才能确定左右部分的宽度
<!DOCTYPE html>
<html lang="en">
<head>
<style>
.container {
margin-left: 120px;
margin-right: 220px;
}
.main {
float: left;
width: 100%;
height: 300px;
background-color: red;
}
.left {
float: left;
width: 100px;
height: 300px;
margin-left: -100%;
position: relative;
left: -120px;
background-color: blue;
}
.right {
float: left;
width: 200px;
height: 300px;
margin-left: -200px;
position: relative;
right: -220px;
background-color: green;
}
</style>
</head>
<body>
<div class="container">
<div class="main"></div>
<div class="left"></div>
<div class="right"></div>
</div>
</body>
</html>
5、flex布局
不多说,实现N栏都行,缺点就是需要考虑浏览器兼容性 详细可查阅《CSS权威指南》下册flex部分 flex: 增长因子 缩减因子 基准
<!DOCTYPE html>
<html lang="en">
<head>
<style>
.container {
display: flex;
}
.container > div {
flex: 1;
}
.main {
height: 300px;
background-color: red;
}
.left {
order: -1;
margin-right: 20px;
height: 300px;
background-color: blue;
}
.right {
margin-left: 20px;
height: 300px;
background-color: green;
}
</style>
</head>
<body>
<div class="container">
<div class="main"></div>
<div class="left"></div>
<div class="right"></div>
</div>
</body>
</html>
6、Table布局
注意浏览器兼容,缺点是无法设置栏间距
<!DOCTYPE html>
<html lang="en">
<head>
<style>
.container {
display: table;
width: 100%;
}
.left, .main, .right {
display: table-cell;
}
.left {
width: 200px;
height: 300px;
background-color: red;
}
.main {
background-color: blue;
}
.right {
width: 100px;
height: 300px;
background-color: green;
}
</style>
</head>
<body>
<div class="container">
<div class="left"></div>
<div class="main"></div>
<div class="right"></div>
</div>
</body>
</html>