布局
描述
-
表示对页面中的显示效果进行一些排列
- 水平方向居中
- 垂直方向居中
- 居中布局
水平方向居中
第一种方式
- 水平居中 + 行内块级元素(text-align: center + display: inline-block)
<head><meta charset="UTF-8"><title>水平居中的第一种方法</title><style>/*text-align: center + display: inline-block* 该方法需作用在父子结构中* 为父级设置text-align属性、为子级设置display属性注意的问题:* text-align属性* 是设置文本内容对齐方式的,又是继承属性,会连后代元素一同设置* display属性* 要实现水平居中就得改变元素类型为行内块级,也会有行内块级本身的一些问题*/#d1 {height: 200px;background-color: red;/* 为父级设置text-align属性 */text-align: center;}#d2 {width: 200px;height: 200px;background-color: green;/* 为子级设置display属性 */display: inline-block;}</style>
</head>
<body>
<div id="d1"><div id="d2"></div>
</div>
</body>
第二种方式
- 外边距特性(margin: 0 auto)
<head><meta charset="UTF-8"><title>水平居中的第二种方式</title><style>/*margin: 0 auto* 可以利用外边距的特性实现水平居中* display属性的属性值只能是block或table*/#d1 {width: 100%;height: 200px;background-color: red;}#d2 {width: 200px;height: 200px;background-color: green;/* 设置display属性的属性值为 block 或 table */display: block;/* 利用外边距实现水平居中 */margin: 0 auto;}</style>
</head>
<body>
<div id="d1"><div id="d2"></div>
</div>
</body>
第三种方式
- 定位(position属性 + transform属性)
<head><meta charset="UTF-8"><title>水平居中的第三种方式</title><style>/*position属性 + transform属性* 可以使用定位属性实现水平居中* 在使用绝对定位时,注意目标元素的父级元素也要开启定位* 也可以使用相对定位,相对定位是相对于自身做定位,父级元素可以不用开启定位*/#d1 {width: 100%;height: 200px;background-color: red;/* 父级开启定位 - 配合子级开启绝对定位 */position: relative;}/* 绝对定位的方法 */#d2 {width: 200px;height: 200px;background-color: green;/* 开启绝对定位实现水平居中 */position: absolute;left: 50%;/* transform属性 - 用于调整元素的显示位置 */transform: translateX(-50%);}/* 相对定位的方法 */#d3 {width: 200px;height: 200px;background-color: blue;/* 开启相对定位实现水平居中 */position: relative;left: 50%;/* transform属性 - 用于调整元素的显示位置 */transform: translateX(-50%);}</style>
</head>
<body>
<div id="d1"><div id="d2"></div>
</div>
<div id="d3"></div>
</body>
垂直方向居中
第一种方式
- 定义元素类型 + 垂直居中(display: table-cell + vertical-align: middle)
<head><meta charset="UTF-8"><title>垂直居中的第一种方式</title><style>/*display: table-cell + vertical-align: middle* 该方法只能使用在目标元素的父级元素上* display: table-cell - 将元素是定义为表格中的单元格* vertical-align: middle - 设置垂直居中*/#d1 {width: 200px;height: 800px;background-color: red;/* 将目标元素定义为单元格 */display: table-cell;/* 设置垂直居中 */vertical-align: middle;}#d2 {width: 200px;height: 200px;background-color: green;}</style>
</head>
<body>
<div id="d1"><div id="d2"></div>
</div>
</body>
第二种方式
- 定位(position属性 + transform属性)
<head><meta charset="UTF-8"><title>垂直居中的第二种方式</title><style>/*position属性 + transform属性* 可以使用定位属性实现垂直居中* 在使用绝对定位时,注意目标元素的父级元素也要开启定位* 也可以使用相对定位,相对定位是相对于自身做定位,父级元素可以不用开启定位*/#d1 {width: 200px;height: 800px;background-color: red;/* 父级开启定位 - 配合子级开启绝对定位 */position: relative;}/* 绝对定位的方法 */#d2 {width: 200px;height: 200px;background-color: green;/* 开启绝对定位实现垂直居中 */position: absolute;left: 50%;/* transform属性 - 用于调整元素的显示位置 */transform: translateY(-50%);}/* 相对定位的方法 */#d3 {width: 200px;height: 200px;background-color: blue;/* 开启相对定位实现垂直居中 */position: relative;left: 50%;/* transform属性 - 用于调整元素的显示位置 */transform: translateY(-50%);}</style>
</head>
<body>
<div id="d1"><div id="d2"></div>
</div>
<div id="d3"></div>
</body>
居中布局
- 表示水平方向和垂直方向同时居中
第一种方式
- 水平方向 - 外边距(margin: 0 auto)
- 垂直方向 - 定义元素类型 + 垂直居中(display: table-cell + vertical-align: middle)
<head><meta charset="UTF-8"><title>居中布局的第一种方式</title><style>/*居中布局 - 表示水平方向和垂直方向同时居中* 水平方向 - margin: 0 auto* 垂直方向 - display: table-cell + vertical-align: middle*/#d1 {width: 800px;height: 600px;background-color: lightgray;/* 父级元素设置垂直居中 */display: table-cell;vertical-align: middle;}#d2 {width: 200px;height: 200px;background-color: lightcoral;/* 子级元素设置水平居中 */display: table;margin: 0 auto;}</style>
</head>
<body>
<div id="d1"><div id="d2"></div>
</div>
</body>
第二种方式
- 定位(position属性 + transform属性)
<head><meta charset="UTF-8"><title>居中布局的第二种方式</title><style>/*position属性 + transform属性* 可以使用定位属性实现居中布局的效果* 在使用绝对定位时,注意目标元素的父级元素也要开启定位* 也可以使用相对定位,相对定位是相对于自身做定位,父级元素可以不用开启定位*/#d1 {width: 800px;height: 800px;background-color: red;/* 开启定位 - 配合子级元素开启绝对定位 */position: relative;}#d2 {width: 200px;height: 200px;background-color: green;/* 开启绝对定位实现居中布局效果 */position: absolute;left: 50%;top: 50%;/* 调整元素的显示位置 */transform: translate(-50%, -50%);}/* 相对定位的方式 */#d3 {width: 200px;height: 200px;background-color: blue;/* 开启相对定位实现居中布局的效果 */position: relative;left: 50%;top: 50%;/* 调整元素的显示位置 */transform: translate(-50%, -50%);}</style>
</head>
<body>
<div id="d1"><div id="d2"></div>
</div>
<div id="d3"></div>
</body>
两列布局
- 表示水平排列的元素布局方式
第一种方式
- 浮动 + 外边距
<head><meta charset="UTF-8"><title>第一种两列布局</title><style>/*两列布局 - 表示水平排列的元素布局方式* 一列定宽,一列自适应* 浮动 + 外边距*/div {height: 300px;}.d1 {/* 设置定宽 */width: 300px;background-color: red;/* 设置浮动 */float: left;}.d2 {width: 100%;background-color: green;/*使用外边距调整显示位置* 调整的距离等于定宽的宽度*/margin-left: 300px;}</style>
</head>
<body>
<div class="d1"></div>
<div class="d2"></div>
</body>
第二种方式
- 通过浮动 + 外边距 + 父级容器实现两列布局
<head><meta charset="UTF-8"><title>第二种两列布局</title><style>/*通过浮动 + 外边距 + 父级容器实现两列布局* 为自适应的列添加父级容器* 通过外边距调整位置让元素显示在一列中(调整的数值为等于定宽的宽度)*/.d1, .d2 {height: 300px;}.d1 {/* 定宽 */width: 300px;background-color: red;float: left;/* 开启定位 - 用于提高优先层次 */position: relative;}.rongqi {background-color: blue;float: right;/* 设置浮动后的宽度 */width: 100%;/* 通过外边距控制当前元素的显示位置 */margin-left: -300px;}.d2 {background-color: green;margin-left: 300px;}</style>
</head>
<body>
<div class="d1"></div>
<div class="rongqi"><div class="d2"></div>
</div>
</body>
第三种方式
- 浮动 + BFC模式
<head><meta charset="UTF-8"><title>第三种两列布局</title><style>/*第三种两列布局* 浮动 + BFC模式*/div {height: 300px;}.d1 {/* 设置定宽 */width: 300px;background-color: red;/* 设置浮动 */float: left;}.d2 {background-color: green;/* 开启BFC模式 - 解决浮动后的堆叠显示问题 */overflow: hidden;}</style>
</head>
<body>
<div class="d1"></div>
<div class="d2"></div>
</body>
第四种方式
- 通过display属性实现两列布局
<head><meta charset="UTF-8"><title>第四种两列布局</title><style>/*通过display属性实现两列布局* 将指定元素定义为表格中的单元格* 将指定元素的父级元素定义为表格* 通过表格特性实现两列不急*/.rongqi {/* 通过display属性定义为表格 */display: table;table-layout: fixed;width: 100%;}.d1, .d2 {height: 300px;/* 通过display属性定义为表格中的单元格 */display: table-cell;}.d1 {/* 定宽 */width: 300px;background-color: red;}/* 由于表格中的单元格的特性,自适应的宽度会自行分配 */.d2 {background-color: green;}</style>
</head>
<body>
<div class="rongqi"><div class="d1"></div><div class="d2"></div>
</div>
</body>
三列布局
- 右边自适应三列布局
- 中间自适应三列布局
右边自适应三列布局
- 在两列布局的基础上在加上一列定宽
- 可以按照两列布局的方式来实现
<head><meta charset="UTF-8"><title>三列布局 - 右自适应</title><style>/*右自适应的三列布局* 可以按照两列布局的方式来实现*/body {margin: 0;}div {height: 300px;}.left {/* 设置浮动 - 让元素在一行中显示 */float: left;/* 设置定宽 */width: 200px;background-color: red;}.center {/* 设置浮动 - 让元素在一行中显示 */float: left;/* 设置定宽 */width: 200px;background-color: green;}.right {background-color: blue;/* 设置外边距 - 调整覆盖问题,调整的距离为两列定宽的宽度之和 */margin-left: 400px;}</style>
</head>
<body>
<div class="left"></div>
<div class="center"></div>
<div class="right"></div>
</body>
中间自适应三列布局
第一种方式
- 改变HTML代码顺序结构
<head><meta charset="UTF-8"><title>三列布局 - 中间自适应</title><style>/*中间自适应的三列布局 - 第一种方式* 由于浮动的问题右侧定宽的元素无法和其他元素显示在一行中* 可以通过改变HTML代码顺序结构来解决* 在对中间自适应的列进行压缩,解决覆盖问题*/body {margin: 0;}div {height: 400px;}.left {/* 设置浮动 - 让元素显示在一行 */float: left;/* 设置定宽 */width: 200px;background-color: red;}.center {background-color: blue;/* 设置外边距 - 解决覆盖问题 */margin: 0 200px 0;}.right {/* 设置浮动 - 让元素显示在一行 */float: right;/* 设置定宽 */width: 200px;background-color: green;}</style>
</head>
<body>
<div class="left"></div>
<!-- 改变HTML代码顺序结构 -->
<div class="right"></div>
<div class="center"></div>
</body>
第二种方式
- 为中间自适应的区域添加子级,解决覆盖问题
<head><meta charset="UTF-8"><title>三列布局 - 中间自适应</title><style>/*中间自适应的三列布局 - 第二种方式* 为中间自适应的区域添加子级* 调整子级的显示区域,解决覆盖问题* 对三列设置浮动,利用外边距调整位置使其显示在一行中*/body {margin: 0;}div {height: 400px;}.left {/* 设置浮动 - 让元素显示在一行 */float: left;/* 设置定宽 */width: 200px;/* 开启定位 - 用于提高覆盖后的显示层级 */position: relative;background-color: red;}.center {background-color: blue;/* 设置浮动 - 用于让后面的下一个元素可以显示在同一行 */float: left;/* 设置宽度 - 自适应不能是定宽 */width: 100%;/* 利用外边距移动元素,使其在一行中显示 */margin-left: -200px;}.right {/* 设置浮动 - 让元素显示在一行 */float: left;/* 设置定宽 */width: 200px;/* 利用外边距移动元素,使其在一行中显示 */margin-left: -200px;background-color: green;}.neirong {/* 设置外边距压缩元素,解决覆盖问题 */margin: 0 200px 0;background-color: yellow;}</style>
</head>
<body>
<div class="left"></div>
<div class="center"><!-- 通过子级解决覆盖问题 --><div class="neirong"></div>
</div>
<div class="right"></div>
</body>
第三种方式
- 简易圣杯布局
<head><meta charset="UTF-8"><title>三列布局 - 中间自适应</title><style>/*中间自适应的三列布局 - 第三种方式* 圣杯布局* 添加整体容器* 通过设置内边距挤压出两边定宽的区域* 在通过定位将定宽的两列移动到指定区域,解决覆盖问题*/* {box-sizing: border-box;}body {margin: 0;}.rongqi {/* 设置内边距 - 挤压出两侧定宽的显示区域 */padding: 0 200px 0;}.rongqi > div {height: 400px;}.left {/* 设置浮动 - 让元素显示在一行 */float: left;/* 设置定宽 */width: 200px;/* 通过定位将元素移动到指定区域解决覆盖问题 */position: relative;left: -200px;background-color: red;}.center {background-color: blue;/* 设置浮动 - 用于让后面的下一个元素可以显示在同一行 */float: left;/* 设置宽度 - 自适应不能是定宽 */width: 100%;/* 利用外边距移动元素,使其在一行中显示 */margin-left: -200px;}.right {/* 设置浮动 - 让元素显示在一行 */float: left;/* 设置定宽 */width: 200px;/* 利用外边距移动元素,使其在一行中显示 */margin-left: -200px;/* 通过定位将元素移动到指定区域解决覆盖问题 */position: relative;right: -200px;background-color: green;}</style>
</head>
<body>
<!-- 添加整体容器 -->
<div class="rongqi"><div class="left"></div><div class="center"></div><div class="right"></div>
</div>
</body>
第四种方式
- 简易双飞翼布局
<head><meta charset="UTF-8"><title>三列布局 - 中间自适应</title><style>/*中间自适应的三列布局 - 第四种方式* 双飞翼布局* 改变HTML代码顺序结构* 为中间自适应的区域添加子级* 调整子级的显示区域,解决覆盖问题* 对三列设置浮动,利用外边距调整位置使其显示在一行中*/body {margin: 0;}div {height: 400px;}.left {/* 设置浮动 - 让元素显示在一行 */float: left;/* 设置定宽 */width: 200px;/* 利用外边距移动元素,使其在一行中显示 */margin-left: -100%;background-color: red;}.center {background-color: blue;/* 设置浮动 - 用于让后面的下一个元素可以显示在同一行 */float: left;/* 设置宽度 - 自适应不能是定宽 */width: 100%;}.right {/* 设置浮动 - 让元素显示在一行 */float: left;/* 设置定宽 */width: 200px;/* 利用外边距移动元素,使其在一行中显示 */margin-left: -200px;background-color: green;}.neirong {/* 设置外边距压缩元素,解决覆盖问题 */margin: 0 200px 0;background-color: yellow;}</style>
</head>
<body>
<!-- 改变HTML代码顺序结构 - 便于浏览器搜索抓取 -->
<div class="center"><!-- 通过子级解决覆盖问题 --><div class="neirong"></div>
</div>
<div class="left"></div>
<div class="right"></div>
</body>
定分布局
-
表示子级元素平均分配父级元素的宽度
- 没有间隙的等分布局
- 有间隙的等分布局
没有间隙的等分布局
通过百分比来设置
<head><meta charset="UTF-8"><title>等分布局</title><style>/*等分布局 - 表示子级元素平均分配父级元素的宽度* 通过百分比来设置* 用父级元素的宽度(100%)除以子级元素的个数,得到每个子级元素所占的百分比宽度值*/body {margin: 0;}div {/* 设置浮动 - 让元素水平排列 */float: left;/* 设置百分比宽度值会自行等分在父级元素中的所占区域 */width: 25%;height: 400px;}.d1 {background-color: red;}.d2 {background-color: green;}.d3 {background-color: blue;}.d4 {background-color: yellow;}</style>
</head>
<body>
<div class="d1"></div>
<div class="d2"></div>
<div class="d3"></div>
<div class="d4"></div>
</body>
通过display属性来实现等分布局
<head><meta charset="UTF-8"><title>等分布局</title><style>/*等分布局 - 表示子级元素平均分配父级元素的宽度* 通过display属性来实现等分布局* 为指定元素添加父级元素,并通过display属性将其定义为表格(table属性值)* 通过display属性将指定元素定义为表格中的单元格(table-cell属性值)* 通过表格的特性实现等分布局*/body {margin: 0;}.table {/* 将该元素定义为表格 */display: table;/* 设置宽度 - 没有宽度表格没有显示 */width: 100%;}.table > div {/*将该元素定义为单元格* 不需要设置单元格的宽度,通过表格的特性,会自行等分表格的宽度*/display: table-cell;height: 400px;}.d1 {background-color: red;}.d2 {background-color: green;}.d3 {background-color: blue;}.d4 {background-color: yellow;}</style>
</head>
<body>
<!-- 添加容器 - 定义为表格 -->
<div class="table"><!-- 再将指定元素定义为表格中的单元格 --><div class="d1"></div><div class="d2"></div><div class="d3"></div><div class="d4"></div>
</div>
</body>
有间隙的等分布局
添加容器 + 外边距 + overflow属性
<head><meta charset="UTF-8"><title>等分布局 - 有间距</title><style>/*有间距的等分布局 - 第一种方式* 为指定元素添加整体容器,并在整体容器之上添加可视容器* 整体容器的宽度等于 指定元素的宽度之和 加上 指定元素的外边距之和* 可视容器的宽度等于 指定元素的宽度之和 加上 指定元素的外边距之和减一(一个元素的外边距)* 通过对可视容器设置overflow属性来去除对出的外边距*/body {margin: 0;}.keshi {/* 设置可视容器的宽度 - 四个指定元素的宽度 + 三个指定元素的外边距 */width: 1260px;/*用解决内容溢出的方式去除第四的外边距同时解决由于子级设置浮动引出的高度塌陷问题*/overflow: hidden;border: 1px solid blueviolet;}.keshi > .rongqi {/* 设置整体容器宽度 - 四个指定元素的宽度 + 四个指定元素的外边距 */width: 1280px;/* 设置高度解决高度塌陷 *//*height: 400px;*//* 通过设置浮动开启BFC模式,解决高度塌陷 */float: left;background-color: #ff6700;}.keshi > .rongqi > div {/* 设置浮动 - 让元素水平排列显示 */float: left;width: 300px;height: 400px;/* 通过外边距设置元素间的间隙 */margin-right: 20px;}.d1 {background-color: red;}.d2 {background-color: green;}.d3 {background-color: blue;}.d4 {background-color: yellow;}</style>
</head>
<body>
<!-- 添加可视容器 -->
<div class="keshi"><!-- 添加整体容器 --><div class="rongqi"><div class="d1"></div><div class="d2"></div><div class="d3"></div><div class="d4"></div></div>
</div>
</body>
添加容器 + 外边距 + 定位
<head><meta charset="UTF-8"><title>等分布局 - 有间距</title><style>/*有间距的等分布局 - 第二种方式* 为指定元素添加整体容器,并在整体容器之上添加可视容器* 整体容器的宽度等于 指定元素的宽度之和 加上 指定元素的外边距之和* 可视容器的宽度等于 指定元素的宽度之和 加上 指定元素的外边距之和减一(一个元素的外边距)* 对整体容器开启定位,通过调整定位的显示位置来去除多余的外边距*/body {margin: 0;}.keshi {/* 设置可视容器的宽度 - 四个指定元素的宽度 + 三个指定元素的外边距 */width: 1260px;border: 1px solid blueviolet;}.keshi > .rongqi {/* 设置整体容器宽度 - 四个指定元素的宽度 + 四个指定元素的外边距 */width: 1280px;/* 开启BFC模式解决高度塌陷 */overflow: hidden;/* 开启相对定位 */position: relative;/* 定位的距离等于外边距的数值 */left: -20px;background-color: #ff6700;}.keshi > .rongqi > div {/* 设置浮动 - 让元素水平排列显示 */float: left;width: 300px;height: 400px;/* 通过外边距设置元素间的间隙 */margin-left: 20px;}.d1 {background-color: red;}.d2 {background-color: green;}.d3 {background-color: blue;}.d4 {background-color: yellow;}</style>
</head>
<body>
<!-- 添加可视容器 -->
<div class="keshi"><!-- 添加整体容器 --><div class="rongqi"><div class="d1"></div><div class="d2"></div><div class="d3"></div><div class="d4"></div></div>
</div>
</body>
等高布局
-
等高布局 - 表示在一行中的元素拥有相同的高度
- 简单粗暴的方式 - 直接设置统一高度
- 通过display属性设置等高布局
- 通过设置 内、外边距 进行挤压实现伪等高
通过display属性设置等高布局
- 为指定元素添加整体容器,并且设置display属性,定义为表格(table属性值)
- 为指定元素设置display属性,定义为表格中的单元格(table-cell属性值)
- 通过表格的特性实现等高布局
<head><meta charset="UTF-8"><title>等高布局</title><style>/*等高布局 - 表示在一行中的元素拥有相同的高度* 简单粗暴的方式 - 直接设置统一高度* 通过display属性设置等高布局* 为指定元素添加整体容器,并且设置display属性,定义为表格(table属性值)* 为指定元素设置display属性,定义为表格中的单元格(table-cell属性值)* 通过表格的特性实现等高布局*/body {margin: 0;}.rongqi {/* 将整体容器定义为表格 */display: table;}.rongqi > div {/* 将指定元素定义为单元格 */display: table-cell;width: 300px;}.left {background-color: red;}.right {background-color: green;}</style>
</head>
<body>
<!-- 添加整体容器 - 将容器定义为表格 -->
<div class="rongqi"><!-- 将指定元素定义为单元格 --><div class="left">我是谁、我在那、我要干啥</div><div class="right">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Accusamus ad amet blanditiis cum enim inventore iure nihil odit, optio porro quasi reiciendis similique sit tempora voluptate voluptates voluptatibus. Amet, iure!</div>
</div>
</body>
通过设置 内、外边距 进行挤压实现伪等高
- 为指定元素设置下内边距,向下拉伸
- 为指定元素设置下外边距(负值),向上挤压
- 为整体容器设置overflow属性,隐藏多余的部分实现伪等高布局
<head><meta charset="UTF-8"><title>等高布局</title><style>/*等高布局 - 表示在一行中的元素拥有相同的高度* 通过设置 内、外边距 进行挤压实现伪等高* 为指定元素设置下内边距,向下拉伸* 为指定元素设置下外边距(负值),向上挤压* 为整体容器设置overflow属性,隐藏多余的部分实现伪等高布局*/body {margin: 0;}.rongqi {width: 600px;/* 解决内容溢出 - 实现伪等高 */overflow: hidden;}.rongqi > div {float: left;width: 300px;/* 设置下内边距 */padding-bottom: 999px;/* 设置下外边距 */margin-bottom: -999px;}.left {background-color: red;}.right {background-color: green;}</style>
</head>
<body>
<!-- 添加整体容器 -->
<div class="rongqi"><div class="left">我是谁、我在那、我要干啥</div><div class="right">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Accusamus ad amet blanditiis cum enim inventore iure nihil odit, optio porro quasi reiciendis similique sit tempora voluptate voluptates voluptatibus. Amet, iure!</div>
</div>
</body>
全局布局
-
表示对整个页面进行布局
- 可以通过固定定位来实现
<head><meta charset="UTF-8"><title>全屏布局</title><style>/*全局布局 - 表示对整个页面进行布局* 可以通过固定定位来实现* 当偏移量的left和right的属性值都为 0 时,可以不设置宽度* 设置高度为百分值时,相对父级不能是页面*/body {margin: 0;}header {/* 设置定高 */height: 100px;/* 设置固定定位 - 将顶部内容固定在页面顶部 */position: fixed;left: 0;top: 0;right: 0;background-color: #c9c9c9;}main {/* 设置固定定位 - 通过固定定位实现主体内容自适应 */position: fixed;left: 0;top: 100px;right: 0;bottom: 100px;overflow: auto;background-color: #00c3f5;}main > .left {/* 设置定宽 */width: 300px;height: 100%;position: fixed;background-color: #6fc749;}main > .right {height: 1000px;/* 通过外边距解决覆盖问题 */margin-left: 300px;background-color: yellow;}footer {height: 100px;/* 设置固定定位 - 将底部内容固定在页面底部 */position: fixed;left: 0;bottom: 0;right: 0;background-color: #666666;}</style>
</head>
<body>
<!-- 页面顶部 -->
<header></header>
<!-- 页面主体 -->
<main><div class="left"></div><div class="right"></div>
</main>
<!-- 页面底部 -->
<footer></footer>
</body>