CSS 多种布局方式

article/2025/11/5 13:22:26

​css布局是工作中最常碰到的,同时也是笔试 or 面试中会被问到的问题,故在本文整理了css多种布局方式,以供参考。

此篇较长四千五百字左右,读者可分三部分阅读,水平居中布局,垂直居中布局,水平居中对齐。

水平居中布局

水平居中布局,指当前元素在父级元素中的水平方向上是居中,如:

实现水平居中的方法有很多,我们一个一个来看。

1、inline-block + text-align

  • 设置子元素为一个 inline-block 元素

  • 设置父元素 text-align: center;  

代码如下:

<div id="parent">  <div id="children"></div></div>
#parent {  width: 300px;  height: 200px;  background-color: aquamarine; /*海蓝色*/    text-align: center;}#children {  width: 100px;  height: 100px;  background-color: pink; /*粉色*/    display: inline-block;}

解读:  

1、给父元素设置 text-align: center; 是何用意?

css 属性 text-align 的作用是定义行内内容(例如 文字)如何相对于它的块父元素对齐。

text-align 的值有很多,最常用的:

  • left 左对齐

  • right 右对齐

  • center 居中对齐

所以,通过text-align: center;,就可以让内部的行内子元素居中对齐了。

注意⚠️:text-align 并不控制块元素自己的对齐,而是只控制它的行内内容的对齐。

拓展阅读:text-align。

2、给子元素设置 display: inline-block; 是何用意?

通过第一步,我们了解了,要想子元素居中,该元素就需要是一个行内元素,但是子元素children 是一个div 块级元素,所以我们就需要把它变为行内元素,变为行内元素很简单,设置display: inline; 即可,但是从css中我们可以看到,该元素设置了width & height,inline 行内元素设置宽度和高度是不生效的,所以,我们就必须设置 display: inline-block; 将其变为行内块元素,结合行内元素和块级元素的特点,既能设置宽高,又为一个行内元素,此时居中效果就生效了。

拓展阅读:inline、block、inline-block。

优点: 

浏览器兼容性好。

由于text-align:center; 和 display: inline-block 都为css2中的内容,老版本的浏览器对于CSS2的支持是很友好的。

缺点: 

text-align 具有继承性,会导致子元素中的文本也是居中显示的。

如下,在子元素中添加文本:

<div id="parent">  <div id="children">文本</div></div>

效果:

会看到,文本内容自动水平居中了。

如果不想要文本水平居中的效果该怎么办?如想要文本左对齐,那么就需要在子元素中设置text-align: left; 了。

2、margin + block

  • 设置子元素的margin margin: 0 auto;

  • 设置子元素为一个 block 元素

代码如下:

<div id="parent">  <div id="children"></div></div>
#parent {  width: 300px;  height: 200px;  background-color: aquamarine;}#children {  width: 100px;  height: 100px;  background-color: pink;  margin: 0 auto;  display: block;}

解读: 

1、给子元素设置 margin: 0 auto; 是何用意?

margin是一个简写属性,当给一个元素设置 margin: 0 auto; 时,设置的其实是:

  • margin-top 为 0

  • margin-right 为 auto

  • margin-bottom 为 0

  • margin-left 为 auto

如果两侧均为auto的话,则平分剩余空间,那么设置左右为auto后,元素自然而然就水平居中了。

2、为何需要给子元素设置 display: block; ?

阅读了第一条的解释后,有些同学可能会很迷惑,设置 margin: 0 auto; 就可以将元素设置为居中对齐了,为什么还要再次设置 diaplay: block; 呢?

是这样的,当元素的 display 为 inlineinline-blockinline-table 时,给元素的 margin 设置为 auto 时,最终设置的值,等价于 0。所以一旦要使用 margin: 0 auto; 进行水平居中布局,就避免让元素为以上三种 display ,直接设置为 block 就好了。当然,如果子元素本身就为块级元素,那么就不需要再单独设置 display 为 block 了。所以上面代码中的 display: block; 可以删除掉。

优点: 

只需要对子元素进行特殊设置,就可以实现水平居中布局。

缺点: 

如果子元素脱离文档流,那么会导致margin失效

在css中进行以下几个设置时,元素会脱离文档流:

  • float: left;

  • float: right;

  • position: absolute;

  • position: fixed;

3、position + 负margin

  • 设置父元素为相对定位

  • 设置子元素为绝对定位

  • 设置子元素 left 为 50%

  • 设置子元素 margin 为 -1/2*width (宽度一半的负值)

