Css布局——浮动、定位、flex

本文详细介绍了CSS布局中的三种主要方式:浮动布局、定位布局和弹性盒布局。浮动布局主要用于创建多列布局,可能导致高度塌陷问题,可通过BFC解决。定位布局包括静态、相对、绝对和固定定位,以及粘滞定位,通过`z-index`控制层级。弹性盒布局提供了一种灵活的响应式布局方案,通过`flex`属性控制元素的排列、对齐和大小。理解并掌握这些布局技术对于前端开发至关重要。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

CSS布局

网页的布局方式其实就是指浏览器是如何对网页中的元素进行排版的,浏览器默认的排版方式就是标准流的排版方式

常见的布局方式有浮动布局、定位布局、伸缩盒布局。

1.浮动布局

	通过float属性将标准流布局改变为浮动布局,float取值为none、left、right,在浮动流中不可以使用margin: 0 auto;

	float: none 默认值,元素默认在标准流(文档流/普通流)中排列

	float: left,元素脱离标准流(文档流/普通流),向页面的左侧浮动

	float: right,元素脱离标准流(文档流/普通流),向页面的右侧浮动
1.1 特点
	1.在浮动流中是不区分块级元素、行内元素、行内块级元素

	2..在浮动流中的元素都可以设置宽高
1.2 浮动流排版方式
	1.浮动流是一种"半脱离标准流"的排版方式,浮动的元素是漂浮在标准流的上方,因此,可能会盖住在标准流的元素

	2.浮动流只有水平排版.方式,只能设置某个元素左对齐或者右对齐
1.3 浮动元素字围现象

浮动元素不会挡住没有浮动元素中的文字,没有浮动的文字会自动给浮动的元素让位置,并将围绕着浮动元素进行显示,这个就是浮动元素字围现象

1.4 高度塌陷

在标准流中,父元素的高度默认由子元素内容撑起,即子元素多高,父元素多高,当子元素设置浮动,脱离标准流,父元素高度无法被撑起,导致父元素高度塌陷,这样父元素下的元素都会向上移动,导致页面混乱

解决方法:

	1.将父元素的高度写死,以避免塌陷的问题出现,但是这样不能自适应子元素的高度,不推荐使用。

	2.给父元素设置overflow : hidden

	3.在当前父元素的最后添加一个空白div,为其添加clear : both属性,但给页面增添了无意义的元素结构

	4.为需要清除浮动元素设置伪元素选择器::after ,用于清除浮动
   /* 通过伪元素选择器::after 清除浮动 */
        .father::after {
            /* 在元素后添加一个空白内容 */
            content: '';
            /* 切换为块级元素 */
            display: block;
            /* 清除浮动 */
            clear: both;
        }
1.5 BFC

块格式化上下文(Block Formatting Context,BFC) 是Web页面的可视化CSS渲染的一部分,是块盒子的布局过程发生的区域,也是浮动元素与其他元素交互的区域。

BFC(block formatting context)块级格式化上下文,它是页面中的一块渲染区域,并且有一套属于自己的渲染规则,它决定了元素如何对齐内容进行布局,以及与其他元素的关系和相互作用。 当涉及到可视化布局的时候,BFC提供了一个环境,HTML元素在这个环境中按照一定规则进行布局

BFC是一个独立的布局环境,BFC内部的元素布局与外部互不影响

BFC的布局规则
	1. 内部的盒子会在垂直方向一个接着一个地放置。
	2. 盒子垂直方向上的距离由margin决定,属于同一个BFC的两个相邻的盒子的margin会发生重叠。
	3. 每个盒子的左外边框紧挨着包含块的左边框,即使浮动元素也是如此。
	4. BFC的区域不会与float box重叠。
	5. BFC就是页面上的一个隔离的独立容器,容器里面的子元素不会影响到外面的元素,反之亦然。
	6. 计算BFC的高度时,浮动子元素也参与计算
生成BFC的元素
	1.根元素

	2.float属性不为none

	3.position 为absolute或fixed

	4.display为inline-block、table-cell、table-caption、flex、inline-flex

	5.overflow不为visible 
