HTML与CSS基础重点总结(四)

102 阅读6分钟

10.1 示例题目

看一个经典的校招笔试题。

.box {
    width: 160px;
    height: 160px;
    padding: 10px 20px 30px;
    padding-right: 40px;
    border: 1px solid red;
    border-top: none;
}

请问,这个盒子实际的宽、高是多少?

解答:这是个非常好的题目。首先,根据 padding: 10px 20px 30px; 可以初步得知,它的上、右、下、左的padding分别为10、20、30、20。注意,这里是3个数值,没有表示“左”的数字,所以左和右相同,都是20px。

紧接着,写了一句 padding-right: 40px; 这意味着,它“层叠”掉了刚刚设置的右padding那个20px。即,现在右padding变为了40px。

于是就会有问,那如果两句话颠倒顺序呢?就是:

padding-right: 40px;
padding: 10px 20px 30px;

那此时右padding是20px啦。就是说,谁写在下面,听谁的。

题目中,border的情况也是类似的,即,上边框是none,其他三个边框都是1px的。

至此,相信你已经可以画出这个盒子的盒模型图了:

5.png

因此,这个盒子的总宽度是160+20+40+1+1=222像素; 总高度是160+10+30+1=201像素。

此面试题一道题考察了很多知识点。

在后面还有 box-sizing: content-box 属性这一知识点,这个属性可以将padding、border从“外扩”变为“内缩”

11. margin塌陷

竖直方向的margin有塌陷现象:小的margin会塌陷到大的margin中。就是说,margin不叠加,只以大值为准。

来看一张图理解一下:

6.png

12. BFC

什么是BFC?

BFC(Box Formatting Context,块级格式化上下文)是独立渲染容器,它内部的元素不影响区域外的其他元素,也不会被区域外的其他元素影响,如同“监狱”一样。页面上,用于布局的盒子必须都是BFC,这样才稳定。

形成BFC的方法:

1、overflow:hidden;

2、脱标了(浮动、绝对定位、固定定位)

3、display的值是inline-block或者flex

BFC的作用:

1、让内部浮动的元素,把自己撑出高

2、实现左固定宽度、右自动撑满的布局

3、阻止margin塌陷

这里,可以依次展开说一下BFC的作用。

1、让内部浮动的元素,把自己撑出高

比如:

<div>
    <p></p>
    <p></p>
    <p></p>
    </div>

p浮动了,那么div就不会被撑起来了。

此时可以给div设置overflow: hidden;根据CSS规定,如果盒子是BFC,那么此时就能被浮动的内部元素撑起来。

2、实现左固定宽度、右自动撑满的布局

<div class="left"></div>
<div class="right"></div>

left盒子浮动,设置固定宽度;right盒子默认会钻到left底下去,但是只要给right盒子设置overflow:hidden; 那么right盒子就是BFC了,根据CSS规定,BFC盒子不会被浮动遮挡。因此,right盒子就不钻到left底下了,而是在它的右侧乖乖的撑满,符合题目要求。

3、阻止margin塌陷

<p>我是一个段落</p>
<div>
    <p>我是一个段落</p>
</div>

默认情况,竖直方向的margin会塌陷,但是如果给p标签添加一个div包裹,并且给div盒子设置overflow: hidden; 那么就不塌陷了。

13. 清除浮动

当父元素内部有浮动元素,并且父元素本身没有设置height值时,需要清除浮动。

也就是说,当父元素设置了height值,则什么事儿也没有,不需要清除浮动。

换句话说,浮动的元素一定要被关在一个“稳定”的大盒子中,否则会乱套。

用代码来说:

<div> → 这个div没有设置height,完了,出事儿了
    <p>浮动了</p>
    <p>浮动了</p>
    <p>浮动了</p>
</div>
<div> → 这个div没有设置height,完了,出事儿了
    <p>浮动了</p>
    <p>浮动了</p>
    <p>浮动了</p>
</div>

7.png

看图,明明是两个div中的p,现在连成了一行。

怎么解决??答:给div加height属性就行了!

人生就是这么完美,但是!!总有面试官爱瞎琢磨:如果不加height,还有什么方法能够让页面不乱套么??

哎……清除浮动这个话题,就火了起来。我们必须为了面试,而学习这个知识。

说白了,工作时,老老实实加height,就不涉及清除浮动哦~~

13.1 如何清除浮动?

13.1.1 方法1:BFC法

给大盒子添加 overflow: hidden; 大盒子就是BFC了,根据BFC的性质,大盒子此时能被浮动的子盒子撑出高了,从而浮动元素被关在里面了。

<div> → 添加overflow: hidden;
    <p>浮动了</p>
    <p>浮动了</p>
    <p>浮动了</p>
</div>
<div> → 添加overflow: hidden;
    <p>浮动了</p>
    <p>浮动了</p>
<p>浮动了</p>

8.png

这种方法在工作中很常用,永远滴神。(当然,最最常用的还是老老实实设置height,就不用清除浮动啦。但是有的工程师,即使设置了 height ,也会用 overflow: hidden 呀,这叫做“稳上加稳”)

13.1.2 方法2:clear:both法

给大盒子添加 clear: both; 属性。clear属性是CSS提供的属性,就表示清除浮动,所以算是“正规军”。添加 clear:both; 的盒子,它的左右两边不会被浮动影响,能够保证布局不乱套。

这种方法能够让页面板式不乱套,能基本解决问题,但是大盒子还是没有高,心里还是膈应,觉得不稳定。

<div> → 添加clear:both;
    <p>浮动了</p>
    <p>浮动了</p>
    <p>浮动了</p>
</div>
<div> → 添加clear:both;
    <p>浮动了</p>
    <p>浮动了</p>
    <p>浮动了</p>
</div>

9.png

13.1.3 方法3:clearfix法

clearfix法本质上是在大盒子所有子元素的最后,添加一个清除浮动的元素。用代码来说就是:

<div>
    <p>浮动了</p>
    <p>浮动了</p>
    <p>浮动了</p>
    ★ 这儿添加一个清除浮动的元素
</div>
<div>
    <p>浮动了</p>
    <p>浮动了</p>
    <p>浮动了</p>
    ★ 这儿添加一个清除浮动的元素
</div>

看见代码中的五角星了么?我们的思路就是在每个div所有子元素的最后(注意不是div后,而是它里面原有子元素的最后)添加一个清除浮动的元素。

这个元素可以用“伪元素” 就是“冒号冒号阿福特儿”来添加。哈哈,就是 ::after 。

准备这样的CSS代码:

.clearfix::after {
    content: '';
    clear: both;
    display: block;
}

这段CSS代码中,“冒号冒号阿福特儿”就是“伪元素”,可以在携带 clearfix 类名的盒子所有子元素的最后添加一个新元素。这个新元素有 clear:both 属性,并且使用了 display: block 转为了块级元素。

那么 content: '' 是什么鬼?这是伪元素的规定,必须写一个 content 属性,否则伪元素创建不出来。

值得一提的是, clearfix 类名是约定俗成的,表示清理修补……也不知道是哪位大神最先使用这个类名的,但是大家都跟风,沿用至今。

好啦,准备完这个类名,就可以给大盒子添加 clearfix 类名了:

<div class="clearfix">
    <p>浮动了</p>
    <p>浮动了</p>
    <p>浮动了</p>
</div>
<div class="clearfix">
    <p>浮动了</p>
    <p>浮动了</p>
    <p>浮动了</p>
</div>

浮动乱套的事儿就被解决了,并且div也被撑出高啦。

这种方法在工作中很常用!(当然,最最常用的还是老老实实设置height,就不用清除浮动啦。但是有的工程师,即使设置了height,也会用clearfix呀,这叫做“稳上加稳”)

13.1.4 方法4:隔墙法

隔墙法就是在两部分结束之后,用一个新的div分割上下两部分,稳稳隔开它们,看它们还敢乱套??!!

<div>
    <p>浮动了</p>
    <p>浮动了</p>
    <p>浮动了</p>
</div>
<div></div> → 这是一堵墙,设置了clear: both; 稳稳的分开了上下两部分
<div>
    <p>浮动了</p>
    <p>浮动了</p>
    <p>浮动了</p>
</div>

这种方法挺好用的,有的前端程序员就是喜欢隔墙,就是心里觉得稳。