清除浮动塌陷的4种经典套路

 

 

 

 

 

 

 

 

 

 

 

【自古深情留不住,总是套路得人心。】

 

这些日子,各个朋友圈随时可以见到这句话的身影。的确人们常说:“多一点真诚,少一点套路。”,但是最终现象写实也是那么残酷和无奈。

同样在前端攻城狮的道路,我们都是真诚尽心尽力的去学习进取。奈何先是各大浏览器厂商的大战不断,导致我们这群学习的人苦不堪言,一片水生火热呀。不得不想进各种hack方法解决。(没错,这里就是吐槽的IE6!)

 

 

 

 

 

 

图片来自与网络

其次文档标准流,在浮动之后也会挖下塌陷的大坑。初学者稍有不慎,塌陷的失控的子元素到处乱窜,弄的你鸡飞狗跳苦不堪言。那么为了后面前端大道越行越远,下面就跟大家讲解一下清除浮动的套路演变。

不过在讲套路得时候,咱们顺带的也把浮动之后塌陷大坑给顺便重现一样。

浮动塌陷大坑:

先来看一个小小的demo:现在有两个div,div身上没有任何属性。每个div中都有li,这些li都是浮动的先是html骨架部分

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

css样式

  

 

 

 

 

 

 

 

 

看到这里,如果说没有吃过浮动塌陷大亏的同学,肯定会以为这个网页中效果是这个样子

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

就是这么自信

但是实际上浏览器最终的渲染的样子: 

残酷的事实

结果:第二个div中的li,去贴第一个div中最后一个li的边了。

原因:div没有高度,不能给自己浮动的孩子们,一个容器。所以第二个div中的li,去贴第一个div中最后一个li的边了!

这种现象又称作为浮动塌陷现象

讲完浮动塌陷之后,让我开始回归今天的正题。清除浮动塌陷的4种套路方法

套路1:给浮动的元素的上级添加高度

如果一个元素要浮动,那么它的祖先元素一定要有高度。高度的盒子,才能关住浮动。

只要浮动在一个有高度的盒子中,那么这个浮动就不会影响后面的浮动元素。所以就是清除浮动带来的影响了。

所以只需要给li的上级ul或者div设置一个height:40px;(只要是浮动元素的上级元素就可以。),那么第二个div就好挤下来,在第一个盒子下面显示出来。

套路2:clear:both;

但是在实际开发过程当中中,高度height很少出现。为什么?因为能被内容撑高!那也就是说,刚才我们讲解的方法1,工作中用的很少。

那么这里有人可会脑洞大开:能不能不写height,也把浮动清除了呢?也让浮动之间,互不影响呢?

事实上的确有这样的解决方法,是给他的上级添加一个clear:both;首先Clear就是清除的意思,both,代表左浮动和右浮动都清除掉。通俗一点来讲,就是说清除别人对我的影响。

  

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

虽然说这样可以清除浮动塌陷现象,但是同样也会有一个致命的问题。那就是两个div之间,margin值失效了,无法设置。再重申一下,是指两个div之间。

套路3:隔墙法

既然用clear:both会导致两个div之间margin失效,那么到后面有人又开始脑洞大开了。在中间一个空盒子,然后给那个空盒子clear:both;(为了方便大家看效果,这里并没有放的是空盒子,而是放的有一个有高度、有颜色的盒子。)

 

这样加了一堵墙之后,第二个div就能掉下来并且不干扰了上面的元素。而且第二个div还是能通过magin-top调节两个div(“墙体”div不要算进去)之间的间距,所以隔墙法作为一个新的套路沿传开来。

套路3.1:隔墙法进化版—内墙法

在这个世界上面存在一种人--完美主义者,在他们的世界观里面瑕疵是坚决不允许的。然后在前端行业中,也有一批追求完美主义前端攻城狮。他们对于隔墙法的小瑕疵表示完全不能接受,所以这一群完美主义的前端攻城狮开始对他的隔墙法的完美的改造进化去了。

于是“内墙法”横空诞生,先来看一下代码结构:

  

 

 

 

 

 

 

 

 

 

 

 

 

只是将墙体的位置改变了,就完美的解决第一个div不能通过margin-bottm来调节与下面div之间的间距。

所以后面很长一段时间,“内墙法”成为各大公司清除浮动主流写法。

套路4:overflow:hidden;

overflow就是“溢出”的意思,hidden就是“隐藏”的意思。

 

 

 

 

 

 

 

 

 

 

 

通过截图可以看出内容太多,溢出了盒子。这个时候添加一行代码overflow:hidden;发现溢出盒子边框的内容,被隐藏看不到了。

 

 

 

 

 

 

 

 

 

 

这个样式本意就是清除溢出到盒子外面的文字。但是,被某些前端攻城狮工程师发现它能做偏方。写法简单粗暴,好理解。属于在W3C文档额外扩展,就好比当初发明摩托车的人绝对不会想到,摩托车还能开这么开。

 

 

 

 

 

 

 

 

 

 

 

 

 