BFC的作用

1.解决浮动元素令父元素高度坍塌的问题(给父元素设置overflow : hidden)
原理:计算BFC的高度时,浮动子元素也参与计算

<style>
    /* 父元素 */
    .div1 {
      width: 1000px;
      border: 10px solid red;
      /* BFC */
      overflow: hidden;
    }
    /* 子元素 */
    .div2 {
      width: 200px;
      height: 400px;
      background-color: blue;
      float: left;
    }
  </style>

<div class="div1">
    <div class="div2"></div>
</div>

2.两栏自适应布局

​ 原理:BFC的区域不会与float box重叠

<style>
    .left {
      float: left;
      width: 300px;
      background-color: blue;
    }
    .right {
      /* 
        overflow:auto;(隐藏溢出的内容)利用BFC
      */
      overflow: auto;
      background-color: red;
    }
</style>
<div class="left">左边定宽</div>
  <div class="right">
    右边自适应
  </div>

3.三列布局:两边定宽,中间自适应

​ 原理:BFC的区域不会与float box重叠

<style>
.left,.right {
  width: 200px;
  height: 200px;
  background-color: #999;
}
.left {
  float: left;
}
.right {
  float: right;
}
.center {
  /* 中间模块空出左右距离,自适应布局 */
  margin: 0 200px;
  height: 300px;
  background-color: #f00;
}
</style>
<div class="left">left</div>
<div class="right">right</div>
<div class="center">center</div>

2.定位布局

通过position属性可以改变为定位布局,position取值分别有:static、relative、absolute、fixed、sticky
2.1 静态定位
position: static;   定位布局的默认值,表示元素定位在默认文档流中
2.2 相对定位
position: relative;  表示元素相对于自己以前在标准流中的位置来移动,属性值:top、right、bottom、left
注意点
	1.相对定位不脱离标准流,会占据标准流中的空间

	2.相对定位同一个方向上的定位属性值只能使用一个,例如使用top就不能使用bottom
2.3 绝对定位
position: absolute;   若祖先元素都是标准流中的元素,表示元素相对于body来定位,否则,表示元素相对于距离最近的设置的定位属性的祖先元素来定位(静态定位的祖先元素不可以),属性值:top、right、bottom、left
注意点
	1. 默认情况下以body作为参考点进行定位
	2. 若有祖先元素不是标准流中的元素,设置了非静态定位的属性值,元素会相对于距离最近的设置的定位属性的祖先元素作为参考点进行定位
	3. 绝对定位的元素脱离标准流,不占据标准流中的空间
	4. 绝对定位的元素会忽略祖先元素的padding
进行水平垂直居中

使用子绝父相,即给父元素设置相对定位,子元素设置绝对定位,这样子元素就会相对于父元素进行定位

  • 子元素设置 top、left为50%,margin-left设置为负的子元素宽度的一半,margin-top设置为负的子元素高度的一半

  • 子元素的left、top、right、bottom设置为0,margin : auto

2.4 固定定位
position: fixed; 固定定位,表示元素固定在某一个位置,不随着滚动条而滚动,属性值:top、right、bottom、left
注意点

固定定位的元素是脱离标准流,不占据标准流中的空间

2.5 粘滞定位
position: sticky; 粘滞定位,表示元素随着滚动条滚动到某一特定位置,之后固定不动,不随着滚动条而滚动,结合了相对定位和固定定位的功能,属性值:top、right、bottom、left
注意点
	1.粘滞定位的元素不脱离文档流,占据标准流中的空间

	2.当粘滞元素在容器中被滚动超过指定的偏移值时,元素在容器内固定在指定位置
		即给粘滞元素设置top: 50px,那么,当滚动条滚动到距离相对定位的元素顶部50px的位置时固定住,不再跟着滚动条滚动

	3.粘滞元素的父元素不能有overflow:hidden或者overflow:auto属性

	4.必须指定top、bottom、left、right 4个值中的一个,否则只会处于相对定位 

	5.父元素的高度不能低于sticky元素的高度 

	6 sticky元素仅在其父元素内生效
