首頁  >  文章  >  web前端  >  了解css中容易被忽略特性,避免一些經常遇到的坑

了解css中容易被忽略特性,避免一些經常遇到的坑

青灯夜游
青灯夜游轉載
2020-11-11 18:09:231941瀏覽

了解css中容易被忽略特性,避免一些經常遇到的坑

CSS初學感覺很簡單,但隨著學習的深入才感覺CSS的水由多深,平常總會遇到各種坑,先總結一些經常遇到的坑。

推薦教學:CSS影片教學

大小寫不敏感

雖然我們平常在寫CSS的時候都是用小寫,但其實CSS並不是大小寫敏感的

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

了解css中容易被忽略特性,避免一些經常遇到的坑

#雖然把background-color寫為了background-COLOR,但還是會生效,之所以寫成小寫是因為xhtml標準的關係,但即使不是xhtml還是寫成小寫比較好,美觀、易讀而且可以應付可能的轉換需求

選擇器優先權

當兩個規則都作用到了同一個html元素上時,如果定義的屬性有衝突,那麼應該用誰的值的,CSS有一套優先權的定義。

不同層級

  • 在屬性後面使用 !important 會覆寫頁面內任何位置定義的元素樣式。

  • 作為style屬性寫在元素內的樣式

  • #id選擇器

  • 類別選擇器

  • 標籤選擇器

  • 通配符選擇器

  • 瀏覽器自訂或繼承

同一層級

在同一層級中後寫的會覆寫先寫的樣式

上面的層級還是很容易看懂的,但是有時候有些規則是多個等級的組合,像這樣

<!doctype html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style type="text/css">
        div.test{
            background-COLOR:#a00;
            width:100px;
            height: 100px;
        }

        .test.test2{
            background-COLOR:#0e0;
            width:100px;
            height: 100px;
        }
    </style>
</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變成綠色

了解css中容易被忽略特性,避免一些經常遇到的坑

行內(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>

  <div style="background-color: #a44;">
  <span style="padding:4px; margin:8px; height: 500px; width:1000px; background-color:#0a0;">
      123456789</span>
  </div>

了解css中容易被忽略特性,避免一些經常遇到的坑

透過範例可以看出,我們對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是相对于根元素(r:root),使用rem我们只需要在根元素确定一个参考值,然后就可以控制整个html页面所有字体了。

:checked 选择器范围

我们知道:checked会选择被选中的checkbox和radio,看个例子

<!doctype html>
<html>
<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>

了解css中容易被忽略特性,避免一些經常遇到的坑

对于前两个margin变成10px我们不奇怪,但是当我们看select的option的时候会发现被选中的option的margin业变成了10px,没有被选中的option则没有变化!

了解css中容易被忽略特性,避免一些經常遇到的坑

是的:checked也会选择被选中的option

并不是所有图片都会被加载

我们知道写在页面上的img标签,无论显示与否,图片都会被加载(所以试图通过对图片display:none来达到节省网络流量的做法就省省吧。。。),我们也经常使用backgroung-image等css属性为页面添加图片,这些图片是不是一定会被加载呢,看个例子

<!doctype html>
<html>
<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></div>

    <div></div>

    <div style="visibility:hidden;">
        <div></div>
    </div>

    <div style="display:none;">
        <div></div>
    </div>
    
    <div style="display:none">
        <img  src="images/5.jpg" alt="了解css中容易被忽略特性,避免一些經常遇到的坑" ></div>
</body>
</html>

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

了解css中容易被忽略特性,避免一些經常遇到的坑 我们可以发现图片0和4没有被下载,0是没有用到的CSS,4是父容器的display被设为none的情况,这两种情况下的CSS引用的图片是不会被加载的,而父容器设置visibility属性为hidden仍然会加载图片,不要搞混了

更多编程相关知识,请访问:编程入门!!

以上是了解css中容易被忽略特性,避免一些經常遇到的坑的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:cnblogs.com。如有侵權,請聯絡admin@php.cn刪除