MENU

css高级篇

September 7, 2022 • Read: 499 • 学习笔记

两个经典bug

margin塌陷

垂直方向的margin父子元素是结合到一起的,取最大值

两个div,父级div移动带着子级div移动这是正常的,正常来说子级div移动是相对父级进行移动,设置左右方向是正常的,但是设置子级的垂直方向移动有个bug,比如设置margin-top参数是有bug的

解决方法一:给父级border-top加一个参数,等于给父级加个顶棚(不专业,不推荐)

解决方法二:改变父级渲染规则,使父级变成bfc;

bfc(block format context),默认来说每个盒子都有默认的语法规则,触发bfc后,会使用另一套语法规则;

如何触发bfc?

1、设置position:absolute; 设置成绝对定位

2、设置display:inline-block; 行级块元素

3、设置float:left | right; 向左、向右浮动

4、设置overflow:hidden; 溢出部分隐藏

不要因为去修正bug,随便去修改html结构

float

float就两个值,一个left,一个right;

浮动元素产生了浮动流;

所有产生了浮动流的元素,块级元素看不到他们

产生bfc的元素和文本类属性(inline)的元素以及文本都能看到浮动元素

如果想父级包住浮动元素,可以用一个<p>占位,设置参数clear:both;清除浮动流

<!-- 包裹浮动元素演示 -->
<div clsss="wrapper">
    <div class="content">1</div>
    <div class="content">2</div>
    <div class="content">3</div>
    <p class="clear"><p>
</div>
/* 包裹浮动元素演示 */
.wrapper{
    border:1px solid black;

}
/* 因为.content是浮动元素,div是块级元素所以div是包不住 */
.content {
        float:left;
        width:100px;
        height:100px;
        background:black;
        color:#fff;
    
}

/* 这里我们需求是让父级div可以包住.content元素 */
.clear {
    clear:both;
}
/* 设置一个<p>标签,css设置clear参数为both */
/* clear是清除它周边浮动流 */

虽然上面的方法可以解决包裹浮动元素的问题,但是新增的一个.clear是没有意义的,破坏页面结构,所以最好不用,我们可以用伪元素来解决。

设置浮动元素后最好都清除一下浮动流,避免对后面的元素产生影响。

伪元素

伪元素天生就存在是行级元素,只是不在html中显示,可以用css选中

/* 伪元素以::开头,要用content连接,这里的content只能用在伪元素里 */
span::before {
    
        content:"测试";
}

这里我们就可以解决上面的问题了

/* 在.wrapper伪元素清楚浮动流 */
.wrapper::after {
    content:"";
    clear:both;
    /* 这时还不行,因为伪元素是行级元素,我们需要把它改成块级元素 */
    dispaly:block;
}

凡是设置了position:absolute; float:left | right; 系统会把元素转换成inline-block;