2.6 z-index
	1.默认情况下所有的元素都有一个默认的z-index属性,,取值是0,z-index属性的作用是专门用于控制定位流元素的覆盖关系的

	2.定位流的元素会盖住标准流的元素(默认情况)

	3.定位流的元素后编写的会盖住前面编写的

	4.若定位流的元素设置了z-index属性,z-index越大那么其定位流元素就会显示在上面

	5.若两个子元素的父元素都设置了z-index属性,子元素的z-index属性就会失效,会听从父元素的z-index属性

3.弹性盒布局

可以简便、完整、响应式地实现各种页面布局,通过display: flex; 将标准流布局改变为弹性盒布局,任意一个容器都可以指定为flex布局。
3.1 flex弹性盒模型

采用 Flex 布局的元素,称为 Flex 容器,简称"容器"。它的所有子元素自动成为容器成员,称为 Flex 项目,简称"项目"。
在这里插入图片描述

  1. 每个弹性容器都有两根轴:主轴和交叉轴,两轴之间呈90度。注意:水平的不一定就是主轴,可以通过属性flex-direction改变主轴方向
  2. 每根轴都有起点和终点,用于元素的对齐。
  3. 弹性容器中的所有子元素称为**<弹性元素>**,弹性元素永远沿主轴排列
  4. 弹性元素也可以通过display:flex设置为另一个弹性容器,形成嵌套关系。因此一个元素既可以是弹性容器也可以是弹性元素
3.2 flex布局容器属性

容器属性是写在容器元素上的

3.2.1 flex-direction

用于控制项目排列方向与顺序,默认row,即横向排列

取值:row(默认) | row-reverse | column | column-reverse

若flex-direction的值为column,那么主轴和交叉轴距会发生变化

在这里插入图片描述

3.2.2 flex-wrap

用于控制项目(主轴上的元素)换行,当在主轴上位置不够排列弹性元素

取值:nowrap(默认不换行) | wrap | wrap-reverse

如果容器的宽度小于项目的总宽度,但是容器不换行,项目又永远沿主轴排列,那么项目的实际宽度就会缩小,强制在容器的主轴上排列

但是如果我们设置了换行,那么项目根据自身宽度进行排列,如果超出父容器宽度则自然换行

image-20210817190407469
3.2.3 flex-flow

flex-flow属性是flex-deriction与flex-wrap属性的简写集合,默认属性为row nowrap,即横向排列,且不换行。

3.2.4 justify-content

用于控制项目在主轴上的对齐方式

取值:flex-start(默认) | flex-end | center | space-between | space-around | space-evenly

3.2.5 align-items

用于控制项目在交叉轴排列方式,取值:flex-start | flex-end | center | baseline | stretch(默认)

3.2.6 align-content

用于控制多行项目的对齐方式,如果项目只有一行则不会起作用

取值:flex-start | flex-end | center | space-between | space-around | space-evenly | stretch(默认)

3.3 flex布局项目属性

项目属性就是写在项目/弹性元素上的

3.3.1 order

用于决定项目排列顺序,数值越小,项目排列越靠前,取值:默认0,

3.3.2 flex-grow

用于决定项目怎么占据剩余空间,默认不占据,取值:默认0,

注意,即便设置了固定宽度,也会放大

例如:弹性元素1、2、3设置了等宽等高,给弹性元素2和3设置flex-grow: 1,那么剩余空间就会等分成两份,弹性元素2、3各占据一份

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DNKrLouV-1629199736782)(images/image-20210817192139153.png)]

3.3.3 flex-shrink

用于决定项目在空间不足时是否缩小,取值:默认1,即空间不足时会等比缩小

注意,即便设置了固定宽度,也会缩小。

3.3.4 flex-basis

用于设置项目宽度,取值:默认auto,项目会保持默认宽度,或者以width为自身的宽度

注意,flex-basis权重比width属性高,因此flex-basis的属性值会覆盖width属性值

3.3.5 flex

flex属性是flex-grow,flex-shrink与flex-basis三个属性的简写,用于定义项目放大,缩小与宽度,取值:默认 0 1 auto

