zoukankan      html  css  js  c++  java
  • 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会让人生不如死

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

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

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

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

  • 相关阅读:
    异常
    gateway 网关
    Hystrix 图形化界面
    Hystrix 服务限流
    linux-CenOS修复内核或修改内核系统启动顺序
    Linux-CentOS不能yum update/upgrade.除非是初始环境
    Linux-CentOS配置网卡
    安装SQLSERVER2008提示错误SQL100MSI
    金蝶采购标志
    Pycharm社区版安装外部库文件
  • 原文地址:https://www.cnblogs.com/zhaohuiziwo901/p/4676611.html
Copyright © 2011-2022 走看看