代码如下:

<div id="parent">  <div id="children"></div></div>
parent {  width: 300px;  height: 200px;  background-color: aquamarine;  position: relative;}#children {  width: 100px;  height: 100px;  background-color: pink;  position: absolute;  left: 50%;  margin-left: -50px;}

解读: 

1、为了让子元素相对于父元素进行定位,所以设置父元素相对定位、子元素绝对定位

2、为了让元素在中间,所以设置子元素的 left 为 50% 。让子元素距离父元素的左边的距离是 父元素宽度的一半,即 150px 。

3、由于 150px 过大,会导致子元素位置向右偏,如:

4、所以,要设置,让元素向左移动自己宽度的一半,回到正中间,所以设置了 margin-left 为 -50px 。

优点:

无论父元素是否脱离文档流,都不影响子元素水平居中的效果。

缺点: 

必须要明确子元素的宽度,否则没有办法设置 margin-left 的值。

4、position + translateX

  • 设置父元素为相对定位

  • 设置子元素为绝对定位

  • 设置子元素 left 为 50% 

  • 设置子元素 translateX 为 -50%

代码如下:

<div id="parent">  <div id="children"></div></div>
#parent {  width: 300px;  height: 200px;  background-color: aquamarine;  position: relative;}#children {  width: 100px;  height: 100px;  background-color: pink;  position: absolute;  left: 50%;  transform: translateX(-50%);}

解读: 

和上一个的方法一样,需要让子元素向左移动自己的宽度的一半,除了用 margin 之外,也可以使用 translateX 让元素在水平方向上偏移,当给 translateX 的参数设置为 -50% 时,即为向左移动自己宽度的一半。

优点: 

无论父元素是否脱离文档流,都不影响子元素水平居中的效果。

缺点: 

transform 是 CSS3中新增的属性,所以不兼容部分老浏览器。

兼容性查询:https://www.caniuse.com/#search=transform

5、flex + justify-content

  • 设置父元素的 dispaly 为 flex

  • 设置父元素的 justify-content 为 center

代码如下:

<div id="parent">  <div id="children"></div></div>
#parent {  width: 300px;  height: 200px;  background-color: aquamarine;  display: flex;  justify-content: center;}#children {  width: 100px;  height: 100px;  background-color: pink;}

解读: 

设置 display 为 flex 的父元素其主轴上元素的排列方式为居中。

优点: 

无论父元素是否脱离文档流,都不影响子元素水平居中的效果。

缺点: 

1、flex 是 CSS3中新增的内容,所以不兼容部分老浏览器。

兼容性查询:https://www.caniuse.com/#search=flex

2、使用此种方式,会让父元素内的其他子元素也全部水平居中,如下,在父元素中添加其他子元素:

<div id="parent">  <div id="children"></div>  <div id="other-item"></div></div>
#parent {  width: 300px;  height: 200px;  background-color: aquamarine;  display: flex;  justify-content: center;}#children {  width: 100px;  height: 100px;  background-color: pink;}#other-item {  width: 100px;  height: 30px;  background-color: salmon;}

效果如下:

若父元素内有其他子元素不需要水平居中处理,则可以考虑不使用这种方式。

垂直居中布局

垂直居中布局,指当前元素在父级元素中的垂直方向上时居中,如:

以下为实现垂直居中的方法

1、vertical-align+table-cell

  • 设置父元素的 vertical-align 为 middle 

  • 设置父元素的 display 为 table-cell

代码如下:

<div id="parent">  <div id="children"></div></div>
#parent {  width: 300px;  height: 200px;  background-color: aquamarine;  display: table-cell;  vertical-align: middle;}#children {  width: 100px;  height: 100px;  background-color: pink;}

解读: 

1、属性 vertical-align 用来指定行内元素(inline)或表格单元格(table-cell)元素的垂直对齐方式,当给 table-cell 元素设置 vertical-align: middle; 时,表示让该单元格元素内部的盒模型在该行内居中对齐。

2、由1可知,元素需为 table-cell ,所以设置 display 为 table-cell

优点: 

浏览器兼容性好。

由于 vertical-align: middle; 和 display: table-cell; 都为css2中的内容,老版本的浏览器对于CSS2的支持是很友好的。

缺点: 

vertical-align 会导致父级元素中的全部元素都一起居中显示。

如下,在父元素中添加元素:

