从头开始复习css之浮动

最近几天有点忙,所以没有什么时间来写东西,所以一晃就又是一周了。现在开始来复习浮动的概念吧。

一、 浮动最开始的作用

关于浮动,我们首先由这样一个图片来引入

女神镇楼

这种排版是刚开始社会上广泛使用报纸、新闻的排版。我们发现无论是行内元素,还是块级元素,我们都没办法去完美兼容这种结构。为了解决这种图文混杂的排版,从而制定了float(浮动)的规则。具体的代码如下:

// css
img{
  float: left
}
// html
<p>刘亦菲...
<img src="https://ss0.baidu.com/6ONWsjip0QIZ8tyhnq/it/u=1970534157,1154154617&fm=58&bpow=1500&bpoh=2164"/>
</p>。2004年...

我们发现简简单单的使用了一个float就能解决掉这个问题了。那么接下来我们来看一下到底什么是浮动?

二、 使用浮动及浮动注意事项

说到浮动,先从字面上的定义开始说起吧。
浮动:顾名思义就是,使具有浮动的元素漂浮起来。那么我们为什么需要浮动呢?他除了做文字环绕之外,还有没有其他的用处呢?

我们这里有这样一个需求:将三个div/块级元素放在同一行上面

如果知道行内块元素的同学立马就能想到了,用'display:inline-block'规则呀。好那我们如他所愿,使用行内块元素,具体代码如下:

//css
*{
  margin: 0;
  padding: 0;
}
.common {
  width: 100px;
  height: 100px;
  display: inline-block;
        }
.son1{
  background-color: skyblue;
}
.son2{
  background-color: red;
}
.son3{
  background-color: blue;
}
// html
<div>
  <div class="son1 common"></div>
  <div class="son2 common"></div>
  <div class="son3 common"></div>
</div>

效果如下:

效果

从上面的效果上面我们可以清楚的发现:使用inline-block虽然能够使得块级元素身处一行内,但是相邻块级元素之间有明显的空隙。
那我们用今天的浮动来试试看呢?我们修改一下css里面的.common规则

.common {
  width: 100px;
  height: 100px;
  /*display: inline-block;*/
  float: left;
}

效果如下:

效果

通过上面的实际的例子我们发现在使用浮动之后,不仅多个块级元素在一行进行排列,而且相邻块级元素之间的空隙也不存在了。

通过上面的实例,我们初步的领略到了浮动所带来的好处。查阅资料我们发现浮动有三个可选的属性值:

  • left 靠左浮动
  • right 靠右浮动
  • none 不要浮动
    这里值得注意的一点是:
    浮动的框可以向左或向右移动,直到它的外边缘碰到包含框或另一个浮动框的边框为止。
    怎么理解呢?来看下面一段代码:
// css
*{
  margin: 0;
  padding: 0;
}
.parent{
  width: 400px;
  height: 100px;
  background: pink;
  margin: 200px;
}
.common {
  width: 100px;
  height: 100px;
  float: left;
  background: red
}
.parent>div:nth-child(even){
  background-color: skyblue;
}
// html
<div class="parent">
  <div class="common"></div>
  <div class="common"></div>
  <div class="common"></div>
</div>

效果如下:


效果

从上面的效果我们就可以清楚的解读上面那句话了,子元素的浮动边界点是父元素的边际,所以值得我们注意的就是:我们需要给浮动元素来加一个父元素来给子元素定位。

三、 浮动带来的负面印象

上面说了这么多浮动带来的好处和用处,那么是不是意味着,我们就可以无所顾虑、随意的使用浮动呢?
来看下面一段代码:

// css
*{
  margin: 0;
  padding: 0;
}
.parent-brother {
  width: 400px
  width: 400px;
  height: 100px;
  background: pink;
}
.common {
  width: 100px;
  height: 100px;
  float: left;
  background: red
}
.parent>div:nth-child(even){
  background-color: skyblue;
}
// html
<div class="parent">
  <div class="common"></div>
  <div class="common"></div>
  <div class="common"></div>
</div>
<div class="parent-brother"></div>

效果图如下:

效果

