早上感觉不对劲,一睁眼就发现媳妇趴在我身上,她告诉我她的手机找不到了问我看没看到。我去啊~我刚睡醒谁特么知道你手机丢哪里去了?我就直接告诉她我没看到,而且我刚睡醒怎么可能知道。我又告诉她是不是早上上厕所了放厕所了,而且昨天晚上她是玩手机玩睡着的。这样看来,手机在厕所的几率是30%,手机在卧室的几率是70%。不过她非说是我藏起来的。我欲哭无泪啊,我说你再无理取闹我就不理你了。就算你用白花花的大美腿来诱惑我也没用。就像下面这张图一样。
说什么都不行,媳妇不依不饶,我算是无奈了。不过还好最后在床下面找到了。我看了看表才特么6点钟,这娘们这么早爬起来第一反应就是看自己的手机。算是没救了……不过她竟然在我申辩之后竟然不相信自己的老公,也着实可恶。我要处罚她……
不过,仔细想想。百分比这种方式在我们的日常生活中还是比较常见的。例如我百分百没有×××,你百分百×××,某某百分百是×××等等。在我们的工作学习中百分比的形式更是多见。CSS中有些属性的值存在百分比的形式的,今天就来做个总结把这些属性百分比的知识加深下理解。
在页面中很多元素都是可以设置 width 和 height 的。设置可能值的形式中也包含百分比。在早期网页设计中使用 table 经行布局时,为了保证表格能响应内容的变化,很多人都会使用百分比的值来渲染 table 。后来经过技术的演化迭代, table 布局逐渐没落,div+css开始兴起。给 width 和 height 设置固定的PX成为主流。百分比 table 的形式荣光不再,但伟大的想法总会是卷土重来。再后来移动客户端兴起,响应式布局也随着开始火起来。百分比也就是解决响应视口变化的不二法门。DIV+CSS、百分比形式再加上 @media 三者的结合有称霸前端的趋势。当然现在似乎更前沿的是css中的 flex 布局,这个有机会再聊。
前面说了这么多,其实 width 和 height 设置百分比还是很容易被理解的,就是参照物是父元素。例如 width:50% 就是说元素的宽度是父元素宽度的50%, height:30% 就是高度是父元素高度的30%。这个没什么要特别说的,就是对应父元素的属性值进行百分比计算, width 对 width ; height 对 height 。看下面的图就能理解。
margin 和 padding 的百分比是个比较难以理解的属性。当然它也是相对于父元素来计算自己百分比的值的,不过计算方式有点奇葩,它们是基于父元素的 宽度(width) 来进行计算的。 margin-left/margin-right 和 padding-left/padding-right 基于父元素宽度还好理解,奇葩点就是 margin-top/margin-bottom 和 padding-top/padding-bottom 的百分比也是基于父元素的宽度来计算的。什么个情况?难道不是 width 和 height 的计算方法啊?
上面的图中可以清晰的看出来实际渲染结果却是是按照父元素宽度的百分比来设置的。 margin-top:10%的实际渲染结果50pxpadding-top:1%的实际渲染效果是5px,它们都是根据父元素的宽度 width:500px产生的计算结果。这个试验印证了: 子元素边距和填充距的值设为百分比,那么它的计算方式就是根据父元素的宽度( width )来进行计算的。 另外提一下的是,在上面的图中可以看到我在父元素设置了一个 overflow:hidden的声明。这个是为了防止margin collapsing的出现。关于margin collapsing的详细介绍出门右转在我的文章 《浅析让人D疼的margin折叠》 中有说明。
嗯!奇葩的百分比,我也跟着奇葩了。我竟然不说原理直接上实验结果了。酒香不怕巷子深,这点小小的“奇葩”不耽误我们理解这个知识点。从相应的官方文档 《8.3 Margin properties》 也能看到相应的说明。下面引用相应关于 margin 的资料。
然后这里是引用相应关于 padding 的资料,它来自于 《5. The padding properties》 。
问题来了,为什么是基于宽度来计算呢?
这是因为我们的“阅读模式”导致的,我们都是“从左向右逐字,由上到下逐行”的阅读习惯,这种模式也就决定了宽度必须是固定的,而高度是可以无限扩展的。在一个高度可以随时扩展且是无限的容器内,百分比的计算结果就会不固定,这个有悖于我们的“排版、布局”的设计初衷,页面元素变的不容易可控。
所以依据宽度固定的计算结果能更好的控制“设计结果”。其实这是西方的阅读方式,我们中国的传统阅读习惯是“从上到下逐字,从右向左逐列”的模式,没办法谁让这玩意是人家发明的呢。
如果使用属性 writing-mode 改变文本流的方向变成垂直流的话,那么这个计算方式就不是依据父元素的宽度了,而是依据复原度的高度。因为在垂直文本流中,高度变成固定而宽度变成了可以无限扩展。这个介绍到这里差不多了,继续下一个。
position是个大宝贝儿,不管是 position:absolute还是 position: relative使用方位都非常广。关于两者的区别不再过多啰嗦,这篇文章只关于百分比的问题。设置完毕 position 之后可以根据 top/right/bottom/left 属性的值来对元素进行定位,它们的取值形式中也还有百分比。关于百分比是和谁有关呢?先买个关子。我们先来建立一个概念,让我们的脑海中有个“逆Y轴坐标”——自己胡乱起的名字,别较真~
有了这个图之后,再理解 top/right/bottom/left 属性的百分比值就容易许多。说白了其实还是与父元素的 width 和 height 属性有关。从图上可以知道 top 就是和父元素 height 有关,其他的几个属性的百分比计算也是一样,都是通过父元素来确定自己的值的。
需要注意的是 top/right/bottom/left 属性在同方向上只能有一个属性有效,例如设置了 top 再去设置 bottom 就会无效,设置了 right 再去设置 left 就会无效。如果四个同时设置,只会生效两个。他们的权重是上大于下,左大于右,意思是同时设置上下,那么上生效。同时设置左右,左生效。
而且在设置不同的组合,相当于原点来计算的元素顶点位置也是不一样的。具体情况如图:
常用的就这些了,不过还没完 嘿嘿嘿 ~
上面所有的情况都是在常规盒模型下的结果。也就是 box-sizing: content-box时的结果。如果修改为怪异盒模型即 box-sizing: border-box之后,计算方式没有变,该与谁有关就与谁有关。可是计算结果会多出一步来,就是需要减去 border 和 padding 的值。
因为在标准盒模型下,宽和高的值就是固定的,是不包含 border 和 padding 的。而怪异盒模型下的宽和高是包含 border 和 padding 的值的。换句话说: 在标准盒模型下,百分比的计算和宽高的值有关,拿来直接计算;在怪异盒模型下,百分比的计算是和容器真实大小有关(宽高 减去 margin-padding=真实大小)。 关于盒模型的概念在我的文章 《盒模型与box-sizing》 中很详细的说明。
举个例子就能验证下我的说法是否正确。点击进入 “栗子”
如果我的心算没有错,橙色块的 width:80pxheight:15px,我要快点闪了,没时间贴验证图了。自己可以进入浏览器调试模式,选中橙色的块看下我的心算结果对不对。我闪了,88~
层叠性 是指多种CSS样式的叠加,也是浏览器处理冲突的一个能力,如果一个属性通过两个相同选择器设置到同一个元素上,那么这个时候一个属性就会将另一个属性层叠掉。
定义CSS样式时,经常出现两个或更多规则应用在同一元素上
·选择器相同,则执行层叠性
·选择器不同,就会出现优先级的问题,就会涉及CSS权重计算。
下面我们详解介绍 CSS层叠性权重计算方法。
1) 权重计算公式
关于CSS权重,我们需要一套计算公式来去计算,这个就是 CSS Specificity(特殊性)
值从左到右,左面的最大,一级大于一级,数位之间没有进制,级别之间不可超越。
·关于CSS权重,我们需要一套计算公式来去计算,这个就是 CSS Specificity(特殊性)
2) 权重叠加
我们经常用交集选择器,后代选择器等,是有多个基础选择器组合而成,那么此时,就会出现权重叠加。
就是一个简单的加法计算
div ul li ------>0,0,0,3
.nav ul li ------>0,0,1,2
a:hover -----—>0,0,1,1
.nav a ------>0,0,1,1
注意:
数位之间没有进制 比如说: 0,0,0,5 + 0,0,0,5 =0,0,0,10 而不是 0,0, 1, 0, 所以不会存在10个div能赶上一个类选择器的情况。
3) 继承的权重是0
这个不难,但是忽略很容易绕晕。其实,我们修改样式,一定要看该标签有没有被选中。
1) 如果选中了,那么以上面的公式来计权重。谁大听谁的。
2) 如果没有选中,那么权重是0,因为继承的权重为0。
前端入门Web前端HTML5+CSS3+移动Web前端全套
calc是CSS3中新增的计算属性。
普通的CSS样式时,计算属性的写法如下:
Less中,计算属性的写法如下:
stylus中,计算属性的写法如下: