Web前端从入门到精通-8 css简介——清除浮动

欢迎大家回来,上节课呢,已经给大家初步介绍了浮动以及浮动的原理

通过上节课的学习,我们终于可以把竖着的列表转成横的

但是转成横的之后更加麻烦的事情还在后头

不过大家不要怕,只要跟我走就OK,呵呵

废话说完了之后,进入正题

首先我们加深一下对浮动的认识

上节课我们只是说了列表排成一排的情况

大家不妨设想一下如果有两排、三排甚至多排的话应该怎么做呢?

我们先不管这么多东西,先来个一排的

这个布局相信大家一定能看懂

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>test</title>
    <style type="text/css">
    .list-wrap{ width:306px; height:102px; border:1px solid red;}
    .list-wrap li{ width:100px; height:100px; border:1px solid black; float:left;}
    </style>
</head>
<body>
    <ul class="list-wrap">
        <li>li1</li>
        <li>li2</li>
        <li>li3</li>
    </ul>
</body>
</html>

在这里我先说明一点,.list-wrap的width设为306px而不是300px是因为每个li除了有100px的宽度之外左右还各有1px的border

所以实际上每个li占位大小为102px,高度设为102px的原因也就自然不用再多解释了

预览之后左边会有一个间距,上节课解释过后相信大家也一定知道是怎么回事——ul的一个padding

上节课我们也说过加了浮动的元素会飘起来,飘到距离它最近的块元素父级

所以我们挨个分析,li1毫无疑问飘到了ul的左上角,那么li2和li3为何会一次靠在li1后面呢?

其实道理也很简单,li1 li2 li3都在天上飞着,而且飞的高度也都一样

当li1挨住ul之后 li2再想挨住ul就必须要越过li1,但是上天没有赐予它某种特殊能力让它越过li1,所以只能乖乖靠在li1的后面

li3也是同理

分析到这里之后,相信大家对浮动会有更深的了解

但是我们的浮动要是有这么简单就太好了,我也就没有必要如此强调它的重要性了

( ⊙ o ⊙ )!,不小心又吓唬了大家一下,I'm so sorry! 呵呵

言归正传

如果想要实现两行,每行三个,那么li就是6个

那就再ul里面再加上3个li不就好了嘛

没错,的确是这样

但是大家再想想,父级ul的宽度只有306px

第四个li想要靠着第三个li,但是又没有它的容身之处

第四个li一气之下就会跑到下一行,直接挨住离它最近的块元素父级ul

第五个和第六个li就会接着排在第四个li的后面

那么父级为了要装下多出来的这3个li,也一定要变高才行

所以这时我们父级的ul要再加102px,顺便问一句,为什么不是100px应该不用再解释了吧?

经过上面一番折腾,我还是故意不给大家贴出代码,直接看效果

顺便在这里说一下我每次只给大家效果图而不给大家代码的原因:

如果给出了大家代码,那么你不自觉的就会省点事直接把代码拷走最后一预览,和我贴的预览图一样

心里想着"恩,就是这么回事,我会了,这一节可以过去了"

但是实际上你根本都没有会,因为你没有动脑子,即使真的会了,过不了多久就会忘的一干二净

因为我就是这样学过来的

哎呀,不小心又成了“说教家”了,呵呵

好了,到这里可能大家感觉一切都挺好的

但是我们做开发一定要考虑程序的可维护性

什么意思呢?在写代码的过程中要考虑各种情况,不能只做片面的决定

具体到我们的这个例子中的话该注意哪些地方呢?

我们的列表貌似不是一年三百六十五天每天都是6个li吧?

如果要是按照我们目前的做法的话

好了,假如今天有3个li,高度设置成102px

明天有6个li,高度设置成204px

哪一天又变成了3个li,高度再重新设置成102px

每天都要检查一遍这个地方li的数量是否有变化,然后再根据li的数量得到相应的ul的height

...

好麻烦啊

实际上在开发的过程中呢,我们遇到这种列表的时候通常是不会给ul加height的

说完这句话,大家一定很惊奇,不给ul加height的话,ul的height难道会自动伸缩吗?

好的,带着这个疑问,我们把ul的height去掉,看看效果不就知道了么?

效果很诡异,ul好像瞬间消失了,不过大家仔细观察一下

观察一下所有li上面的那条红线

猜一猜那条红线的高度是多少像素呢?

好的,大家尽管把浏览器放大去认真看哈

我直接告诉大家了,那条红线高度是2px

这是我截的放大的图

大家尤其要注意我上面用绿色的框框住的那部分

好像li把下面1px的红色给挡住了

好的,说了这么多,大家基本上也猜出来怎么回事了

ul不会跟我们想的那样那么智能,自己根据li数量自动变到我们想要的高度,这个红线不是别的什么东西,就是ul,只不过ul的高度变成了0

所以看起来像一条红线了

好的,大家一定在想,为什么ul的高度变成了0呢?

实际上是这样的,如果所有的子元素都加了浮动,那么父元素的高度就不会随着子元素撑高

换句话说,是因为所有的子元素都加了浮动的原因才让父元素的高度为0的

但是我们往往既需要子元素浮动使其排成一排,又想让父元素随着子元素来撑高

那这时候就需要清除浮动,注意我们所说的清除浮动并不是说将元素的float:left或者float:right再清除掉去掉

而仅仅是希望父元素随着子元素撑高

其实依我个人之拙见,清除浮动这个名字本身叫的根本不对,应该就叫父元素随着子元素撑高

因为我们清除浮动实际上做的事情就是让父元素随着子元素撑高

但是大家一直都叫清除浮动,所以就跟着这么叫了

不过一定要注意的是清除浮动绝对不是把float:left或者float:right清除掉

好的,废了半天话了,具体怎样清除浮动呢?

很简单,我们只需要给加了浮动的元素的父级加一个类.clear

这个类包括以下内容

.clear:after{ clear:both; display:block; content:"";}

如果一切顺利的话,父元素就会按照我们想的那样,随着子元素的高度撑开

代码加到哪个地方,怎么加,这个艰难的任务就要留给大家去做了

好了,既然知道加上这个类就好用了

那大家一定想知道为什么加上这个类就好了,这个类有什么神奇之处

这个问题一句两句说不完,而且需要了解一些浏览器解析机制的问题

我们在css收尾的部分再给大家做介绍

还有一点需要注意的是我们的这个.clear类是兼容IE8+ Firefox Chrome的版本

如果想兼容IE6和IE7,还是有些问题的

但是在当今的市场上,如果大家在一线城市求职遇到需要兼容IE6或IE7的公司的话

可以考虑都不用考虑了

由于市场上已经淘汰了IE6 7,所以我在这一系列文章中并没有阐述IE6 7的兼容问题

毕竟兼容IE6 7会让人生不如死

最后,我们再从另外一个角度理解一下本节课中很重要的一句话:

如果所有的子元素都加了浮动,那么父元素的高度就不会随着子元素撑高

换言之,如果所有的子元素都没有加浮动,父元素的高度就会随子元素撑高吗?

大家可以试试,我们下节课再见

原文地址:https://www.cnblogs.com/zhaohuiziwo901/p/4676611.html