不少css属性的取值均可以是百分比值。虽然形式上来讲,百分比值都是数字后跟%
的形式(注意数字和%
之间不能够有空格),但在不一样的使用场合下,其意义会有不少不一样。所以,百分比值能够说包含了至关丰富的内容。css
要理解诸如100%
这样的百分比值,其关键点是要明白,百分比是必定有其对应的参照值的。也就是说,百分比值是一种相对值,任什么时候候要分析它的效果,都须要正确找到它的参照。html
一个css属性值从定义到最终实际使用,是存在一个过程的。这其中涉及到Specified Values(指定值)、Computed Values(计算值)、 Used Values(使用值)、Actual Values(实际值)等概念,能够想见到,百分比值实际会在这个过程当中,根据它的参照计算转化为一个绝对值(好比100px
),而后再被应用。这就是百分比值的意义。css3
更多关于css属性值的处理过程的信息,能够查看Value Processing。bootstrap
简单地说,就是可变性。这能够衍生出自适应、响应式等看起来颇有用的东西。segmentfault
好比说,一个固定宽高的盒子,而后但愿盒子内有一个绝对定位的,宽高和盒子同样的盖板(就这样称呼吧...),下面这样的写法会很合适:浏览器
.box{position:relative;width:100px;height:100px;} .box_cover{position:absolute;width:100%;height:100%;left:0;top:0;}
这里使用百分比值的好处的是,若是须要修改盒子的尺寸,只须要修改盒子的宽高,而盖板会自动保持和盒子的尺寸一致。布局
再一个例子是Bootstrap的栅格系统:post
能够看到,栅格系统里会用到百分比值来实现确切的对空间的划分。百分比值是相对的,自适应的,所以栅格系统能够很好地用于响应式设计。测试
宽和高在使用百分比值时,其参照都是元素的包含块(Containing Block,详情)。width
参照包含块的宽度,height
参照包含块的高度。在大部分状况下,包含块就是父元素的内容区(盒模型里的content)。spa
我之前写过width:100%; height:100%;
这样的代码来实现尺寸和父元素一致。但我发现有时候宽度是符合意思(100%)的,但高度却没有效果。请看下面这个示例:
能够看到,直接父元素(包含块)是否有明确的高度定义,会影响height
为百分比值时的结果。
关于这一点的详细解释是,当一个元素的高度使用百分比值,若是其包含块没有明确的高度定义(也就是说,取决于内容高度),且这个元素不是绝对定位,则该百分比值等同于auto
。auto
是初始默认值,因此看起来就像是“失效”了。
若是元素是根元素(<html>
),它的包含块是视口(viewport)提供的初始包含块(initial containing block),初始包含块任什么时候候都被认为是有高度定义的,且等于视口高度。因此,<html>
标签的高度定义百分比老是有效的,而若是你但愿在<body>
里也用高度百分比,就必定要先为<html>
定义明确的高度。这就是为何在固定页脚一文中,有html, body{height:100%;}
这样的写法。
这2个属性属于混合属性,也经过一个例子说明:
能够分析获得,对于margin
和padding
,其任意方向的百分比值,参照都是包含块的宽度。
为何会多个方向都取包含块的宽度做为参照呢?在我看来,包含块的宽度在块布局的排版中是最有用的(想象一下word里输入文字,到宽度边缘后换行的场景),对应的,水平方向的内外边距必定要参照包含块的宽度。再考虑垂直方向的内外边距,它们若是不和水平方向取相同的参照物,就会由于不一致而很难使用。因此,整体来讲,统一以包含块的宽度做为参考,会具备相对最好的可用性。
严格地说,参照是包含块的宽度,是在样式属性writing-mode
为默认值时的状况。不过这个属性极少被用到,因此在此不作考虑。
你也许见过有人用下面的代码来让一个矩形变成恰好的圆形(请体会这个“恰好”):
.circle{border-radius:50%;}
对此的解释是,为一个元素的border-radius
定义的百分比值,参照物是这个元素自身的尺寸。也就是说,假如这个元素宽是60px,高是50px(border-box的尺寸),那么border-radius:50%
的结果等同于border-radius:30px/20px;
。
若是你还疑惑这里带/
的圆角写法,请查看MDN对border-radius的说明。
background-position
的初始值就是百分比值0% 0%
。下面是一个使用示例:
background-position
的百分比值,取的参照是一个减法计算值,由放置背景图的区域尺寸,减去背景图的尺寸获得,能够为负值。对照上面的示例,思考一下,应该能够感觉到,以这个减法计算值为参照的话,正好能够符合咱们感官上对背景图位置的理解。
这个属性包括水平位置和垂直位置,它们分别参照的是宽度减法计算值和高度减法计算值。
你可能注意到了上面示例的最后一个居然写了4个值(通常都只用2个值)。关于它的意义,请查看W3C的background-position。
参照是直接父元素的font-size
。例如,一个元素的直接父元素的font-size
是14px
,不管这个是直接定义的,仍是继承获得的,当该元素定义font-size:100%;
,得到的效果就是font-size:14px;
。
参照是元素自身的font-size
。例如,一个元素的font-size
是12px
,那么line-height:150%;
的效果是line-height:18px;
。
参照是元素自身的line-height
(和前面颇有关联吧,因此我排在了这里)。例如,一个元素的line-height
是30px
,则vertical-align:10%;
的效果是vertical-align:3px;
。
对这个属性我还想说,尽管vertical-align
可使用数字,百分比值,但浏览器兼容性差别较大,在跨浏览器实现时可能须要较多hack。所以,我我的倾向于使用middle
等相对来讲兼容性差别较小的关键字类型的值。
参照是元素的包含块。left
和right
是参照包含块的宽度,bottom
和top
是参照包含块的高度。
平移变换,在水平方向和垂直方向上也可使用百分比,其参照是变换的边界框的尺寸(等于这个元素本身的border-box尺寸)。例如,一个宽度为150px
,高度为100px
的元素,定义transform:translate(50%, 50%)
的效果是transform:translate(75px, 50px);
。
还能够补充一点,translate3d
对应是还有第三个维度的,可是,通过测试,最后的第3个值不可使用百分比(不然样式定义无效)。至于为何不能够参照呢,大概是由于那是神秘的第三维度吧...
若是你想要知道更多的百分比值在css属性中的可用状况及参照值,请参考MDN的CSS percentage values。
请注意,当百分比值用于可继承属性时,只有结合参照值计算后的绝对值会被继承,而不是百分比值自己。例如,一个元素的font-size
是14px
,并定义了line-height:150%;
,那么该元素的下一级子元素继承到的line-height
就是21px
,而不会再和子元素本身的font-size
有关。
好不容易终于看完了这么多百分比值的用法,有兴趣要使用一些吗?(・-・*)
我本身的见解是,百分比值是css所提供的一种创建元素与元素之间,或者元素的不一样属性之间的关联性的有效方法。只要是想创建一种关联性,均可以适当考虑使用百分比值。并且,不需本身作任何动态的事件处理和更新,任什么时候候,你均可以信赖这个百分比。
(从新编辑自个人博客,原文地址:http://acgtofe.com/posts/2014/06/percentage-in-css)