CSS关于属性值是百分比的知识盘点

罗嗦的开头

早上感觉不对劲,一睁眼就发现媳妇趴在我身上,她告诉我她的手机找不到了问我看没看到。我去啊~我刚睡醒谁特么知道你手机丢哪里去了?我就直接告诉她我没看到,而且我刚睡醒怎么可能知道。我又告诉她是不是早上上厕所了放厕所了,而且昨天晚上她是玩手机玩睡着的。这样看来,手机在厕所的几率是30%,手机在卧室的几率是70%。不过她非说是我藏起来的。我欲哭无泪啊,我说你再无理取闹我就不理你了。就算你用白花花的大美腿来诱惑我也没用。就像下面这张图一样。

说什么都不行,媳妇不依不饶,我算是无奈了。不过还好最后在床下面找到了。我看了看表才特么6点钟,这娘们这么早爬起来第一反应就是看自己的手机。算是没救了……不过她竟然在我申辩之后竟然不相信自己的老公,也着实可恶。我要处罚她……

不过,仔细想想。百分比这种方式在我们的日常生活中还是比较常见的。例如我百分百没有×××,你百分百×××,某某百分百是×××等等。在我们的工作学习中百分比的形式更是多见。CSS中有些属性的值存在百分比的形式的,今天就来做个总结把这些属性百分比的知识加深下理解。

width和height

在页面中很多元素都是可以设置widthheight的。设置可能值的形式中也包含百分比。在早期网页设计中使用table经行布局时,为了保证表格能响应内容的变化,很多人都会使用百分比的值来渲染table。后来经过技术的演化迭代,table布局逐渐没落,div+css开始兴起。给widthheight设置固定的PX成为主流。百分比table的形式荣光不再,但伟大的想法总会是卷土重来。再后来移动客户端兴起,响应式布局也随着开始火起来。百分比也就是解决响应视口变化的不二法门。DIV+CSS、百分比形式再加上@media三者的结合有称霸前端的趋势。当然现在似乎更前沿的是css中的flex布局,这个有机会再聊。

前面说了这么多,其实widthheight设置百分比还是很容易被理解的,就是参照物是父元素。例如width:50%就是说元素的宽度是父元素宽度的50%,height:30%就是高度是父元素高度的30%。这个没什么要特别说的,就是对应父元素的属性值进行百分比计算,widthwidthheightheight。看下面的图就能理解。

width和height百分比计算方式

margin和padding

marginpadding的百分比是个比较难以理解的属性。当然它也是相对于父元素来计算自己百分比的值的,不过计算方式有点奇葩,它们是基于父元素的宽度(width)来进行计算的。margin-left/margin-rightpadding-left/padding-right基于父元素宽度还好理解,奇葩点就是margin-top/margin-bottompadding-top/padding-bottom的百分比也是基于父元素的宽度来计算的。什么个情况?难道不是widthheight的计算方法啊?

margin和padding百分比计算方式

上面的图中可以清晰的看出来实际渲染结果却是是按照父元素宽度的百分比来设置的。margin-top:10%;的实际渲染结果50px;padding-top:1%;的实际渲染效果是5px,它们都是根据父元素的宽度width:500px;产生的计算结果。这个试验印证了:子元素边距和填充距的值设为百分比,那么它的计算方式就是根据父元素的宽度(width)来进行计算的。另外提一下的是,在上面的图中可以看到我在父元素设置了一个overflow:hidden;的声明。这个是为了防止margin collapsing的出现。关于margin collapsing的详细介绍出门右转在我的文章《浅析让人D疼的margin折叠》中有说明。

嗯!奇葩的百分比,我也跟着奇葩了。我竟然不说原理直接上实验结果了。酒香不怕巷子深,这点小小的“奇葩”不耽误我们理解这个知识点。从相应的官方文档《8.3 Margin properties》也能看到相应的说明。下面引用相应关于margin的资料。

The percentage is calculated with respect to the width of the generated box’s containing block. Note that this is true for ‘margin-top’ and ‘margin-bottom’ as well. If the containing block’s width depends on this element, then the resulting layout is undefined in CSS 2.1.

蹩脚的翻译:该百分比相对于设置元素的包含块的宽度计算。如果包含块的宽度取决于此元素,那么在CSS 2.1中的结果布局是未定义的。

然后这里是引用相应关于padding的资料,它来自于《5. The padding properties》

Note that percentages on ‘padding-top’ and ‘padding-bottom’ are relative to the width of the containing block, not the height (at least in a horizontal flow; in a vertical flow they are relative to the height).Note that percentages are not required for CSS level 2.

蹩脚的翻译:注意“padding-top”和“padding-bottom”的百分比与包含块的宽度有关,而不是高度(至少在水平流中),在垂直流中它们与高度相对应。CSS level2不需要百分比。

问题来了,为什么是基于宽度来计算呢?

这是因为我们的“阅读模式”导致的,我们都是“从左向右逐字,由上到下逐行”的阅读习惯,这种模式也就决定了宽度必须是固定的,而高度是可以无限扩展的。在一个高度可以随时扩展且是无限的容器内,百分比的计算结果就会不固定,这个有悖于我们的“排版、布局”的设计初衷,页面元素变的不容易可控。

所以依据宽度固定的计算结果能更好的控制“设计结果”。其实这是西方的阅读方式,我们中国的传统阅读习惯是“从上到下逐字,从右向左逐列”的模式,没办法谁让这玩意是人家发明的呢。

如果使用属性writing-mode改变文本流的方向变成垂直流的话,那么这个计算方式就不是依据父元素的宽度了,而是依据复原度的高度。因为在垂直文本流中,高度变成固定而宽度变成了可以无限扩展。这个介绍到这里差不多了,继续下一个。

position

position是个大宝贝儿,不管是position:absolute;还是position: relative;使用方位都非常广。关于两者的区别不再过多啰嗦,这篇文章只关于百分比的问题。设置完毕position之后可以根据top/right/bottom/left属性的值来对元素进行定位,它们的取值形式中也还有百分比。关于百分比是和谁有关呢?先买个关子。我们先来建立一个概念,让我们的脑海中有个“逆Y轴坐标”——自己胡乱起的名字,别较真~

position坐标系

有了这个图之后,再理解top/right/bottom/left属性的百分比值就容易许多。说白了其实还是与父元素的widthheight属性有关。从图上可以知道top就是和父元素height有关,其他的几个属性的百分比计算也是一样,都是通过父元素来确定自己的值的。

需要注意的是top/right/bottom/left属性在同方向上只能有一个属性有效,例如设置了top再去设置bottom就会无效,设置了right再去设置left就会无效。如果四个同时设置,只会生效两个。他们的权重是上大于下,左大于右,意思是同时设置上下,那么上生效。同时设置左右,左生效。

而且在设置不同的组合,相当于原点来计算的元素顶点位置也是不一样的。具体情况如图:

position坐标系对应原点计算的顶点差异

常用的就这些了,不过还没完嘿嘿嘿~

进入中级装逼模式

盒模型影响

上面所有的情况都是在常规盒模型下的结果。也就是box-sizing: content-box;时的结果。如果修改为怪异盒模型即box-sizing: border-box;之后,计算方式没有变,该与谁有关就与谁有关。可是计算结果会多出一步来,就是需要减去borderpadding的值。

因为在标准盒模型下,宽和高的值就是固定的,是不包含borderpadding的。而怪异盒模型下的宽和高是包含borderpadding的值的。换句话说:在标准盒模型下,百分比的计算和宽高的值有关,拿来直接计算;在怪异盒模型下,百分比的计算是和容器真实大小有关(宽高 减去 margin-padding=真实大小)。关于盒模型的概念在我的文章《盒模型与box-sizing》中很详细的说明。

举个例子就能验证下我的说法是否正确。点击进入“栗子”

如果我的心算没有错,橙色块的width:80px;height:15px;,我要快点闪了,没时间贴验证图了。自己可以进入浏览器调试模式,选中橙色的块看下我的心算结果对不对。我闪了,88~

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

推荐阅读更多精彩内容

  • 问答题47 /72 常见浏览器兼容性问题与解决方案? 参考答案 (1)浏览器兼容问题一:不同浏览器的标签默认的外补...
    _Yfling阅读 13,709评论 1 92
  • 1. 前言 前端圈有个“梗”:在面试时,问个css的position属性能刷掉一半人,其中不乏工作四五年的同学。在...
    YjWorld阅读 4,407评论 5 15
  • 选择qi:是表达式 标签选择器 类选择器 属性选择器 继承属性: color,font,text-align,li...
    wzhiq896阅读 1,723评论 0 2
  • 选择qi:是表达式 标签选择器 类选择器 属性选择器 继承属性: color,font,text-align,li...
    love2013阅读 2,299评论 0 11
  • 今天晚上,我们一家人去吃西餐了。那里的桌子都是木头做的,座椅上全都摆放着抱枕,抱枕上的图案很漂亮,有小鸟和梅...
    LionKing为阅读 189评论 0 0