网页基本结构:
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="renderer" content="webkit"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>左侧固定,右侧自适应布局</title> <style type="text/css"> </style> </head> <body> <div class="wrapper"> <div class="left">左侧左侧左侧左侧左侧左侧左侧左侧左侧左侧左侧左侧左侧左侧</div> <div class="right">右侧右侧右侧右侧右侧右侧右侧右侧右侧右侧右侧右侧右侧右侧</div> </div> </body> </html>
1、float+bfc,缺点:父元素需要清除浮动,否则高度计算不会包括浮动元素。
/* 清除浮动 */ .wrapper::before, .wrapper::after { display: table; content: ''; clear: both; } /* 左侧浮动 */ .left { width: 100px; float: left; } /* 右侧触发bfc */ .right { overflow: hidden; }
2、float + margin-left,缺点也是父元素需要清除浮动,否则高度计算不会包括浮动元素。
/* 清除浮动 */ .wrapper::before, .wrapper::after { display: table; content: ''; clear: both; } /* 左侧浮动 */ .left { width: 100px; float: left; } /* 右侧使用margin-left撑开位置 */ .right { margin-left: 100px; }
3、inline-block+calc,缺点:父元素需要设置font-size: 0;来清除默认间距,子元素要设置vertical-align: top;来使顶部对齐。
/* 清除默认间距 */ .wrapper { font-size: 0; } .left, .right { display: inline-block; vertical-align: top; /* 顶部对齐 */ font-size: 16px; } /* 左侧固定宽度 */ .left { width: 100px; } /* 右侧计算宽度 */ .right { width: calc(100% - 100px); }
4、table-cell
/* 父元素设置为table */ .wrapper { display: table; } /* 子元素设置为table-cell */ .left, .right { display: table-cell; } /* 左侧固定宽度 */ .left { width: 100px; }
5、flex,缺点:低版本IE不支持
/* 父元素设置为flex */ .wrapper { display: flex; } /* 左侧固定宽度 */ .left { width: 100px; } /* 右侧设置flex: 1; */ .right { flex: 1; }
6、grid,缺点:可能有兼容性问题。
.wrapper { display: grid; grid-template-columns: 100px 1fr }