从这里我们发现,div.parent元素并没有被子元素的所撑开。这里就要谈到所谓浮动,子元素相当于是漂浮起来的,飘在空中自然就没有高度,所以底下的元素自然就会占据parent的位置。
结合我在开发中遇到的,我认为浮动主要有下面有个副作用

  • 背景不能显示
    由于浮动产生,父元素的大小没有被撑开,会导致父元素的背景失效

  • 2、边框不能撑开
    同样由于浮动产生,父元素的大小没有被撑开,会导致父元素的border失效

  • 3、margin padding设置值不能正确显示
    由于浮动导致父级子级之间设置了css padding、css margin属性的值不能正确表达。特别是上下边的padding和margin不能正确显示

四、 清除浮动

既然上面说了这么多的问题是不是就意味着,我们就不应该用float呢?

首先在讲清除浮动的时候,我们要谈到一个属性:clear。
他的定义是:规定元素的哪一侧不允许其他浮动元素。所以他有下面几个可选值:
1、 left 在左侧不允许浮动元素。
2、 right 在右侧不允许浮动元素。
3、 both 在左右两侧均不允许浮动元素。
4、 none 默认值。允许浮动元素出现在两侧。
5、 inherit 规定应该从父元素继承 clear 属性的值。

通过上面的clear的说明我们就知道clear属性肯定跟我们的清除浮动操作息息相关,我呢?就结合我在自己做项目时候亲身发现的几种清除浮动的方式。(不一定用到了clear哦!)

  • 父元素添加overflow属性
    这个很简单,就是在父元素增加一个overflow属性
.parent{
  overflow: auto;
}

效果如下:

效果

这里为什么会清除浮动呢?是由于overflow不是none属性下面触发了BFC导致清除了浮动。关于BFC 我在后面专门写文章来讲解,今天太晚了 就不展开了。但是很多情况下并不希望去设置overflow。此时就需要使用到以下几种方式了。

  • 增加空子元素清除浮动
    来看下面一段代码:
// css
*{
  ... 和上面相同
}
.clear{
  clear: both;
}
// html
<div class="parent">
        ...
<div class="clear"></div>
</div>
  <div class="parent-brother">
</div>

效果如下:


效果

我们发现浮动在增加了上面的规则之后.parent会被子元素被撑开了。这样就达到了我们的目的了

  • before伪元素
    来看下面一段代码:
.parent:after {
  content: "";
  display: block;
  height: 0;
  visibility: hidden; 
  clear: both;
}

效果如下:


效果

同样用after伪元素也达到了上面的效果。

  • before,after双伪元素
.parent:before,.parent:after{
  content: "";
  display: table;   
}
.parent:after{
  clear:both;
}

效果

同样达到了我们想要的效果,这里实现的原理和第一条元素一样,display:table同样也触发了BFC,BFC不仅能清除浮动,并且能防止内外边距合并。我这里就多做赘述了。

说在最后

好了,没想到一个简单的东西随便一写就是一个晚上,自己觉得还没有将这部分完美的给剖析清楚。总之关于浮动这一块呢?其实我们要保持敬畏之心,但是不要敬而远之 能用则用 用好了 对你样式的提升还是比较巨大的。快12点了 睡觉了。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,761评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,953评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,998评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,248评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,130评论 4 356
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,145评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,550评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,236评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,510评论 1 291
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,601评论 2 310
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,376评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,247评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,613评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,911评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,191评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,532评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,739评论 2 335

推荐阅读更多精彩内容

  • 问答题47 /72 常见浏览器兼容性问题与解决方案? 参考答案 (1)浏览器兼容问题一:不同浏览器的标签默认的外补...
    _Yfling阅读 13,705评论 1 92
  • 第一部分 HTML&CSS整理答案 1. 什么是HTML5? 答:HTML5是最新的HTML标准。 注意:讲述HT...
    kismetajun阅读 27,347评论 1 45
  • CSS 是什么 css(Cascading Style Sheets),层叠样式表,选择器{属性:值;属性:值}h...
    崔敏嫣阅读 1,461评论 0 5
  • 一、CSS入门 1、css选择器 选择器的作用是“用于确定(选定)要进行样式设定的标签(元素)”。 有若干种形式的...
    宠辱不惊丶岁月静好阅读 1,576评论 0 6
  • 学习完整课程请移步 互联网 Java 全栈工程师 本节视频 【视频】平台即服务-Registry-配置 WebUI...
    撸帝阅读 2,116评论 0 0