<div id="parent">  文本  <div id="children"></div>  <div id="other-item"></div></div>
#parent {  width: 300px;  height: 200px;  background-color: aquamarine;  display: table-cell;  vertical-align: middle;}#children {  width: 100px;  height: 100px;  background-color: pink;}#other-item {  width: 100px;  height: 30px;  background-color: salmon;}

效果:

所以当父元素中拥有其他元素时,就不太适合使用这种方案实现垂直居中布局了。

2、position+负margin

  • 设置父元素为相对定位

  • 设置子元素为绝对定位

  • 设置子元素 left 为 50%

  • 设置子元素 top 为 -1/2*height (高度一半的负值)

代码如下:

<div id="parent">  <div id="children"></div></div>
#parent {  width: 300px;  height: 200px;  background-color: aquamarine;  position: relative;}#children {  width: 100px;  height: 100px;  background-color: pink;  position: absolute;  top: 50%;  margin-top: -50px;}

解读:

1、为了让子元素相对于父元素进行定位,所以设置父元素相对定位、子元素绝对定位

2、为了让元素在中间,所以设置子元素的 top 为 50% 。让子元素距离父元素的左边的距离是 父元素宽度的一半,即 100px

3、由于 100px 过大,会导致子元素位置向下偏,如:

4、所以,要设置,让元素向上移动自己高度的一半,回到正中间,所以设置了 margin-top 为 -50px 。

优点:

无论父元素是否脱离文档流,都不影响子元素水平居中的效果。

缺点:

必须要明确子元素的宽度,否则没有办法设置 margin-left 的值。

3、position+translateY

  • 设置父元素为相对定位

  • 设置子元素为绝对定位

  • 设置子元素 left 为 50%

  • 设置子元素 translateY 为 -50%

代码如下:

<div id="parent">  <div id="children"></div></div>
#parent {  width: 300px;  height: 200px;  background-color: aquamarine;  position: relative;}#children {  width: 100px;  height: 100px;  background-color: pink;  position: absolute;  top: 50%;  transform: translateY(-50%);}

解读:

和上一个的方法一样,需要让子元素向上移动自己的高度的一半,除了用 margin 之外,也可以使用 translateY 让元素在垂直方向上偏移,当给 translateY 的参数设置为 -50% 时,即为向上移动自己高度的一半。

优点:

无论父元素是否脱离文档流,都不影响子元素水平居中的效果。

缺点:

transform 是 CSS3中新增的属性,所以不兼容部分老浏览器。

兼容性查询:https://www.caniuse.com/#search=transform

4、flex + align-items

  • 设置父元素的 dispaly 为 flex

  • 设置父元素的 align-items 为 center

代码如下:

<div id="parent">  <div id="children"></div></div>
#parent {  width: 300px;  height: 200px;  background-color: aquamarine;  display: flex;  align-items: center;}#children {  width: 100px;  height: 100px;  background-color: pink;}

解读:

设置 display 为 flex 的父元素其交叉轴上元素的排列方式为居中。

优点:

无论父元素是否脱离文档流,都不影响子元素水平居中的效果。

缺点:

1、flex 是 CSS3中新增的内容,所以不兼容部分老浏览器。

兼容性查询:https://www.caniuse.com/#search=flex

2、使用此种方式,会让父元素内的其他子元素也全部垂直居中,如下,在父元素中添加其他子元素:

<div id="parent">  <div id="children"></div>  <div id="other-item"></div></div>
#parent {  width: 300px;  height: 200px;  background-color: aquamarine;  display: flex;  justify-content: center;}#children {  width: 100px;  height: 100px;  background-color: pink;}#other-item {  width: 100px;  height: 30px;  background-color: salmon;}

效果如下:

若父元素内有其他子元素不需要垂直居中处理,则可以考虑不使用这种方式。

居中 (水平+垂直) 布局

居中布局,即为元素在父元素的水平方向上和居中方向都对齐,效果如下:

想要实现居中对齐,整合上面的水平布局方法和垂直居中即可,故不再对解读、优点、缺点进行书写。

1、table+margin+table-cell+vertical-align

代码如下:

<div id="parent">  <div id="children"></div></div>
#parent {  width: 300px;  height: 200px;  background-color: aquamarine;  display: table-cell;  vertical-align: middle;  text-align: center;}#children {  width: 100px;  height: 100px;  background-color: pink;  display: inline-block;}

2、position+负margin

代码如下:

<div id="parent">  <div id="children"></div></div>
#parent {  width: 300px;  height: 200px;  background-color: aquamarine;  position: relative;}#children {  width: 100px;  height: 100px;  background-color: pink;  position: absolute;  left: 50%;  top: 50%;  margin-top: -50px;  margin-left: -50px;}

