博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
浮动 二 文字围绕现象(中)
阅读量:5978 次
发布时间:2019-06-20

本文共 3840 字,大约阅读时间需要 12 分钟。

接着讲block-level box了。。。

block-level box

不知道block-level box是如何产生的童鞋,请移驾,找第21条。会不会有童鞋疑惑 —— 块状的box竟然也能画圈圈 。。。哈哈哈,本小姐变给你看!

要让块状的box画圈圈,得配合一定的形势!试想,如果这个block-level box在float box之前,它能够画吗?

例一 block-level box在前,float box在后

        
I'm block-level box. I'm block-level box.
复制代码

效果如下:

哎,没有与float box同行耶!

我知道了!是因为block-level box的宽度太长,他俩一行放不下!——童鞋甲兴奋的说道

好!就按你说的来,改短点。

修改例一的CSS代码:

.normal-child{		width:300px;		border:solid 1px rgba(247, 79, 79, 0.56);		text-align:center;		margin-bottom:10px;	}复制代码

效果如下:

不科学呀,怎么没同行,不同行怎么围。。。怎么围。。。怎么。。。怎。。。。。。

童鞋,对于block-level box而言,能不能围起float box不光是看宽度的!

当block-level box在float box之前,由于本身的特性,它自己会独占一行,不给其他box一点机会(别跟我说positioned box啊,人为计算距离故意设置的不算!),那么float box也只能移居下方了。因此,要想围起float box,就得把block-level box放置float box之后!

考虑三种block-level box:1. 非visible的;2. visible的block box;3.非block box的block-level box。至于为什么要酱紫分,接着看。

1. 非visible的block box

看过的童鞋应该知道,非visible的block box会为它的内容(也就是它的子孙)建立一个新的block formatting context。

这个功能有什么作用呢?

在CSS渲染时,该box将以一个整体参与到当前的block formatting context中(这个context不一定是父box建立的,也可能是祖父box哈),而它的子孙只会参与到它所建立的block formatting context。

不懂?上栗子!

例二 整体参与,且宽度够小可与float box同行

        
I'm first non-visible block box after float box
I'm second non-visible block box after float box
I'm third non-visible block box after float box
复制代码
效果如下:
上图中,每个div
.normal-child 占据一行,div里面的文字很乖的排在里面,并没有移动到上一行的空余位置上,这说明div是以一个整体形式参与到当前的block formatting context中(如果不是整体参与,第三个div里的文字应该跑到第二个div的后面,对不对啦)。

至于为什么float box会与block-level box同行?这一方面取决于float box本身的浮动特性,它可以与block-level box及inline-level box同行;另一方面取决于当前的形势。就如同一位厨师,要想做出一桌满汉全席,他首先得具备做满汉全席的能力,其次他需要原材料,这样才能真正的做出来。

浮动特性没什么好说的,完全由css控制。我来说说形势。

因为float box是脱离了普通流(normal flow), 那么不管block-level box是排在float box之前还是之后,它都会假设float box不存在,并确定好自己的位置。待float box渲染时,float box会回到自己原本的位置,如果自己的位置被占了怎么办,其他box会自觉的向反方向流动,若该行没有足够空间放置其他box,那么它们会委屈下移。

看本例,float box宽度加上一个div.normal-child的宽度依然小于containing block()的宽度,那么它们可并排同行。

例三 整体参与,且宽度够大不可同行

        
I'm non-visible block box after float box, and have a longer width
复制代码

效果如下:

可以看到,如果float box的宽度加上block box的宽度超过了containing block的宽度,排在后面的block box就会自动下移,而这也说明了非visible的block box是整体参与到当前的block formatting context,文字并没有被包裹成匿名的block box上移到float box的右边(按常理,文字只有被包裹成匿名的block box才可以参与到block formatting context中)。

例四 整体参与,且宽度为auto

      
I'm a child in non-visible block box
复制代码

效果如下:

上例中,我并没有指定跟在float box后面的div的宽度,那么对于这种情况,即便div的子box的宽度超过了除float box之外的剩余宽度,div产生的block box依然会与float box同行,因为它的宽度任意啊!!!width为auto的情况下,将overflow设为非visible就是无敌啊!另外,该div同样是以一个整体的形式参与到当前的block formatting context中,里面的文字参与的是该div所建立的inline formatting context。

小结:对于block-level box为非visible的block box,因为它具备建立一个block formatting context 的特殊功能,故它始终是以一个整体(包含它本身及子box)的形式参与到当前的block formatting context中。如果要达到包围的效果,只需将多个该类型的box放置float box之后,且宽度小于w( w = containing block的宽度 - float box的宽度 )即可。

2. 非block box的block-level box

由于非block box的block-level box与非visible的block box很相似,这边先分析。

非block box的block-level box是么尼呢?不知道的童鞋翻翻 的第21,22,23条,display为table的非replaced元素及display为block / list-item / table的 replaced元素均会产生非block box的block-level box。

我们来看看他们的行为。

例五 table围绕float box

        
I'm block-level box, but not block box.
I'm block-level box, but not block box.
I'm block-level box, but not block box.
复制代码

与例二相比,去掉了class 类normal-child的overflow设置,并将display设为table,效果如下:

竟与例二的效果惊人的一致 。。。

其实,overflow值不为visible的block box 与 非block box的block-level box都是以一个整体形式参与当前的block formatting context,所以他们在float box的前后时行为会表现一致。不信!?那就把例三和例四中的normal-child.div 都替换为table试试看吧。

小结:看上个小结(窃笑中。。。)

还有一个visible的block box没分析,想留着下篇写。。。不要骂我懒,这篇已经够大家消化了,下篇再见哈!

ps: 本文中的例子均是在chrome 49.0上测试。

转载地址:http://sgpox.baihongyu.com/

你可能感兴趣的文章
互联网趋势关键词:交流,为价值付费,资源整合
查看>>
阿里钉钉,马云旗下的又一个千亿美金产品?
查看>>
Oracle 11gR2学习之三(创建用户及表空间、修改字符集和Oracle开机启动)
查看>>
熟练掌握Word2003中的突出显示功能
查看>>
编码过程中的问题总结
查看>>
网页与APP中那些优美的登陆表单
查看>>
Git:配置
查看>>
神经系统知识普及
查看>>
Spring可扩展Schema标签
查看>>
c++ STL unique , unique_copy函数
查看>>
http://miicaa.yopwork.com/help/overall/
查看>>
浅谈关于特征选择算法与Relief的实现
查看>>
mybatis-spring 项目简介
查看>>
Wireshark抓取RTP包,还原语音
查看>>
Behavioral模式之Memento模式
查看>>
Work Management Service application in SharePoint 2016
查看>>
Dos 改动IP 地址
查看>>
Laravel 源码解读:php artisan make:auth
查看>>
【转】ionic run android 成功launch success,但是genymotion虚拟机没有显示
查看>>
苹果在GitHub上正式开源iOS内核源码
查看>>