- A+
CSS中常见布局方式有哪些?下面本篇文章就来给大家介绍一下CSS中的常见布局方式,希望对大家有所帮助。
在介绍CSS布局方式之前我先简单说明一下html中的三种布局方式:
- 流动布局(默认)
- 浮动布局(float)
- 定位布局(position)
好了,这里就不详细介绍这三种布局了,今天我们的重头戏是探索CSS中常见的布局方式有哪些?
一、单列布局
常见的单列布局有两种:
- header,content 和 footer 等宽的单列布局
- header 与 footer 等宽,content 略窄的单列布局
实现第一种方式很简单,可以将 header
, content
, footer
统一设置相等宽度,然后设置 margin:auto
即可实现居中:
<!-- html代码 --> <p class="header"></p> <p class="content"></p> <p class="footer"></p> <!-- css代码 --> .header{ margin:0 auto; max-width: 960px; height:100px; } .content{ margin: 0 auto; max-width: 960px; height: 400px; } .footer{ margin: 0 auto; max-width: 960px; height: 100px; }
对于第二种,header
和 footer
可以不用设置宽度,让其充满整个屏幕(默认100%),只需将三者的内容设置同一个 width
,然后在通过 margin:auto
让其内容居中
二、两列自适应布局
两列自适应布局是指一列由内容撑开,另一列撑满剩余宽度的布局方式
实现方式:
- float+overflow:hidden
- Flex 布局
- Grid 布局
1. float+overflow:hidden
实现原理:通过设置 overflow
触发 BFC
,而 BFC
不会重叠浮动元素
<div class="container"> <div class="left">left</div> <div class="right">right</div> </div> <style> .container{ /* 触发BFC格局 */ overflow: hidden; /* 兼容IE6-浏览器 */ zoom: 1; } .left{ float: left; background-color: blue; } .right{ overflow: hidden; zoom: 1; background-color: pink; } </style>
注意:上述代码是左侧栏固定,右侧自适应。
2. Flex 布局
Flex 是 Flexible Box 的缩写,意为"弹性布局",用来为盒状模型提供最大的灵活性。任何一个容器都可以指定为 Flex 布局
Flex 布局是2009年W3C提出了一种新布局方案,在现在也得以广泛使用,特别是移动端最优!
Flex 可以简便、完整、响应式地实现各种页面布局
详细了解 Flex
布局请点击:Flex布局
/* html同上 */ .container{ display: flex; } .right{ flex: 1; }
只需两行代码即可完成两列自适应布局,是不是很香~
3.Grid 布局
Grid
布局,是一个基于网格的二维布局系统,目的是用来优化用户界面设计。
详细了解Grid
布局请点击:Grid布局
/* html同上 */ .container{ display: grid; grid-template-columns: auto 1fr; grid-gap: 20px; }
三、三栏布局
特征:中间列自适应宽度,旁边两侧固定宽度,实现三栏布局有多种方式:
1.浮动布局
这种布局方式,dom 结构必须是先写浮动部分,然后再中间块,否则右浮动块会掉到下一行。
浮动布局的优点就是比较简单,兼容性也比较好。但浮动布局是有局限性的,浮动元素脱离文档流,要做清除浮动,这个处理不好的话,会带来很多问题,比如父容器高度塌陷等。
HTML代码:
<div class="main"> <div class="left">左</div> <div class="right">右</div> <div class="center">中 <h2>浮动布局</h2> </div> </div>
CSS代码:
/* 清除所有标签默认样式 */ *{ margin: 0; padding: 0; } .left{ float: left; width: 300px; height: 100px; background: pink; } .right{ float: right; width: 300px; height: 100px; background: red; } .center{ margin-left: 300px; margin-right: 300px; background-color: lightblue; }
效果图:
在这里给 .center
类设置左右外边距是因为两侧的浮动元素占300像素,不设置外边距中间内容多就会出现如下情况:
在前面也说了,浮动实现的三栏布局会使元素脱离文档流,所以为了不影响其他元素的显示需要清除浮动:
.main::after{ content:''; display: block; clear: both; }
2.绝对定位布局
HTML代码:
<div class="main"> <div class="left">左</div> <div class="center">中 绝对定位布局 </div> <div class="right">右</div> </div>
CSS代码:
*{ margin: 0; padding: 0; } .main{ position: relative; } .left{ position: absolute; left: 0; width: 300px; background-color: red; } .center{ position: absolute; left: 300px; right: 300px; background-color: blue; } .right{ position: absolute; right: 0; width: 300px; background-color: pink; }
在这里,由于 absolute
是相当于 static
定位以外的第一个父元素进行定位,所以我们要给其父元素添加 position:relative
属性
绝对定位布局优点就是快捷,设置很方便,而且也不容易出问题。
缺点就是,容器脱离了文档流,后代元素也脱离了文档流,高度未知的时候,会有问题,这就导致了这种方法的有效性和可使用性是比较差的。
3.表格布局
table是一种常见的布局方式,他可以将整个页面按照表格的方式设置为多行多列,但是由于书写table标签比较麻烦尤其是涉及到table内嵌table的时候,所以CSS给我们提供了 display:table
的方式可以让我们方便的使用table布局, 设置子元素为列的属性为 display:table-cell
.main{ width: 100%; display: table; } .left,.center,.right{ display: table-cell; } .left{ width: 300px; background-color: red; } .center{ background-color: green; } .right{ width: 300px; background-color: pink; }
表格布局的兼容性很好,在 flex 布局不兼容的时候,可以尝试表格布局。
同样,不是谁都是完美的,表格布局也存在一定的缺陷:
- 无法设置栏边距
- 对
seo
不友好 - 当其中一个单元格高度超出的时候,两侧的单元格也是会跟着一起变高的
4.弹性布局
这里弹性(flex)布局就不再过多解释,感兴趣的小伙伴可以查看阮一峰大佬的详细教程:Flex布局
.main { display: flex; } .left{ width: 400px; background-color: red; } .center{ background-color: pink; flex: 1; } .right{ background-color: green; width: 400px; }
flexbox 布局是比较完美的一个三栏布局方案,flexbox 的缺点就是 IE10 开始支持,但是 IE10 的是-ms 形式的
5.网格布局
同样,网格(grid)布局也不再详细介绍,感兴趣的小伙伴请查看:Grid布局
将属性 display
值设为 grid
或 inline-grid
就创建了一个网格容器,所有容器直接子结点自动成为网格项目。
gird提供了 gird-template-columns、grid-template-rows属性让我们设置行和列的高、宽
div{ display: grid; width: 100%; grid-template-columns: 300px auto 300px; grid-template-rows: 150px; }
注意:网格布局的兼容性不好。IE10+上支持,而且也仅支持部分属性。
以上就是CSS中常见的布局方式了,几种方式各有各的优点和缺点,没有一个方法可以说是完美的,可以按照实际情况来选择使用!?????