3、position+translateX+translateY

代码如下:

<div id="parent">  <div id="children"></div></div>
#parent {  width: 300px;  height: 200px;  background-color: aquamarine;  position: relative;}#children {  width: 100px;  height: 100px;  background-color: pink;  position: absolute;  left: 50%;  top: 50%;  transform: translateX(-50%) translateY(-50%);}

4、flex+justify-content+align-items

代码如下:

<div id="parent">  <div id="children"></div></div>
#parent {  width: 300px;  height: 200px;  background-color: aquamarine;  display: flex;  justify-content: center;  align-items: center;}#children {  width: 100px;  height: 100px;  background-color: pink;}

5、position+margin

<div id="parent">  <div id="children"></div></div>
#parent {  width: 300px;  height: 200px;  background-color: aquamarine;  position: relative;}#children {  width: 100px;  height: 100px;  background-color: pink;  position: absolute;  top: 0;  right: 0;  bottom: 0;  left: 0;  margin: auto;}

最后听一首悦耳的歌放松放松,回忆学到的东西。

点击下面播放音乐

New Boy (Live片段).mp300:0000:13#让生活多一点生机

长按二维码关注,一起努力。

助力寻人启事

 

 

 

微信公众号回复 加群 一起学习。


http://chatgpt.dhexx.cn/article/hMJckqyD.shtml

相关文章

HTML+CSS第十课:常见的3种网页布局方式:表格布局、DIV+CSS布局、框架布局

知识点:网页布局的方式 1、网页布局 常见的页面布局方式:表格布局、DIV+CSS布局、框架布局。 表格布局:用来显示较多的数据,如OA系统、ERP系统或CRM系统。(一般用在局部)DIV+CSS布局:相对来说最灵活的布局方式,完全实现内容和样式的分离。框架布局:通常用在网站后台…

css常见布局方式

css常见布局方式 0、前言1、两栏布局1.1 浮动 margin1.2 浮动 BFC&#xff08;overflow: hidden&#xff09;1.3 定位 margin-left1.4 给父容器设置flex布局&#xff0c;左盒子固定宽度&#xff0c;然后给右子元素设置 flex: 1。1.5 table布局 2、三栏布局2.1 float布局2.2 …

CSS布局的三种方式

绝对定位 绝对定位&#xff1a; ​ 属性&#xff1a;position 值&#xff1a;absolute <style> p.abs{position: absolute;left: 150px;top: 50px; }</style><p >正常文字1</p> <p >正常文字2</p> <p class"abs" >绝对定…

CSS五种布局方式

是CSS知识体系的重中之重 早期以table为主&#xff08;简单&#xff09; 后来以技巧性布局为主&#xff08;难&#xff09; 现在有flexbox/grid(偏简单) 响应式布局是必备知识 常用布局方法 table表格布局 <!DOCTYPE html> <html lang"en"> <head&…

CSS+DIV三种布局方式

在学习了盒模型、块级元素和行内元素得到概念后&#xff0c;我们来说一下CSS的一个比较重要的用途&#xff1a;布局。以前我们学过表格可以起到布局页面的作用&#xff0c;比如布局表单&#xff0c;但实际工作表格的布局通常也仅仅是用来布局表单。绝大多数的模具工作是由CSSDI…

Css 常用布局方式

1.CSS 参考手册 2.元素的分类 首先我们要知道一共有几种元素 1.行内元素&#xff08;可以与其他行内元素位于同一行&#xff0c;不会以新行开始高度、宽度不能设置&#xff09; 2.块级元素&#xff08;每个块级元素都从新的一行开始&#xff0c;其后的元素也另起一行。默认…

css五大布局方式详解

css布局方式 table布局float布局flex布局响应式布局Grid布局 table布局 table布局在如今已经很少使用&#xff0c;原因是&#xff1a;table布局比其它html标记占更多的字节&#xff0c;会阻挡浏览器渲染引擎的渲染顺序&#xff0c;会影响其内部的某些布局属性的生效。 使用…

css中常见的布局方式

1.流体布局 流体布局是网页缩小和放大时网页布局会随着浏览器的大小而改变。 两边的宽度是固定的&#xff0c;中间的宽度是可以根据屏幕的大小进行改变的 思路: 给左右两边的盒子设置固定的宽高并设置左右浮动&#xff0c;中间盒子通过设置margin-left和margin-right(margin的…

CSS的三大布局方式(流式布局,浮动布局和层布局)

