float:left 和 margin-left
HTML部分
<div class="left">123456789</div>
<div class="right">123456789</div>
CSS部分
.left,.right{height: 300px;}
.left{width: 50%;background-color: blue;float: left;}
.right{margin-left: 50%;background-color: red;}
右右盒子设置:左外边距>=左盒子宽度,达到右盒子自适应
float:left 和 overflow:hidden
BFC :块格式化上下文(Block Formatting Context)部分
BFC的布局规则:
- 内部的Box会在垂直方向,一个接一个地放置。
- Box垂直方向的距离由margin决定。属于同一个BFC的两个相邻Box的margin会发生重叠。
- 每个盒子(块盒与行盒)的margin box的左边,与包含块border box的左边相接触(对于从左往右的格式化,否则相反)。即使存在浮动也是如此。
- BFC的区域不会与float box重叠。
- BFC就是页面上的一个隔离的独立容器,容器里面的子元素不会影响到外面的元素。反之也如此。
- 计算BFC的高度时,浮动元素也参与计算。
如何触发BFC
- float的值不是none。
- position的值不是static或者relative。
- display的值是inline-block、table-cell、flex、table-caption或者inline-flex
- overflow的值不是visible
BFC的功能
- 清理浮动(使 BFC 内部浮动元素不会到处乱跑)
- 解决margin重叠(使普通元素与浮动元素之间实现margin)
HTML部分
<div class="left">123456789</div>
<div class="right">123456789</div>
CSS部分
.left,.right{height: 300px;}
.left{width: 50%;background-color: blue;float: left;}
.right{overflow:hidden;background-color: red;}
右侧设置的overflow:hidden会触发块级格式化上下文(BFC),右盒子可以用触发BFC的元素来清除左边浮动的影响。
position:absolute
HTML部分
<div class="box">
<div class="left">left</div>
<div class="right">right</div>
</div>
CSS部分
.box{position : relative;}
.left,.right{height: 300px;}
.left{ width:50%;background-color: blue;}
.right{ position: absolute; top: 0; left:50%; right: 0;background-color: red;}
通过设置相对父元素top:0,right=0,left=50%限制左边和右边位置,使宽度自适应。
table布局
HTML部分
<table>
<tbody>
<td>
<img src="http://5b0988e595225.cdn.sohucs.com/images/20181214/ca7c6d9380aa4ff881fd9630dbeb0859.jpeg" width="750px">
</td>
<td>
<img src="http://5b0988e595225.cdn.sohucs.com/images/20181214/877b429c822d49a8ad406063206b5f43.jpeg" width="750px">
</td>
</tbody>
</table>
- 结构放到tbale中
- 两列分别放到两个td中,固宽的td设置一个宽度即可
- 二者间距使用任何一个td设置左或右边距即可。
- 同样实现了垂直居中布局
利用grid布局
HTML部分
<div class="parent" style="background-color: lightgrey;">
<div class="left" style="background-color: lightblue;">
<p>left</p>
</div>
<div class="right" style="background-color: lightgreen;">
<p>right</p>
<p>right</p>
</div>
</div>
CSS部分
p{margin: 0;}
.box{display:grid;grid-template-columns:auto 1fr;grid-gap:20px}
利用flex布局
HTML部分
<div class="box">
<div class="left">left</div>
<div class="right">right</div>
</div>
CSS部分
.left,.right{height: 300px;}
.left{width:50%;background-color:blue;}
.right{flex: 1; background-color: red;}
flex布局中默认左起水平排序,并且不换行
效果
参考资料: