海边的小溪鱼

vuePress-theme-reco 海边的小溪鱼    2017 - 2023
海边的小溪鱼 海边的小溪鱼

Choose mode

  • dark
  • auto
  • light
首页
分类
  • CSS
  • HTTP
  • Axios
  • jQuery
  • NodeJS
  • JavaScript
  • Vue2
  • Server
  • Vue3
标签
时间轴
更多
  • Gitee (opens new window)
Getee (opens new window)
author-avatar

海边的小溪鱼

28

文章

14

标签

首页
分类
  • CSS
  • HTTP
  • Axios
  • jQuery
  • NodeJS
  • JavaScript
  • Vue2
  • Server
  • Vue3
标签
时间轴
更多
  • Gitee (opens new window)
Getee (opens new window)

CSS 网页布局的三种常见方式

vuePress-theme-reco 海边的小溪鱼    2017 - 2023

CSS 网页布局的三种常见方式

海边的小溪鱼 2022-07-14 CSS

标准流、Float(浮动)、Position(定位)

# 1. 标准流(普通流/文档流)是最基本的布局方式

什么是普通流(标准流):所谓的标准流,就是 元素/标签 按照规定好的默认方式排列

块级元素:div、hr、p、h1~h6、ul、ol、dl、form、table、等
(1)自己独占一行,从上向下顺序排列
(2)宽高、内外边距都可以自己控制
(3)宽度默认为是父元素的100%
行内元素:span、a、i、em、等
(1)一行多个,从左到右顺序排列,元素之间有空白间隙,碰到父元素边缘则自动换行
(2)设置宽高 和 上下内外边距是无效的(不符合W3C标准)
行内块元素:img、input、textarea、等
(1)一行多个,从左到右顺序排列,元素之间有空白间隙,超出父级容器会自动换行
(2)宽高、内外边距都可以自己控制
(3)宽度默认是根据自身的内容来决定

元素之间的相互转换:通过 display 属性,可以转换元素类型
转换为块级元素:display: block;
转换为行内元素:display: inline;
转换为行内块元素:display: inline-block;

# 2. Float(浮动)

为什么需要浮动?
有很多的布局效果,标准流是没办法实现的,如:如何让多个块级盒子在一行排列?如何让两个元素一个靠左一个靠右?
此时就可以利用浮动来完成布局,因为浮动可以改变元素标签默认的排列方式

浮动元素的特性:元素添加浮动后,会有如下特性

1. 浮动元素会一行内显示并且元素顶部对齐
所有添加浮动的元素,都会在一行上显示,并且都是紧挨在一起(元素之间没有空隙),超出父级容器会自动换行排列
2. 浮动的元素具有"行内块元素"的特性:任何元素都可以添加浮动,不管原先是什么模式的元素
如果块级盒子没有设置宽度,默认和父级一样宽,但添加浮动后,它的宽度根据自身的内容来决定!
浮动后的行内元素不需要转化就可以直接给高度和宽度
注意:行内块元素之间有空白间隙,而浮动没有
3. 浮动元素会脱离标准流
浮动的元素会脱离标准流的控制(会浮起来,向页面左上或右上浮动,原来的位置不再保留)原先的位置会被后面标准流的盒子所占用,且浮动的元素会 覆盖住/压住 标准流的盒子(需要清除浮动)

浮动带来的影响有哪些?
(1)会脱离标准流
(2)浮动元素无法撑起父元素的高度,父元素会出现高度塌陷的现象
在标准文档流中,父元素的高度默认是由子元素撑开的,等于说子元素多高,父元素就多高,但是当子元素有了浮动之后,子元素会脱离标准流,此时,将会导致子元素无法撑起父元素的高度,会导致父元素的高度塌陷
简而言之:父元素不写高度时,子元素写了浮动后,父元素会发生高度塌陷(造成父元素高度为 0)

  • 注意:浮动不会压住下面标准流盒子里面的文字/图片(浮动的前世本就是做文字环绕效果的,如今用作布局)