文章目录 前言一、标准文档流二、三种布局方式1.流式布局2.浮动布局&#xff08;1&#xff09;字围效果&#xff08;2&#xff09;圣杯布局 3.层布局定位的分类&#xff1a;&#xff08;1&#xff09; 相对定位 position:relative&#xff08;2&#xff09; 绝对定位 position:…

Unity 初识:SkyBox(天空盒)

概念 天空盒是包裹整个场景的环境效果。 制作天空盒 1、创建材质球。 2、设置材质球Shader为SkyBox。 SkyBox/6 Sided&#xff0c;将六张贴图放到对应位置。 使用天空盒 为场景添加&#xff1a; 方法一、直接将做好的材质拖到场景中。 方法二、菜单栏Window--->Lighting-…

unity 天空盒介绍

天空盒其实很简单&#xff0c;就是直接找贴图&#xff0c;比如网上直接搜 然后将图片导入Unity&#xff0c;把texture shape 改为Cube模式&#xff0c;点击Apply应用即可 当应用之后Unity会自动帮我们生成材质球&#xff0c;直接将材质球拖到Scene场景即可&#xff0c;看到…

Unity天空盒子设置和基础灯光设置

选择new Lighting settings来创建一个新的光源 这里可以选择是来自天空盒子的光源还是选择他自己本身的颜色 之后选择使用GPU来渲染

Unity3D -- 天空盒(图文)

1.1、天空盒图片 如果是这样的天空盒图片 直接引入到Unity项目中&#xff0c;在Inspector窗口将Texture Shape修改为Cube&#xff0c;而后保存并应用就行了 1.2、其它图片或整张图片 如果需要将图片等分可通过ps进行处理 选择并使用裁剪工具 &#xff0c;得到如下图 如果图片出…

小功能⭐️Unity动态更换天空盒、旋转天空盒

文章目录 &#x1f7e5; Unity动态更换天空盒1️⃣ 方法12️⃣ 方法2 &#x1f7e7; 旋转天空盒 &#x1f7e5; Unity动态更换天空盒 1️⃣ 方法1 1、在摄像头上添加SkyBox组件 放到其他地方不管用。 2、创建SkyBox类型的的材质球。放入即可。 3、通过代码&#xff0c;你便可获…

unity3d场景怎么添加天空盒子?

unity3d场景中想要添加天空盒子&#xff0c;该怎么添加呢&#xff1f;下面我们就来看看详细的教程。 1、先下载组成天空盒子的天空图片 2、把天空图片拖进unity3d中创建的文件夹 3、新建一个材质球 4、把材质球的shader修改成天空盒选项 5、在天空盒的六个方向&#xff08;前&a…

Unity3D-设置天空盒

首先打开工具栏Window下的照明&#xff0c;找到环境这里的天空盒材质就是整个项目的背景&#xff0c;可以到官网下载自己喜欢的天空盒材质 这里就是下载好的天空盒材质 点开Shader 选择Skybox 再选择Cubemap Extended 选择好后将其拖入天空盒材质 可以在检测器里调整天空盒的一…

unity移动天空盒

旋转 直接观察天空盒参数是有一个Rotation的。 我们可以通过给Camera添加Skybox组件获取到天空盒然后修改Rotation参数。 private void Update(){RotateSkybox();}//控制天空盒旋转private void RotateSkybox(){float num Camera.main.GetComponent<Skybox>().material…

Unity修改默认天空盒Skybox

在Main Camera 上添加Skybox&#xff0c;并拖动目标天空盒&#xff0c;没有修改成功。 &#xff08;hierarchy 下面的 main camera 主摄像机 然后 点击 component->Rendering->skybox 给主摄像机添加一个 天空盒 这是我们就可以再 摄像机的 属性栏看到 skybox 属性 …

Unity 动态天空盒

为了使天空盒更真实&#xff0c;需要控制天空盒动态旋转。 网上找到的方法是&#xff1a; float num RenderSettings.skybox.GetFloat("_Rotation");RenderSettings.skybox.SetFloat("_Rotation", num 0.05f); 但在我的工程中会报错&#xff08;我的un…

unity天空盒有缝隙解决方法

今天发现有些天空盒导入到unity显示会出现一个立方体的样子&#xff0c;立方体面之间会出现缝隙&#xff0c;看着很明显。 解决方法很简单&#xff0c;把天空盒的材质图片&#xff08;也就是Texture&#xff09;修改一下。 有两个地方需要修改&#xff0c;如下图&#xff1a;…