容易被忽略CSS特性

CSS 初学感觉很简单,但随着学习的深入才感觉 CSS 的水由多深,平常总会遇到各种坑,先总结一些经常遇到的坑

大小写不敏感

虽然我们平时在写 CSS 的时候都是用小写,但其实 CSS 并不是大小写敏感的

.test{
    background-COLOR:#a00;
    width:100px;
    height: 100px;
}

虽然把 background-color 写为了 background-COLOR,但仍然会生效,之所以写成小写是因为 xhtml 标准的关系,但是即使不是 xhtml 还是写成小写比较好,美观、易读而且可以应对可能的转换需求

选择器优先级

当两个规则都作用到了同一个 html 元素上时,如果定义的属性有冲突,那么应该用谁的值的,CSS 有一套优先级的定义。

不同级别

  1. 在属性后面使用 !important 会覆盖页面内任何位置定义的元素样式。
  2. 作为 style 属性写在元素内的样式
  3. id 选择器
  4. 类选择器
  5. 标签选择器
  6. 通配符选择器
  7. 浏览器自定义或继承

同一级别

同一级别中后写的会覆盖先写的样式

上面的级别还是很容易看懂的,但是有时候有些规则是多个级别的组合,像这样

<!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)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">style</span><span style="color: rgba(0, 0, 255, 1)">&gt;</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) 元素的一些属性

并不是所有的属性对行内元素都能够生效

  1. 行内元素不会应用 width 属性,其长度是由内容撑开的
  2. 行内元素不会应用 height 属性,其高度也是由内容撑开的,但是高度可以通过 line-height 调节
  3. 行内元素的 padding 属性只用 padding-left 和 padding-right 生效,padding-top 和 padding-bottom 会改变元素范围,但不会对其它元素造成影响
  4. 行内元素的 margin 属性只有 margin-left 和 margin-right 有效,margin-top 和 margin-bottom 无效
  5. 行内元素的 overflow 属性无效,这个不用多说了
  6. 行内元素的 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)">&lt;</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)">&gt;</span>
    <span style="color: rgba(0, 0, 255, 1)">&lt;</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)">&gt;</span>123456789<span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">span</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
<span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">div</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span></pre>

通过例子可以看出,我们对 span 设置的 width 和 height 属性并没有生效,margin-top 和 margin-bottom 无效,padding-top 和 padding-bottom 会改变元素范围(背景区域变大了),但并没有影响下面元素位置

一些互斥的元素

  1. 对于 absolute 和 fixed 定位的 (固定大小,设置了 width 和 height 属性) 元素,如果设置了 top 和 left 属性,那么设置 bottom 和 right 值就没有作用了,应该是 top 和 left 优先级高,否则同时写了浏览器怎么知道按照谁定位
  2. 对于 absolute 和 fixed 定位的元素,如果设置了 top、left、bottom、right 的值后 margin 属性也就不起作用了
  3. 对于 absolute 和 fixed 定位的元素,如果设置了 top、left、bottom、right 的值后 float 属性同样会失效
  4. 块元素如果设置了 float 属性或者是 absolute、fixed 定位,那么 vertical-align 属性不再起作用 

 font-size 单位

我们在写字体的尺寸的时候常用的单位有

  • px
  • pt
  • em
  • rem

这些字体分别有什么含义?

  1. px是 pixel 缩写,是基于像素的单位. 在浏览网页过程中,屏幕上的文字、图片等会随屏幕的分辨率变化而变化,一个 100px 宽度大小的图片,在 800×600 分辨率下,要占屏幕宽度的 1/8,但在 1024×768 下,则只占约 1/10。所以如果在定义字体大小时,使用 px 作为单位,那一旦用户改变显示器分辨率从 800 到 1024,用户实际看到的文字就要变“小”(自然长度单位),甚至会看不清,影响浏览。 
  2. pt是 point(磅) 缩写,是一种固定长度的度量单位, 大小为 1/72 英寸。如果在 web 上使用 pt 做单位的文字,字体的大小在不同屏幕(同样分辨率)下一样,这样可能会对排版有影响,但在 Word 中使用 pt 相当方便。因为使用 Word 主要目的都不是为了屏幕浏览,而是输出打印。当打印到实体时,pt 作为一个自然长度单位就方便实用了:比如 Word 中普通的文档都用“宋体 9pt”,标题用“黑体 16pt”等等,无论电脑怎么设置,打印出来永远就是这么大。
  3. em:是相对单位,是一个相对长度单位,最初是指字母 M 的宽度,所以叫 em,现指的是字符宽度的倍数,用法类似百分比,如:0.8em, 1.2em,2em 等。通常 1em=16px(浏览器默认字体大小 16px),em 是指父元素的字体大小。在一个页面上给定了一个父元素的字体大小, 这样就可以通过调整一个元素来成比例的改变所有元素大小. 它可以自由缩放, 比如用来制作可伸缩的样式表。类似还有 ex 的概念,ex 相对于字符“x”的高度,此高度通常为字体尺寸的一半。
  4. 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)">&lt;</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)">&gt;&lt;/</span><span style="color: rgba(128, 0, 0, 1)">div</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>

<span style="color: rgba(0, 0, 255, 1)">&lt;</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)">&gt;</span>
    <span style="color: rgba(0, 0, 255, 1)">&lt;</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)">&gt;&lt;/</span><span style="color: rgba(128, 0, 0, 1)">div</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
<span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">div</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>

<span style="color: rgba(0, 0, 255, 1)">&lt;</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)">&gt;</span>
    <span style="color: rgba(0, 0, 255, 1)">&lt;</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)">&gt;&lt;/</span><span style="color: rgba(128, 0, 0, 1)">div</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
<span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">div</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>

<span style="color: rgba(0, 0, 255, 1)">&lt;</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)">&gt;</span>
    <span style="color: rgba(0, 0, 255, 1)">&lt;</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)">&gt;&lt;/</span><span style="color: rgba(128, 0, 0, 1)">div</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>

</body>
</html>

看一下网络监视情况(怎么柳岩的照片变小后感觉怪怪的。。。)

 我们可以发现图片 0 和 4 没有被下载,0 是没有用到的 CSS,4 是父容器的 display 被设为 none 的情况,这两种情况下的 CSS 引用的图片是不会被加载的,而父容器设置 visibility 属性为 hidden 仍然会加载图片,不要搞混了