<html>
<body>
    <div class="box">
        <!-- 让多个块级盒子一行内显示(盒子之间没有空隙) -->
        <div class="son1">1</div>
        <div class="son2">2</div>
        <div class="son3">3</div>
    </div>
</body>
<style>
    .box {
        width: 500px;
        height: 100px;
        background-color: green;
    }
    .son1,.son2,.son3 {
        width: 200px;
        height: 100%;
        background-color: red;
        /* 添加浮动 */
        float: left;
    }
</style>
</html>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<html>
<body>
    <div class="box">
        <!-- 让两个块级盒子,一个靠左,一个靠右 -->
        <div class="left">左</div>
        <div class="right">右</div>
    </div>
</body>
<style>
    .box {
        width: 100%;
        height: 300px;
        background-color: green;
    }
    .left,.right {
        width: 200px;
        height: 100%;
        background-color: red;
    }
    .left {
        float: left; /* 左浮动 */
    }
    .right {
        float: right; /* 右浮动 */
    }
</style>
</html>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27

# Position(定位)

为什么需要定位?
定位 在布局中 非常的常用,它可以让一个元素,摆放到父元素中任意位置

定位 = 定位模式(决定元素的定位方式)+ 边偏移(决定该元素的最终位置)

定位模式:position 属性值,其中有五种种定位方式的属性值

值 说明 特点
static 静态定位:默认定位方式,无定位的意思;遵循正常的标准文档流,不会受到 top、bottom、left、right 边偏移属性的影响 没有定位
relative 相对定位:一般给父元素添加,相对于自己原来的位置进行偏移(自恋型),一般用于约束有绝对定位的子元素 继续保留原来的位置
absolute 绝对定位:一般给子元素添加,以最近一级有定位的父级盒子来定位,如果父级没有定位,则以浏览器来定位 不再保留原来的位置
fixed 固定定位:以浏览器可视窗口来定位,和父元素没有任何关系;且是固定在某处,即使滚动窗口它也不会移动 不再保留原来的位置
sticky 粘性定位:以浏览器可视窗口来定位,必须添加 top、bottom、left、right 其中一个边偏移的属性 继续保留原来的位置

边偏移:有top、bottom、left、right四个属性(分别代表上下左右偏移量,定义元素相对其父元素上下左右边线的距离)属性值可以为像素单位px或百分比%

定位拓展知识
(1)添加了绝对定位或者固定定位的行内元素,可以直接设置高度和宽度(和浮动类似)不需要模式转化。
(2)添加了绝对定位或者固定定位的块级元素,如果不给宽度或者高度,盒子默认大小是内容大小。
(3)添加了浮动/绝对定位/固定定位的元素都不会有外边距合并的问题(脱标的盒子不会触发外边距塌陷)
(4)绝对定位/固定定位会完全压住下面标准流的盒子(包括文字图片)
(5)子绝父相,可以让子元素在父盒子里面水平垂直居中

  • 子绝父相:一般情况下,子级是绝对定位的话,父级要用相对定位,让子元素以其父元素为标准来定位
  • 注意:同一个元素里面,浮动和绝对定位不能同时使用。
<html>
<body>
    <div class="box">
        <div class="son">
            <div class="sun"></div>
        </div>
    </div>
</body>
<style>
    .box {
        width: 450px;
        height: 200px;
        background-color: green;
        position: relative; /* 相对定位 */
    }
    .son {
        width: 100px;
        height: 100px;
        background-color: red;
        /* 子绝父相:实现子元素在父级盒子里面水平垂直居中*/
        position: absolute;
        top: 50%;
        left: 50%;
        transform: translate(-50%, -50%);
    }
    .sun {
        width: 50px;
        height: 50px;
        background-color: pink;
        /* 注意:sun 盒子是相对于 son 盒子来定位的:因为离它最近一级的父元素 son 有定位属性 */
        position: absolute;
        left: 25px;
    }
</style>
</html>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35

# Flex(弹性布局)

avatar

帮助我们改善此页面! (opens new window)