布局

  • 普通布局:display:block/inline
  • 浮动布局:float:left/right
  • 定位布局:position:relative/absolute/fixedleft/right/top/bottom/z-index
  • 表格布局:table系列属性
  • 弹性布局:display:flex/inline-flexflex系列属性
  • 多列布局:column系列属性
  • 格栅布局:display:grid/inline-gridgrid系列属性
  • 响应式布局:em/rem/vw/vh/vmin/vmax媒体查询

浮动布局

清除浮动
  1. 利用 clear 样式 ,在父元素标签结束之前插入 块级元素

    clear CSS 属性指定一个元素是否必须移动(清除浮动后)到在它之前的浮动元素下面。clear 属性适用于浮动和非浮动元素。

    1. .clearfix::after {
    2. display: block;
    3. visibility: hidden;
    4. clear: both;
    5. height: 0;
    6. font-size: 0;
    7. content: "";
    8. }
  2. 为父元素添加 overflow 属性 ( 其他方式形成 BFC 也可清除浮动 )

当为父元素添加 overflow 属性时,该元素会构建一个 BFC
BFC在计算高度的时候,内部浮动元素的高度也要计算在内。

全屏布局

经典的全屏布局由顶部、底部、主体三部分组成,其特点为三部分左右满屏拉伸顶部底部高度固定主体高度自适应,主要应用在主体布局。
该布局很常见,也是大部分Web应用主体的主流布局。
通常使用<header><footer><main>三个标签语义化排版,<main>内还可插入<aside>作为侧栏。

  1. <div class="fullscreen-layout">
  2. <header></header>
  3. <main></main>
  4. <footer></footer>
  5. </div>

:::info position + left/right/top/bottom :::

顶部、底部和主体声明left:0right:0将其左右部分满屏拉伸;顶部和底部声明top:0bottom:0分别将其吸顶和吸底,并声明俩高度为固定值;将主体的topbottom分别声明为顶部高度和底部高度。

  1. .fullscreen-layout {
  2. position: relative;
  3. width: 400px;
  4. height: 400px;
  5. header,
  6. footer,
  7. main {
  8. position: absolute;
  9. left: 0;
  10. right: 0;
  11. }
  12. header {
  13. top: 0;
  14. height: 50px;
  15. background-color: #f66;
  16. }
  17. footer {
  18. bottom: 0;
  19. height: 50px;
  20. background-color: #66f;
  21. }
  22. main {
  23. top: 50px;
  24. bottom: 50px;
  25. background-color: #3c9;
  26. }
  27. }

:::info Flex :::

