浮动 二 文字围绕现象(中)

接着讲block-level box了。。。

block-level box

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

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

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

<html>
  <head>
  <style type="text/css">	
	.parent{
		width:500px;
		height:120px;
		margin:20px auto 0;
		padding:10px;
		line-height:30px;
		font-family:"Times New Roman",Georgia,Serif;
		border:solid 2px rgba(247, 79, 79, 0.56);
	}
	.normal-child{
                width:100%;
		border:solid 1px rgba(247, 79, 79, 0.56);
		text-align:center;
		margin-bottom:10px;
	}
	.float-child{
		width:100px;
		height:50px;
		float:left;
		margin-right:10px;
		box-sizing:border-box;
		background:rgba(247, 79, 79, 0.56);
	}	
  </style>
  </head>
<body>
  <div class='parent'>
    <div class='normal-child'>I'm block-level box. I'm block-level box.</div>
    <div class='float-child'>
</div>
  </div>
</body>
</html>
复制代码

效果如下:

哎,没有与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的block box(第23条);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同行


<html>
  <head>
  <style type="text/css">	
	.parent{
		width:500px;
		height:130px;
		margin:20px auto 0;
		padding:10px;
		line-height:30px;
		font-family:"Times New Roman",Georgia,Serif;
		border:solid 2px rgba(247, 79, 79, 0.56);
	}
	.float-child{
		width:100px;
		height:50px;
		float:left;
		margin-right:10px;
		box-sizing:border-box;
		background:rgba(247, 79, 79, 0.56);
	}	
	.normal-child{
		width:350px;
		overflow:auto;
		border:solid 1px rgba(247, 79, 79, 0.56);
		margin-bottom:5px;
		padding-left:5px;
		
	}
  </style>
  </head>
<body>
  <div class='parent'>
    <div class='float-child'></div>
	<div class='normal-child'>I'm first non-visible block box after float box</div>
	<div class='normal-child'>I'm second non-visible block box after float box</div>
	<div class='normal-child'>I'm third non-visible block box after float box</div>
  </div>
</body>
</html>
复制代码
效果如下:
上图中,每个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(看第11条)的宽度,那么它们可并排同行。

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

<html>
  <head>
  <style type="text/css">	
	.parent{
		width:500px;
		height:130px;
		margin:20px auto 0;
		padding:10px;
		line-height:30px;
		font-family:"Times New Roman",Georgia,Serif;
		border:solid 2px rgba(247, 79, 79, 0.56);
	}
	.float-child{
		width:100px;
		height:50px;
		float:left;
		margin:0 10px 10px 0;
		box-sizing:border-box;
		background:rgba(247, 79, 79, 0.56);
	}	
	.normal-child{
		width:450px;
		overflow:auto;
		border:solid 1px rgba(247, 79, 79, 0.56);
		padding-left:5px;
	}
  </style>
  </head>
<body>
  <div class='parent'>
    <div class='float-child'></div>
    <div class='normal-child'>I'm non-visible block box after float box, and have a longer width</div
  </div>
</body>
</html>
复制代码

效果如下:

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

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

<html>
  <head>
  <style type="text/css">	
	.parent{
		width:500px;
		height:auto;
		margin-top:50px;
		margin-left:auto;
		margin-right:auto;
	}
	.float-child{
		width:200px;
		height:200px;
		background-color:rgba(247, 79, 79, 0.56);
		margin-right:10px;
                float:left;
	}
	.normal-child{
		overflow:auto;
		height:200px;
	}
	.special-child{
		width:350px;
		height:100px;
		border:solid 2px rgba(247, 79, 79, 0.56);
		padding:10px;
	}	
  </style>
  </head>
<body>
<div class='parent'>
  <div class='float-child'></div>
  <div class="normal-child">
    <div class="special-child">I'm a child in non-visible block box</div>
  </div>
</div>
</body>
</html>
复制代码

效果如下:

上例中,我并没有指定跟在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

<html>
  <head>
  <style type="text/css">	
	.parent{
		width:500px;
		height:130px;
		margin:20px auto 0;
		padding:10px;
		line-height:30px;
		font-family:"Times New Roman",Georgia,Serif;
		border:solid 2px rgba(247, 79, 79, 0.56);
	}
	.float-child{
		width:100px;
		height:50px;
		float:left;
		margin-right:10px;
		box-sizing:border-box;
		background:rgba(247, 79, 79, 0.56);
	}	
	.normal-child{
		width:350px;
		display:table;
		border:solid 1px rgba(247, 79, 79, 0.56);
		margin-bottom:5px;
		padding-left:5px;
		
	}
  </style>
  </head>
<body>
  <div class='parent'>
    <div class='float-child'></div>
	<div class='normal-child'>I'm block-level box, but not block box.</div>
	<div class='normal-child'>I'm block-level box, but not block box.</div>
	<div class='normal-child'>I'm block-level box, but not block box.</div>
  </div>
</body>
</html>
复制代码

与例二相比,去掉了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上测试。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值