Css权威指南(4th,第四版中文翻译)-10.Floating 和 Shapes

很长一段时间里面,floated元素是作为网页布局的基石。


浮动

在过去只能浮动图片,table。而CSS可以让所有元素都支持浮动。通过float属性来支持:


image.png

比如想要把image浮动到左边,可以使用下面的方式:

<img src="b4.gif" style="float: left;" alt="b4">
image.png

浮动的元素

浮动元素和一般的元素有几个区别。第一,他从正常的文档流里面跳出来了。另外虽然有自己的放置位置,不过浮动元素还是会影响文档中的其他元素。因为当一个元素浮动后,周围的其他元素就需要浮动环绕着它。这要浮动图片的时候是用的比较多的,不过同样可以作用于段落。在下图留着那个,可以比较清晰的看到这一效果:

p.aside {float: right; width: 15em; margin: 0 1em 1em; padding: 0.25em; border: 1px solid;}
image.png

一个重要的关于浮动元素的点就是margin不会合并。如果给一张图片20px的margin,那么最终的显示效果其margin至少是20px,比如下面的例子:

p img {float: left; margin: 25px;}
image.png

另外值得注意的就是对于不可替代的元素,必须申明其width。不然的话浏览器会以默认的1个字符的宽度显示:


image.png

浮动的细节

在浮动中有一个专有名词叫容器盒子(containing block)。浮动元素的容器盒子其实就是离他最近的一个block父元素。另外有一系列的规则用于设置浮动元素的位置布局:

  1. 浮动元素的左右外部边界必须在容器盒子的左右内边界内。

其实也很好理解,既然是容器,那么浮动元素肯定不能超过这个容器的大小,如下图所示:

image.png
  1. 浮动元素不准交叠
image.png
  1. 浮动元素的上边界不准高于所有早期的floating和block元素


    image.png
  2. 浮动元素必须尽量从上往下排

应用的行为

基于上面的标准,我们可以窥见浮动元素预计排布的规律。但我们首要要解决的就是浮动元素高于父元素的情况。
举例来说:


image.png

上面看上去正常么,你可能觉得再正常不过,而实际是因为没有加背景,来看下:


image.png

而且如果浮动元素内嵌套浮动元素,也会出现更加奇怪的效果:


image.png

负的margin

按照之前的介绍,可以想见负的margin会导致元素跳出父元素框。来看个例子,我们想left和top的margin都设置为-15px,效果如下图所示:


image.png

Clearing

在进入shape的说明之前,我们首先来看看如果来放置浮动内容在浮动元素间穿过。比如:


image.png

这就需要clear属性的使用:


image.png

举个例子,为了确保所有的h3元素不放在向左浮动元素的右边,我们需要这样定义:

h3 {clear: left;}

这样就可以确保h3元素的左边不会有浮动的元素。


image.png

如果为了保证两边都没有浮动元素则可以使用both:

h3 {clear: both;}
image.png

如果设置了none,那么就会允许元素左右两边都可以有浮动元素:

h3 {clear: both;}
<h3 style="clear: none;">What's With All The Latin?</h3>
image.png

浮动的形状 Shapes

在了解了基本的形状以后,我们开关注下浮动的形状,它是支持非矩形的图形的。

生成一个形状

如果要定义浮动内容的形状,首先需要定义的就是shape-outside:


image.png

none的话就是没有形状,浏览器会采取默认的margin box。
首先我们来通过图片定义浮动元素的形状,这也是最简单的改变形状的方式之一。来看个月亮的例子:

img.lunar {float: left; shape-outside: url(moon.png);} 
<img class="lunar" src="moon.png">
image.png

值得注意的就是文字的话会在浮动元素的一边填充图片中背景透明的区域,比如上图和下图:

p {text-align: right;}
img.lunar {float: right; shape-outside: url(moon.png);}
image.png

那如果图片没有透明设置呢,比如JPEG,那就只能显示一个方块了。必须具有alpha通道才可以。
下面来看看<basic-shape>和<shape-box>的值,basic shape有下面几种:

  • inset()
  • circle()
  • ellipse()
  • polygon()

而shape box 有下面这几种:

  • margin-box
  • border-box
  • padding-box
  • content-box

下面是不同的示例:


image.png

默认是margin box。

inset的形状

如果之前用过border 图片中的clip属性,那么inset其实是很类似的。没用过也没关系,本身并不复杂。其定义的就是每条边朝内的距离。举个例子:

shape-outside: inset(2.5em);

这个会从外面的margin box向里推进2.5em,而如果要设置从哪个box往里面推,可以使用对应的box:

shape-outside: inset(2.5em) padding-box;
image.png

另外对于inset里面的值,可以用传统的CSS的赋值方式,1-4个都可以:

shape-outside: inset(23%);
shape-outside: inset(23% 23% 23% 23%); /* same as previous */
shape-outside: inset(1em 13%);
shape-outside: inset(1em 13% 1em 13%); /* same as previous */
shape-outside: inset(10px 0.5em 15px);
shape-outside: inset(10px 0.5em 15px 0.5em); /* same as previous */

同时边角也可以round,跟border-radius类似:

shape-outside: inset(7%) round 5px;
shape-outside: inset(7% round 0.5em/5px);
image.png

圆形和椭圆形

这两种形状的定义都是类似的,本来圆形就是特殊的椭圆。

shape-outside: circle(25px); 
shape-outside: circle(25px at center); 
shape-outside: circle(25px at 50% 50%);
image.png

不过半径如果超过的边框的大小,有时候也会出现问题:

img {shape-outside: circle(25px at center);} 
img#small {height: 30px; width: 35px;}
image.png

这时候我们可以通过相关的值来控制边界:

shape-outside: circle(closest-side); 
shape-outside: circle(farthest-side at top left); 
shape-outside: circle(closest-side at 25% 40px); 
shape-outside: circle(farthest-side at 25% 50%);
image.png

而对于椭圆来说,最大的区别就是要定义两个半径:


image.png

对于百分比值来说,其标准为box的两边:


image.png

多边形

多边形的定义其实就是点的定义,每个点以逗号分隔,可以定义任意多个点,每个点表明其x-y坐标:

 polygon(25px 0, 50px 25px, 25px 50px, 0 25px)

而多边形是不允许超出box shape的边界的,超过了也会被clip掉:


image.png

另外我们还可以控制填充颜色的规则:

 polygon(nonzero, 51% 0%, 83% 100%, 0 38%, 100% 38%, 20% 100%)
 polygon(evenodd, 51% 0%, 83% 100%, 0 38%, 100% 38%, 20% 100%)
image.png

控制shape的图片透明度

之前我们说到浮动元素只有透明区域是可以侵入的,但是我们可以通过shape-image-threshold来控制:


image.png

这一属性可以让不同透明度的范围暴露在文字中,比如设置个0.5:


image.png

添加一个shape的margin

浮动元素的形状定义好后,我们其实可以加个margin的通过:


image.png

例如:

img {float: left; margin: 0; shape-outside: url(star.svg); 
border: 1px solid hsla(0,100%,50%,0.25);}
#one {shape-margin: 0;} 
#two {shape-margin: 1.5em;} 
#thr (shape-margin: 10%;}

image.png

同时可以对不同的边进行单独的设置:

#two {shape-margin: 1.5em; margin: 0 1.5em 1.5em 0;} 
#thr (shape-margin: 10%; margin: 0 10% 10% 0;}

image.png

小结

浮动作为CSS中比较基础的一个方面,但同样非常有用和强大。借助它我们实现了文字的环绕显示,而且形状也不仅仅限于矩形了。

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

推荐阅读更多精彩内容