使用flex实现会更简洁。display:flex默认会令子节点横向排列,需声明flex-direction:column改变子节点排列方向为纵向排列;顶部和底部高度固定,所以主体声明flex:1让高度自适应即可。

  1. .fullscreen-layout {
  2. display: flex;
  3. flex-direction: column;
  4. width: 400px;
  5. height: 400px;
  6. header {
  7. height: 50px;
  8. background-color: #f66;
  9. }
  10. footer {
  11. height: 50px;
  12. background-color: #66f;
  13. }
  14. main {
  15. flex: 1;
  16. background-color: #3c9;
  17. }

多列布局

两列布局

经典的两列布局由左右两列组成,其特点为一列宽度固定另一列宽度自适应两列高度固定且相等
以下以左列宽度固定和右列宽度自适应为例,反之同理。

  1. <div class="two-column-layout">
  2. <div class="left"></div>
  3. <div class="right"></div>
  4. </div>

:::info float + margin-left / right ::: 左列声明float:left和固定宽度,由于float使节点脱流,右列需声明margin-left为左列宽度,以保证两列不会重叠。

  1. .two-column-layout {
  2. width: 400px;
  3. height: 400px;
  4. .left {
  5. float: left;
  6. width: 100px;
  7. height: 100%;
  8. background-color: #f66;
  9. }
  10. .right {
  11. margin-left: 100px;
  12. height: 100%;
  13. background-color: #66f;
  14. }
  15. }

:::info overflow + float :::

左列声明同上,右列声明overflow:hidden使其形成BFC区域与外界隔离,详情可见 盒模型

  1. .two-column-layout {
  2. width: 400px;
  3. height: 400px;
  4. .left {
  5. float: left;
  6. width: 100px;
  7. height: 100%;
  8. background-color: #f66;
  9. }
  10. .right {
  11. overflow: hidden;
  12. height: 100%;
  13. background-color: #66f;
  14. }
  15. }

:::info flex ::: 左列声明固定宽度,右列声明flex:1自适应宽度。

  1. .two-column-layout {
  2. display: flex;
  3. width: 400px;
  4. height: 400px;
  5. .left {
  6. width: 100px;
  7. background-color: #f66;
  8. }
  9. .right {
  10. flex: 1;
  11. background-color: #66f;
  12. }
  13. }

点击查看【codepen】

三列布局

经典的三列布局由左中右三列组成,其特点为连续两列宽度固定剩余一列宽度自适应三列高度固定且相等
以下以左中列宽度固定和右列宽度自适应为例,反之同理。

  1. <div class="three-column-layout">
  2. <div class="left"></div>
  3. <div class="center"></div>
  4. <div class="right"></div>
  5. </div>

:::info overflow + float :::

  1. .three-column-layout {
  2. width: 400px;
  3. height: 400px;
  4. .left {
  5. float: left;
  6. width: 50px;
  7. height: 100%;
  8. background-color: #f66;
  9. }
  10. .center {
  11. float: left;
  12. width: 100px;
  13. height: 100%;
  14. background-color: #66f;
  15. }
  16. .right {
  17. overflow: hidden;
  18. height: 100%;
  19. background-color: #3c9;
  20. }
  21. }

:::info flex :::

  1. .three-column-layout {
  2. display: flex;
  3. width: 400px;
  4. height: 400px;
  5. .left {
  6. width: 50px;
  7. background-color: #f66;
  8. }
  9. .center {
  10. width: 100px;
  11. background-color: #66f;
  12. }
  13. .right {
  14. flex: 1;
  15. background-color: #3c9;
  16. }
  17. }

圣杯布局

  • header和footer各自占领屏幕所有宽度,高度固定。
  • 中间的container是一个三栏布局。
  • 三栏布局两侧宽度固定不变,中间部分自动填充整个区域。
  • 中间部分的高度是三栏中最高的区域的高度。
  1. <div class="header"></div>
  2. <div class="container">
  3. <div class="left"></div>
  4. <div class="right"></div>
  5. <div class="center"></div>
  6. </div>
  7. <div class="footer"></div>

:::info float + margin-left/right + padding-left/right ::: 由于浮动节点在位置上不能高于前面或平级的非浮动节点,否则会导致浮动节点下沉。因此在编写HTML结构时,将中间列节点挪到右列节点后面。

  1. .header, .footer{
  2. height: 100px;
  3. }
  4. .header{
  5. background: red;
  6. }
  7. .footer{
  8. background: green;
  9. }
  10. .container{
  11. height: calc(100vh - 200px);
  12. padding: 0 100px;
  13. .left{
  14. height: 100%;
  15. width: 100px;
  16. float: left;
  17. background: blue;
  18. margin-left: -100px;
  19. }
  20. .center{
  21. height: 100%;
  22. background: gray;
  23. }
  24. .right{
  25. height: 100%;
  26. width: 100px;
  27. float: right;
  28. background: blue;
  29. margin-right: -100px;
  30. }
  31. }

:::info float + margin-left/right :::

  1. .container {
  2. width: 400px;
  3. height: 400px;
  4. .left {
  5. float: left;
  6. width: 100px;
  7. height: 100%;
  8. background-color: #f66;
  9. }
  10. .right {
  11. float: right;
  12. width: 100px;
  13. height: 100%;
  14. background-color: #66f;
  15. }
  16. .center {
  17. margin: 0 100px;
  18. height: 100%;
  19. background-color: #3c9;
  20. }
  21. }

:::info flex :::

  1. <div class="container">
  2. <div class="left"></div>
  3. <div class="center"></div>
  4. <div class="right"></div>
  5. </div>
  1. .container {
  2. display: flex;
  3. width: 400px;
  4. height: 400px;
  5. .left {
  6. width: 100px;
  7. background-color: #f66;
  8. }
  9. .center {
  10. flex: 1;
  11. background-color: #3c9;
  12. }
  13. .right {
  14. width: 100px;
  15. background-color: #66f;
  16. }
  17. }

点击查看【codepen】

均分布局

经典的均分布局由多列组成,其特点为每列宽度相等每列高度固定且相等
总体来说,也是最简单的经典布局,由于每列宽度相等,所以很容易找到合适的方式处理。

  1. <div class="average-layout">
  2. <div class="one"></div>
  3. <div class="two"></div>
  4. <div class="three"></div>
  5. <div class="four"></div>
  6. </div>
  1. .one {
  2. background-color: #f66;
  3. }
  4. .two {
  5. background-color: #66f;
  6. }
  7. .three {
  8. background-color: #f90;
  9. }
  10. .four {
  11. background-color: #09f;
  12. }

:::info float + width ::: 每列宽度声明为相等的百分比,若有4列则声明width:25%width:calc(100% / n)

  1. .average-layout {
  2. width: 400px;
  3. height: 400px;
  4. div {
  5. float: left;
  6. width: 25%;
  7. height: 100%;
  8. }
  9. }

:::info column ::: 使用column实现会令CSS代码语义化更明确。column相关属性是为列排版应运而生的,相对flex相关属性来说更易懂易学。

  1. .average-layout {
  2. column-count: 4;
  3. column-gap: 0;
  4. width: 400px;
  5. height: 400px;
  6. div {
  7. height: 100%;
  8. }
  9. }

:::info flex ::: 使用flex实现会更简洁。
节点声明display:flex后,生成的FFC容器里所有子节点的高度都相等,因为容器的align-items默认为stretch,所有子节点将占满整个容器的高度。每列声明flex:1自适应宽度。

  1. .average-layout {
  2. display: flex;
  3. width: 400px;
  4. height: 400px;
  5. div {
  6. flex: 1;
  7. }
  8. }

居中布局

水平居中

  • margin:0 auto + width:fit-content全部元素
  • 块级元素 + margin:0 auto + width块级元素
    • 若节点不是块级元素需声明display:block
    • 若节点宽度已隐式声明则无需显式声明width
  • 行内元素 + text-aligin:center行内元素
    • 父节点上声明text-align
    • 若节点不是行内元素需声明display:inline/inline-block
  • position + left/right + margin-left/right + width全部元素
  • position + left/right + transform:translateX(-50%)全部元素
  • display:flex + justify-content:center全部元素
    • 父节点上声明displayjustify-content

垂直居中

  • 块级元素 + padding-top/bottom块级元素
    • 父节点高度未声明或自适应
    • 若节点不是块级元素需声明display:block
  • 行内元素 + line-height行内元素
    • 父节点上声明line-height
    • 若节点不是行内元素需声明display:inline/inline-block
  • display:table + display:table-cell + vertical-align:middle全部元素
    • 父节点上声明display:table
  • display:table-cell + vertical-align:middle全部元素
    • 父节点上声明displayvertical-align
  • position + top/bottom + margin-top/bottom + height全部元素
  • position + top/bottom + transform:translateY(-50%)全部元素
  • display:flex + align-items:center全部元素
    • 父节点上声明displayalign-items
  • display:flex + margin:auto 0全部元素
    • 父节点上声明display

:::info display:inline-block :::

  1. display: inline-block;
  2. vertical-align: middle;

:::info display:table-cell :::

  1. display: table-cell;
  2. vertical-align: middle;
  3. div {
  4. margin: 0 auto;
  5. }

:::info position ::: 该方式也是最传统最稳定的水平垂直居中布局了,唯二的缺点就是声明属性稍多必须已知宽高。要点是使用margin负值将节点拉回最中间,所以必须已知宽高才能计算margin负值,通常是margin-leftmargin-top,可连写成margin:-(height/2) 0 0 -(width/2)

  1. position: absolute;
  2. left: 50%;
  3. top: 50%;
  4. margin: -50px 0 0 -50px;

不可知高宽时

  1. position: absolute;
  2. left: 50%;
  3. top: 50%;
  4. transform: translate(-50%, -50%);

:::info flex :::

  1. display: flex;
  2. justify-content: center;
  3. align-items: center;
  4. // 或者
  5. display: flex;
  6. div {
  7. margin: auto;
  8. }

文字布局

文字环绕

利用float使节点脱流的原理实现

  1. <div class="text-wrapping">
  2. <img src="https://static.yangzw.vip/codepen/thor.jpg">
  3. XXXXX......(很多个X)
  4. </div>
  1. .text-wrapping {
  2. overflow: hidden;
  3. width: 400px;
  4. height: 300px;
  5. font-size: 20px;
  6. color: #f66;
  7. word-break: break-all;
  8. img {
  9. float: left;
  10. margin: 10px;
  11. height: 200px;
  12. }
  13. }

文字溢出**

:::info 单行文字溢出overflow + text-overflow :::

  1. .s-ellipsis {
  2. overflow: hidden;
  3. text-overflow: ellipsis;
  4. white-space: nowrap;
  5. }

:::info 多行文字溢出 webkit-box + overflow + text-overflow :::

  1. .m-ellipsis {
  2. display: -webkit-box;
  3. overflow: hidden;
  4. text-overflow: ellipsis;
  5. word-break: break-all;
  6. -webkit-box-orient: vertical;
  7. -webkit-line-clamp: 3;
  8. }