容易被忽略CSS特性
CSS 初学感觉很简单,但随着学习的深入才感觉 CSS 的水由多深,平常总会遇到各种坑,先总结一些经常遇到的坑
大小写不敏感
虽然我们平时在写 CSS 的时候都是用小写,但其实 CSS 并不是大小写敏感的
.test{ background-COLOR:#a00; width:100px; height: 100px; }
虽然把 background-color 写为了 background-COLOR,但仍然会生效,之所以写成小写是因为 xhtml 标准的关系,但是即使不是 xhtml 还是写成小写比较好,美观、易读而且可以应对可能的转换需求
选择器优先级
当两个规则都作用到了同一个 html 元素上时,如果定义的属性有冲突,那么应该用谁的值的,CSS 有一套优先级的定义。
不同级别
- 在属性后面使用 !important 会覆盖页面内任何位置定义的元素样式。
- 作为 style 属性写在元素内的样式
- id 选择器
- 类选择器
- 标签选择器
- 通配符选择器
- 浏览器自定义或继承
同一级别
同一级别中后写的会覆盖先写的样式
上面的级别还是很容易看懂的,但是有时候有些规则是多个级别的组合,像这样
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> <style type="text/css"> div.test{ background-COLOR:#a00; width:100px; height: 100px; }.test.test2</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">{</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(255, 0, 0, 1)"> background-COLOR</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">:</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 255, 1)">#0e0</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">;</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(255, 0, 0, 1)"> width</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">:</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 255, 1)">100px</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">;</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(255, 0, 0, 1)"> height</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">:</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 255, 1)"> 100px</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">;</span> <span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">}</span> <span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">style</span><span style="color: rgba(0, 0, 255, 1)">></span>
</head>
<body>
<div class="test test2"></div>
</body>
</html>
到底 div 是应用那条规则呢,有个简单的计算方法(经园友提示,权值实际并不是按十进制,用数字表示只是说明思想,一万个 class 也不如一个 id 权值高)
- 内联样式表的权值为 1000
- ID 选择器的权值为 100
- Class 类选择器的权值为 10
- HTML 标签选择器的权值为 1
我们可以把选择器中规则对应做加法,比较权值,如果权值相同那就后面的覆盖前面的了,div.class 的权值是 1+10=11,而.test1 .test2 的权值是 10+10=20,所以 div 会应用.test1 .test2 变成绿色
行内 (inline) 元素的一些属性
并不是所有的属性对行内元素都能够生效
- 行内元素不会应用 width 属性,其长度是由内容撑开的
- 行内元素不会应用 height 属性,其高度也是由内容撑开的,但是高度可以通过 line-height 调节
- 行内元素的 padding 属性只用 padding-left 和 padding-right 生效,padding-top 和 padding-bottom 会改变元素范围,但不会对其它元素造成影响
- 行内元素的 margin 属性只有 margin-left 和 margin-right 有效,margin-top 和 margin-bottom 无效
- 行内元素的 overflow 属性无效,这个不用多说了
- 行内元素的 vertical-align 属性无效(height 属性无效)
<div style="background-color: #a44;"> <span style="padding:4px; margin:8px; height: 500px; width:1000px; background-color:#0e0;">123456789123456789</span> </div><span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">div </span><span style="color: rgba(255, 0, 0, 1)">style</span><span style="color: rgba(0, 0, 255, 1)">="background-color: #a44;"</span><span style="color: rgba(0, 0, 255, 1)">></span> <span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">span </span><span style="color: rgba(255, 0, 0, 1)">style</span><span style="color: rgba(0, 0, 255, 1)">="padding:4px; margin:8px; height: 500px; width:1000px; background-color:#0a0;"</span><span style="color: rgba(0, 0, 255, 1)">></span>123456789<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">span</span><span style="color: rgba(0, 0, 255, 1)">></span> <span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">div</span><span style="color: rgba(0, 0, 255, 1)">></span></pre>
通过例子可以看出,我们对 span 设置的 width 和 height 属性并没有生效,margin-top 和 margin-bottom 无效,padding-top 和 padding-bottom 会改变元素范围(背景区域变大了),但并没有影响下面元素位置
一些互斥的元素
- 对于 absolute 和 fixed 定位的 (固定大小,设置了 width 和 height 属性) 元素,如果设置了 top 和 left 属性,那么设置 bottom 和 right 值就没有作用了,应该是 top 和 left 优先级高,否则同时写了浏览器怎么知道按照谁定位
- 对于 absolute 和 fixed 定位的元素,如果设置了 top、left、bottom、right 的值后 margin 属性也就不起作用了
- 对于 absolute 和 fixed 定位的元素,如果设置了 top、left、bottom、right 的值后 float 属性同样会失效
- 块元素如果设置了 float 属性或者是 absolute、fixed 定位,那么 vertical-align 属性不再起作用
font-size 单位
我们在写字体的尺寸的时候常用的单位有
- px
- pt
- em
- rem
这些字体分别有什么含义?
- px是 pixel 缩写,是基于像素的单位. 在浏览网页过程中,屏幕上的文字、图片等会随屏幕的分辨率变化而变化,一个 100px 宽度大小的图片,在 800×600 分辨率下,要占屏幕宽度的 1/8,但在 1024×768 下,则只占约 1/10。所以如果在定义字体大小时,使用 px 作为单位,那一旦用户改变显示器分辨率从 800 到 1024,用户实际看到的文字就要变“小”(自然长度单位),甚至会看不清,影响浏览。
- pt是 point(磅) 缩写,是一种固定长度的度量单位, 大小为 1/72 英寸。如果在 web 上使用 pt 做单位的文字,字体的大小在不同屏幕(同样分辨率)下一样,这样可能会对排版有影响,但在 Word 中使用 pt 相当方便。因为使用 Word 主要目的都不是为了屏幕浏览,而是输出打印。当打印到实体时,pt 作为一个自然长度单位就方便实用了:比如 Word 中普通的文档都用“宋体 9pt”,标题用“黑体 16pt”等等,无论电脑怎么设置,打印出来永远就是这么大。
- em:是相对单位,是一个相对长度单位,最初是指字母 M 的宽度,所以叫 em,现指的是字符宽度的倍数,用法类似百分比,如:0.8em, 1.2em,2em 等。通常 1em=16px(浏览器默认字体大小 16px),em 是指父元素的字体大小。在一个页面上给定了一个父元素的字体大小, 这样就可以通过调整一个元素来成比例的改变所有元素大小. 它可以自由缩放, 比如用来制作可伸缩的样式表。类似还有 ex 的概念,ex 相对于字符“x”的高度,此高度通常为字体尺寸的一半。
- rem:rem 是 CSS 新增的,em是相对于其父元素来设置字体大小的,这样就会存在一个问题,进行任何元素设置,都有可能需要知道他父元素的大小,在多次使用时,就会带来无法预知的错误风险。而 rem是相对于根元素 <html>(r:root),使用 rem我们只需要在根元素确定一个参考值,然后就可以控制整个 html 页面所有字体了。
:checked 选择器范围
我们知道:checked 会选择被选中的 checkbox 和 radio,看个例子
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> <style type="text/css"> :checked{ margin: 10px; } </style> </head> <body> <input id="t1" type="checkbox" checked/> <input id="t3" type="radio" checked/> <select> <option id="t2">test</option> <option id="t4">test2</option> </select> </body> </html>
对于前两个 margin 变成 10px 我们不奇怪,但是当我们看 select 的 option 的时候会发现被选中的 option 的 margin 业变成了 10px,没有被选中的 option 则没有变化!
是的:checked 也会选择被选中的 option
并不是所有图片都会被加载
我们知道写在页面上的 img 标签,无论显示与否,图片都会被加载(所以试图通过对图片 display:none 来达到节省网络流量的做法就省省吧。。。),我们也经常使用 backgroung-image 等 css 属性为页面添加图片,这些图片是不是一定会被加载呢,看个例子
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> <style type="text/css"> .useless{ background-image: url(images/0.jpg); } .hidden{ background-image: url(images/1.jpg); } .none{ background-image: url(images/2.jpg); } .parentHidden{ background-image: url(images/3.jpg); } .parentNone{ background-image: url(images/4.jpg); } </style> </head> <body> <div class="hidden"></div><span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">div </span><span style="color: rgba(255, 0, 0, 1)">class</span><span style="color: rgba(0, 0, 255, 1)">="none"</span><span style="color: rgba(0, 0, 255, 1)">></</span><span style="color: rgba(128, 0, 0, 1)">div</span><span style="color: rgba(0, 0, 255, 1)">></span> <span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">div </span><span style="color: rgba(255, 0, 0, 1)">style</span><span style="color: rgba(0, 0, 255, 1)">="visibility:hidden;"</span><span style="color: rgba(0, 0, 255, 1)">></span> <span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">div </span><span style="color: rgba(255, 0, 0, 1)">class</span><span style="color: rgba(0, 0, 255, 1)">="parentHidden"</span><span style="color: rgba(0, 0, 255, 1)">></</span><span style="color: rgba(128, 0, 0, 1)">div</span><span style="color: rgba(0, 0, 255, 1)">></span> <span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">div</span><span style="color: rgba(0, 0, 255, 1)">></span> <span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">div </span><span style="color: rgba(255, 0, 0, 1)">style</span><span style="color: rgba(0, 0, 255, 1)">="display:none;"</span><span style="color: rgba(0, 0, 255, 1)">></span> <span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">div </span><span style="color: rgba(255, 0, 0, 1)">class</span><span style="color: rgba(0, 0, 255, 1)">="parentNone"</span><span style="color: rgba(0, 0, 255, 1)">></</span><span style="color: rgba(128, 0, 0, 1)">div</span><span style="color: rgba(0, 0, 255, 1)">></span> <span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">div</span><span style="color: rgba(0, 0, 255, 1)">></span> <span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">div </span><span style="color: rgba(255, 0, 0, 1)">style</span><span style="color: rgba(0, 0, 255, 1)">="display:none"</span><span style="color: rgba(0, 0, 255, 1)">></span> <span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">img </span><span style="color: rgba(255, 0, 0, 1)">src</span><span style="color: rgba(0, 0, 255, 1)">="images/5.jpg"</span><span style="color: rgba(0, 0, 255, 1)">></</span><span style="color: rgba(128, 0, 0, 1)">div</span><span style="color: rgba(0, 0, 255, 1)">></span>
</body>
</html>
看一下网络监视情况(怎么柳岩的照片变小后感觉怪怪的。。。)
我们可以发现图片 0 和 4 没有被下载,0 是没有用到的 CSS,4 是父容器的 display 被设为 none 的情况,这两种情况下的 CSS 引用的图片是不会被加载的,而父容器设置 visibility 属性为 hidden 仍然会加载图片,不要搞混了