所以这个overflow:hidden;也算是一个“祖传老偏方”,能治浮动塌陷老毛病。当然既然是“偏方”,肯定就有因为有些特殊情况下不能解决。导致只是沦为“偏方”而排不上正统。

偏方的失效情况:

就是当其中涉及到position定位的时候,若定位的区域超出那个盒子,overflow:hidden;就会把多的部分裁切掉。

 

 

来自iTunes和天猫截图合成

各位试想一下,假设这个蓝色方框代表DIV盒子,如果给这个DIV盒子添加一个overflow:hidden;属性后果会咋样,估计产品当天就提刀来见。

所以除了这个老毛病,overflow:hidden;其简单粗暴的写法,还是有与“内墙法”一争正室能力。

小结:

其实还有很多套路能够清除浮动,比如给浮动塌陷的元素再添加一个浮动,添加一个绝对定位……等一些方法。太多方法奇招怪招了,有兴趣的小伙伴再另行研究。

目前只讲这4种前端开发过程主流清除浮动塌陷的套路,听完这四种套路之后,以后各位小伙伴将采用哪一种方式清除浮动呢!估计很多小伙伴会使用“内墙法”来清除浮动的,的确内墙法以前是很流行。但是随着时代是不断进步的,很多企业在实际开发过程当中不再单纯的使用了“内墙法”

这里估计有人就会吐槽了,不是说好了主流清除浮动就4种套路吗?这4种套路就目前就“内墙法”没有暴露问题,难不成用冷门的?

别着急,现在企业里面采用的清除浮动方法综合法,又名内墙法2.0

 

 

 

 

 

 

 

给浮动塌陷的盒子添加一个:after伪类

这种方法在各个大型项目上都有出现过,可谓清除浮动的万金油呀!本来说好的四种套路,现在除了那四种套路之外却一下子延伸出好几种清除浮动的套路,估计有些小伙伴要晕了吧。

下面让我们通过思维导图来帮助,晕头的小伙们整理思路吧!

 

  

 

 

 

 

 

 

 

之所以给各位小伙伴绕了这么大一个圈子,就是怕直接就把这种方法拿出来告诉大家。肯定会有小伙伴疑惑为什么要这么写,而此时看到相信各位看完本文的套路介绍之后,对清除的浮动的方法有了更深刻的了解了吧。

原创文章,文笔有限,才疏学浅,文中若有不正之处,再次再次再次欢迎各位啪啪的打脸赐教。(有句话说的好,重要的词得说三遍。)

 

 

我是车大棒,我的目标是星辰与大海。

转载于:https://www.cnblogs.com/chedabang/p/5973601.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/573075.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql standalone模式_Boss7 Standalone模式开发配置

PS:以下配置均添加到standalone.xml文件中。1.Get请求编码设置,将如下配置添加到标签之后2.开启开发模式:搜索“urn:jboss:domain:web:1.1”,在此标签下添加如下配置:3.虚拟域名设置搜索“urn:jboss:domain:web:1.1”&…

python ide: pycharm

1, 设置python路径 2,运行py文件 https://www.jetbrains.com/help/pycharm/2016.1/creating-and-running-your-first-python-project.html#d50296e226 3, 格式化代码 From the main menu, select Code | Reformat Code or press CtrlAltL. 转载于:https://www.cnblo…

Android 滑动菜单框架--SwipeMenuListView框架完全解析

SwipeMenuListView(滑动菜单) A swipe menu for ListView.--一个非常好的滑动菜单开源项目。 Demo 一、简介 看了挺长时间的自定义View和事件分发,想找一个项目练习下。。正好印证自己所学。 在github上找到了这个项目:SwipeMenuL…

JAVA 开发axis2_基于Apache axis2开发Java Web服务

1.安装配置axis2环境下载好后把axis2-1.4.1-war目录下面的axis2.war发布到tomcat的webapps中。发布好,访问:http://localhost:8079/axis2/ 界面如下:2.开发web服务1)创建一个java web project2)编写服务代码1 public classSampleService {23…

Git小技巧 - 指令别名及使用Beyond Compare作为差异比较工具

前言 本文主要写给使用命令行来操作Git的用户,用于提高Git使用的效率。至于使用命令还是GUI(Tortoise Git或VS的Git插件)就不在此讨论了,大家根据自己的的喜好选择就好。我个人是比较推荐使用命令行的,因为命令行是原生…

java cache-control_详解浏览器Cache-Control缓存策略

原来用的是 Expires 策略,浏览器可以直接从浏览器缓存读取数据,而无需再次请求,它的值对应一个 GMT,来告诉浏览器资源缓存过期时间,如果还没过该时间点则不发请求。例如下面的例子,这是京东的首页里找的一个,时间都干到 2027 年了…

前端必备切图ps篇

前言:当设计师通过photoshop工具设计完设计稿导出psd文件时,我们前端工程师该如何进行切图转换成网页的所需的图片呢,接下来讲讲如何利用photoshop工具快速简洁的切图,因为ps工具用到的行业很多,涉及到的各个行业&…

jenkins配置记录(2)--代码发布流程

在我们的日常运维工作中,使用jenkins来完成业务代码发版上线是至关重要的一环。前面已经提到在jenkins上添加用户权限的操作,今天重点说下如何在jenkins下构建项目工程进行代码发布? 在此简单介绍下jenkins进行代码发布的流程(根据…

autoitv3点击windows界面

在自动化测试过程中会遇到如下windows安全认证,需要输入账号和密码,这个认证对话框不属于element元素。无法用selenium操作,需要用autoitv3操作,输入账号密码后,再进行web元素操作。 有2中方式: 第一种&…

java 扩展接口_详解常用的Spring Bean扩展接口

前言Spring是一款非常强大的框架,可以说是几乎所有的企业级Java项目使用了Spring,而Bean又是Spring框架的核心。Spring框架运用了非常多的设计模式,从整体上看,它的设计严格遵循了OCP----开闭原则,即:1、保…

c盘java文件误删_C盘爆满怎么办,教你有选择性删除文件,恢复空间

有很多朋友说电脑c盘有很多垃圾,占着空间,还导致电脑响应变慢。还不知道能不能删除,很困扰。那么c盘文件都是什么文件呢?哪些能删除,做一次全面的清理呢?下面给大家介绍一下program Date:系统文…

java向另一activity输入_Activity经典实例一:两个Activity传递数据和对象

1、概述:Activity类直接或者间接地继承了Context、ContextWrapper、ContextThemeWrapper等基类,因此Activity可以直接调用它们的方法。创建一个Activity需要实现某些方法,常见的是实现onCreate(Bundle status)方法,该方法将会在Ac…

深入理解JSON对象

深入理解JSON对象 前面的话 json(javascript object notation)全称是javascript对象表示法,它是一种数据交换的文本格式,而不是一种编程语言,用于读取结构化数据。2001年由Douglas Crockford提出,目的是取代繁琐笨重的XML格式。本…

java内存分配模型优点_高并发实战(二)-并发基础 缓存 MESI 内存模型

左图为高速缓存 右图为多级缓存数据的读取和存储都经过高速缓存,CPU核心与高速缓存有一条特殊的快速通道。主存与高速缓存都是连接在系统总线上,当然其他组件也是在此基础上进行通信的。在高速缓存出现后不久,系统变得愈加复杂,高…

CentOS 7 安装SVN服务端

CentOS7下安装SVN服务 1. yum命令即可方便的完成安装# sudo yum install subversion 测试安装是否成功:# svnserve --version 更改svn的默认配置(更改默认的指向目录和默认端口)# sudo vim /etc/sysconfig/svnserve编辑示例:OPTIONS"-r /data/svn -…

.NET简谈事务、分布式事务处理

在本人的 “ .NET简谈事务本质论”一文中我们从整体上了解了事务模型,在我们脑子里能有一个全局的事务处理结构,消除对数据库事务的依赖理解,重新认识事务编程模型。 今天这篇文章我们将使用.NET C#来进行事务性编程,从浅显、简单…

css compressor java_利用YUI Compressor压缩JS/CSS之终极秘籍

JS/CSS的压缩已经不是什么新鲜话题了,自打YSlow推出后,这方面的优化话题是铺天盖地啊;不过当时作为后知后觉的我,甚至都没法完整地写出一份漂亮的JS/CSS的代码,何尝会去注意呢?!时至今日&#x…

HTML 列表中的dl,dt,dd,ul,li,ol区别及应用

HTML 列表中的dl,dt,dd,ul,li,ol区别及应用 HTML 列表中的dl,dt,dd,ul,li,ol区别及应用 工具/原料 html&#xff0c;dw软件方法/步骤 1无序列表 无序列表是一个项目的列表&#xff0c;此列项目使用粗体圆点&#xff08;典型的小黑圆圈&#xff09;进行标记。 无序列表始于 <…

自然语言10_分类与标注

sklearn实战-乳腺癌细胞数据挖掘(博客主亲自录制视频教程) https://study.163.com/course/introduction.htm?courseId1005269003&utm_campaigncommission&utm_sourcecp-400000000398149&utm_mediumshare http://www.tuicool.com/articles/feAfi2 NLTK读书笔记 — …

git中Please enter a commit message to explain why this merge is necessary.

Please enter a commit message to explain why this merge is necessary. 请输入提交消息来解释为什么这种合并是必要的 git 在pull或者合并分支的时候有时会遇到这个界面。可以不管(直接下面3,4步)&#xff0c;如果要输入解释的话就需要: 1.按键盘字母 i 进入insert模式 2.修…