快捷值:flex: auto(1 1 auto)等分放大缩小 flex: none(0 0 auto)不放大不缩小 flex: 1(flex: 1 1 0px)

3.3.6 align-self

用于让个别项目拥有与其它项目不同的对齐方式

取值:auto(默认) | flex-start | flex-end | center | baseline | stretch

th属性高,因此flex-basis的属性值会覆盖width属性值

3.3.5 flex

flex属性是flex-grow,flex-shrink与flex-basis三个属性的简写,用于定义项目放大,缩小与宽度,取值:默认 0 1 auto

快捷值:flex: auto(1 1 auto)等分放大缩小 flex: none(0 0 auto)不放大不缩小 flex: 1(flex: 1 1 0px)

3.3.6 align-self

用于让个别项目拥有与其它项目不同的对齐方式

取值:auto(默认) | flex-start | flex-end | center | baseline | stretch

取值为auto时继承父容器的align-items属性,如果没父元素,则默认stretch

### 浮动Flexbox布局的冲突及解决方法 #### 一、浮动Flexbox的关系 在CSS中,`float`是一种传统的布局方式,用于控制元素水平排列或创建多列布局。然而,在引入Flexbox之后,这种新的布局模型提供了更强大和灵活的方式来管理页面结构。当一个元素被设置为`display: flex;`时,其子项会自动成为弹性盒项目(flex items),此时大多数传统布局属性(如`float`)会被忽略。 具体来说,一旦某个容器设置了`display: flex;`,它的直接子元素就会进入弹性上下文中[^2]。这意味着即使这些子元素上定义了`float`样式,它们也不会按照浮动规则渲染,而是遵循Flexbox的相关属性配置,比如`flex-direction`、`justify-content`等[^5]。 #### 二、为什么会出现冲突? 如果开发者尝试在一个启用了Flexbox布局的环境中继续依赖于`float`来实现某些效果,则可能会遇到意想不到的行为。例如: - **溢出问题**:正如提到的情况,“overflow-x:scroll失效”,这可能是因为启用Flexbox后,默认情况下弹性项目的尺寸计算逻辑发生了变化,从而影响到滚动条的表现形式及其触发条件[^3]。 - **定位偏差**:如果没有正确应用诸如`justify-content`之类的对齐选项,那么试图通过旧式的手段——像单独依靠左侧或右侧漂浮去安排界面组件的位置就难以达到理想状态[^4]。 因此,在现代Web开发实践中建议尽量避免混合使用这两种不同的布局机制以减少复杂性和潜在错误源。 #### 三、解决方案 针对上述提及的问题有几种可行的办法来进行调整优化: 1. **移除无意义的Float声明** 如果已经决定采用Flexbox作为主要布局策略的话,就应该彻底删除那些不再生效或者不必要的`float`相关指令。这样不仅可以简化代码维护成本还能提高性能表现因为浏览器不需要再去解析处理相互矛盾的指示。 2. **合理运用Justify-Content Align-Items** 利用Flexbox自带的强大功能来自定义各个方向上的分布模式代替原来基于浮动的做法。例如要让一组按钮分别靠向两端可以简单地设成:`justify-content: space-between;`,而无需再考虑左右两部分各自独立浮动的事情. 3. **精确设定Width Height Constraints** 对于可能出现宽高异常变动的现象可以通过显式指定最小最大限制值(min-width/max-width,min-height/max-height)或者是固定百分比例等方式加以约束防止过度拉伸收缩破坏整体视觉平衡感. 以下是利用Flexbox重新构建原需求的一个例子展示如何有效规避之前所遇难题: ```css .parent { display: flex; overflow-x: auto; /* 或者hidden依据实际场景 */ } .child { flex-shrink: 0; /* 防止压缩 */ } ``` 另外值得注意的是有时候为了兼容低版本IE浏览器不得不采取一些折衷措施比如说额外包裹一层div并赋予它position:relative特性然后再对其内部对象施加绝对定位置等等但是随着主流平台逐渐淘汰老旧引擎这类顾虑也日益减轻了。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值