(13) css浮动补充

一、字围现象

与前面压盖效果结构类似,同级元素中前面的元素浮动,后面的元素不浮动,不浮动的元素内部还有一些文字,浮动的蓝盒子会压盖住黄绿盒子的一部分,但是文字内容不会被盖住,蓝色盒子中的文字会让开蓝盒子位置,围绕它进行加载。这种效果称为字围现象。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>css浮动让出标准流的位置</title>
    <style>
        body,div,p {
            margin: 0;
            padding: 0;
        }
        .p1 {
            float: left;
            width: 100px;
            height: 100px;
            background-color: skyblue;
        }
        .p2 {
            width: 200px;
            height: 200px;
            background-color: yellowgreen;
        }
    </style>
</head>
<body>
    <div class="box">
        <p class="p1"></p>
        <p class="p2">123文字内容123文字内容123文字内容123文字内容123文字内容123文字内容123文字内容123文字内容123文字内容123文字内容123文字内容</p>
    </div>
</body>
</html>

可以利用字围现象制作一些特殊的图文混排布局效果: 

 二、浮动带来的问题1

标准流中的元素,不设置高度的情况下,都能被内部的标准流元素自动撑高。 如果内部的子元素进行了浮动,浮动的子元素是撑不高标准流父亲的。

示例:没有添加浮动,普通标准文档流

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>css浮动带来的问题</title>
    <style>
        body,div,p {
            margin: 0;
            padding: 0;
        }
       .box {
           width: 1000px;
           border: 1px solid #000;
       }
       .box p {
           width: 100px;
           height: 100px;
           margin-right: 10px;
           background-color: skyblue;
       }
    </style>
</head>
<body>
    <div class="box">
        <p></p>
        <p></p>
        <p></p>
        <p></p>
    </div>
</body>
</html>

 当我们给div盒子里面所有的p元素,添加左浮动后,会出现如下问题。

三、浮动带来的问题2

父元素没有高度,会影响后面元素的标准流位置,如果浮动的子元素足够高时,有可能影响到后面浮动元素的贴边。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>css浮动带来的问题</title>
    <style>
        body,div,p {
            margin: 0;
            padding: 0;
        }
       .box {
           width: 1000px;
           border: 10px solid #000;
       }
       .box p {
           float: left;
           width: 100px;
           height: 100px;
           margin-right: 10px;
           background-color: skyblue;
       }
    </style>
</head>
<body>
    <div class="box">
        <p></p>
        <p></p>
        <p></p>
        <p></p>
    </div>
    <div class="box">
        <p></p>
        <p></p>
        <p></p>
        <p></p>
    </div>
</body>
</html>

四、清除浮动的方法

4.1给标准流的父元素强制给一个合适的高度

解决:父元素有了高度,前面的浮动不能影响后面元素的标准流位置和贴边。

问题:父元素高度不是自适应,一旦子元素高度变化,问题可能再次出现。 

 4.2通过clear属性进行清楚浮动

 clear清除的作用:清除标签元素自身受到的前面的浮动元素的影响。 属性值:

  • left 清除前面左浮动带来的影响
  • right 清除前面右浮动带来的影响
  • both 清除前面所有浮动带来的影响

给标准流父元素添加 clear 属性,父元素不受前面浮动影响,不会再占有浮动让出的位置。

 clear: both; 解决问题:浮动元素影响后面元素标准流位置和贴边。

没有解决的问题:父元素不能高度自适应,两个父元素之间如果有 margin 效果不正确。

4.3通过隔墙法清除浮动

4.3.1外墙法

在两个大的父盒子之间,添加一个空的 <div> 标签,标签上带有 clear: both 属性。

外墙法解决了:浮动影响后面元素标准流位置和贴边,模拟父元素间的距离。

没有解决问题:父元素没有高度自适应。

4.3.2内墙法

在父元素内部,所有的浮动子元素后面添加一个空的 <div> 元素,标签高度为 0,添加 clear 属性。

 内墙法解决了:父元素高度自适应,浮动影响后面的元素位置和贴边。

 缺点:浮动是 css 样式属性带来的问题,内墙法使用 HTML 结构去辅助解决问题, 如果页面中浮动元素很多,需要添加多个没有语义的空标签,造成 HTML 结构的冗余。

 4.4通过伪类清除浮动

本质是使用伪类方法利用css代码书写一堵内墙。 伪类选择器:通过选中的标签添加伪类,去选中标签的某个状态或位置。 :after:这个伪类表示选中的是某个标签内部的最后的位置。 书写方法:前面必须加普通的选择器,后面连续书写伪类名称。 将伪类添加给一个选中父盒子的选择器后面,一般给需要清除浮动的父盒子设置一个clearfix的类名。

示例:我们发现并没有生效,原因是什么呢?

 

我们打开控制台:
再控制台中我们可以看到,我们的div元素,并没有成功添加clearfix类名,那肯定是我们书写出现了问题。

1.多个类名的错误写法

2.多个类名的正确写法

 通过上边示例我们看到,我们正确书写类名后,发现生效了,解决了浮动带来的问题。解决了父元素高度自适应,浮动影响后面的元素位置和贴边。那么我们通过这种方式虽然是通过css去实现清除浮动,没用HTML结构,但是CSS代码量太大了。

3.接下来我们可以简写,同样的可以实现清楚带来的所有问题。

将代码缩短,content我们给一个空值,这样省去了写visibility属性隐藏,我们还可以省去height高度属性。 

4.5还是不够简单?终极方法!我们来一条属性解决浮动问题吧!

只需要设置一条溢出隐藏属性:overflow:hidden;解决所有浮动问题,是不是很nice!专门治疗懒人的小偏方!

overflow属性补充:

元素高度设置后,overflow:hidden;效果是将超过高度的部分直接隐藏。

  

元素高度没有设置时,如果元素同时设置了overflow:hidden属性,元素会自适应内容的高度。 那么这是什么原理呢?

高度自适应原因:一个元素没有设置高度,同时设置了溢出隐藏,浏览器在加载盒 子尺寸时,遇到溢出隐藏浏览器会强制性去检索内部的子元素的高度,不论子元素是标准流还是浮动,都会将最高的高度作为父盒子高度加载。

 浮动影响后面的元素:父元素有了高度后,可以管理住内部所有的浮动元素,不会延伸到后面标签中影响贴边。

五、css清除浮动总结

  • 如果父元素高度是固定的,建议使用 height 属性解决。
  • 如果父元素高度需要自适应,建议使用 overflow 属性解决浮动问题。 
如果父元素高度是固定的,建议使用 height 属性解决。
如果父元素高度需要自适应,建议使用 overflow 属性解决浮动问题。
如果父元素高度是固定的,建议使用 height 属性解决。
如果父元素高度需要自适应,建议使用 overflow 属性解决浮动问题。

coverlear属性

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

泽哥ins

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值