談談css僞類與僞元素

css選擇器常見包括id(#id)、標籤(tag)、class(.class)、屬性[attr=attrval]等,還包括僞元素和僞類選擇器。正確的利用僞元素和僞類可以讓咱們的html結構更清晰合理,也能在必定程度上減小js對dom的操做!css

定義

僞類包含兩種:狀態僞類結構性僞類html

狀態僞類是基於元素當前狀態進行選擇的。在與用戶的交互過程當中元素的狀態是動態變化的,所以該元素會根據其狀態呈現不一樣的樣式。當元素處於某狀態時會呈現該樣式,而進入另外一狀態後,該樣式也會失去。常見的狀態僞類主要包括:css3

:link 應用於未被訪問過的連接;web

:hover 應用於鼠標懸停到的元素;瀏覽器

:active 應用於被激活的元素;安全

:visited 應用於被訪問過的連接,與:link互斥。dom

:focus 應用於擁有鍵盤輸入焦點的元素。網站

結構性僞類是css3新增選擇器,利用dom樹進行元素過濾,經過文檔結構的互相關係來匹配元素,可以減小class和id屬性的定義,使文檔結構更簡潔。常見的包括:spa

:first-child 選擇某個元素的第一個子元素;firefox

:last-child 選擇某個元素的最後一個子元素;

:nth-child() 選擇某個元素的一個或多個特定的子元素;

:nth-last-child() 選擇某個元素的一個或多個特定的子元素,從這個元素的最後一個子元素開始算;

:nth-of-type() 選擇指定的元素;

:nth-last-of-type() 選擇指定的元素,從元素的最後一個開始計算;

:first-of-type 選擇一個上級元素下的第一個同類子元素;

:last-of-type 選擇一個上級元素的最後一個同類子元素;

:only-child 選擇的元素是它的父元素的惟一一個子元素;

:only-of-type 選擇一個元素是它的上級元素的惟一一個相同類型的子元素;

:empty 選擇的元素裏面沒有任何內容。

僞元素是對元素中的特定內容進行操做,而不是描述狀態。它的操做層次比僞類更深一層,所以動態性比僞類低不少。實際上,僞元素就是選取某些元素前面或後面這種普通選擇器沒法完成的工做。控制的內容和元素是相同的,但它自己是基於元素的抽象,並不存在於文檔結構中!常見的僞元素選擇器包括:

:first-letter 選擇元素文本的第一個字(母)。

:first-line 選擇元素文本的第一行。

:before 在元素內容的最前面添加新內容。

:after 在元素內容的最後面添加新內容。

注意事項

有時你會發現僞類元素使用了兩個冒號 (::) 而不是一個冒號 (:),這是 CSS3 規範中的一部分要求,目的是爲了區分僞類和僞元素,大多數瀏覽器都支持這兩種表示方式。單冒號(:)用於 CSS3 僞類,雙冒號(::)用於 CSS3 僞元素。對於 CSS2 中已經有的僞元素,例如 :before,單冒號和雙冒號的寫法 ::before 做用是同樣的。

因此,若是你的網站只須要兼容 webkit、firefox、opera 等瀏覽器,建議對於僞元素採用雙冒號的寫法,若是不得不兼容 IE 瀏覽器,仍是用 CSS2 的單冒號寫法比較安全。

僞元素的應用

(1) 清除浮動

若是父元素的全部子元素都是浮動的,父元素的高度則沒法撐開。能夠經過對父元素添加after僞類撐開父元素高度,由於after就是其最後一個子元素。

.clear:after {
    content: '';
    display: block;
    clear: both;
}

(2) 畫分割線

畫一條以下的分割線:

圖片描述

<style>
    * {
      padding: 0;
      margin: 0;
    }
    .spliter::before, .spliter::after {
      content: '';
      display: inline-block;
      border-top: 1px solid black;
      width: 200px;
      margin: 5px;
    }
  </style>
</head>
<body>
  <p class="spliter">分割線</p>
</body>

(3)計數器

用js作個計數器是比較常見的,但我css也能實現!用到的屬性有:

1> counter-reset: 屬性設置某個選擇器出現次數的計數器的值。默認爲 0。

2> counter-increment: 屬性設置某個選取器每次出現的計數器增量。默認增量是 1。

3> content: 插入生成內容。
圖片描述

代碼以下:

<style>
    .chooses {
      counter-reset: letters;
    }
    .chooses input:checked {
      counter-increment: letters;
    }

    .choose span:after {
      content: counter(letters);
    }
  </style>
</head>
<body>
  <div class="chooses">
    <input type="checkbox">a
    <input type="checkbox">b
    <input type="checkbox">c
    <input type="checkbox">d
    <input type="checkbox">e
    <input type="checkbox">f
    <input type="checkbox">g
    <input type="checkbox">h
    <input type="checkbox">i
    <input type="checkbox">j
  </div>
  <p class="choose">我選擇了<span></span>個字母</p>
</body>

(4)形變

經過僞元素實現以下透視形變:

圖片描述
代碼以下:

.transform{
      position: absolute;
      top:50%;
      left: 50%;
      transform:translate(-50%,-50%);
      width: 160px;
      padding: 60px;
      text-align: center;
      color: white;
      font-size: 200%;
    }
    .transform::before{
      content:"";
      position: absolute;
      top: 0; right: 0; bottom: 0; left: 0;
      transform:perspective(40px) scaleY(1.3) rotateX(5deg);
      transform-origin: bottom;
      background:rgb(255, 145, 20);
      z-index:-1;
    }

圖片描述

.rhombus{
      position: absolute;
      top:50%;left: 50%;
      transform:translate(-50%,-50%);
      width: 200px;line-height:200px;
      text-align: center;
      color: white;
      font-size: 200%;
    }
    .rhombus:before{
      content: '';
      position: absolute;
      top: 0; right: 0; bottom: 0; left: 0;
      background-color:rgb(20, 255, 255);
      z-index:-1;
      transform: rotateZ(45deg);
    }

(5) 增大點擊熱區

.btn::before {
      content:"";
      position:absolute;
      top:-10px;
      right:-10px;
      bottom:-10px;
      left:-10px;
    }

總結

僞元素的本質是在不增長dom結構的基礎上添加的一個元素,在用法上跟真正的dom無本質區別。普通元素能實現的效果,僞元素均可以。有些用僞元素效果更好,代碼更精簡。

相關文章
相關標籤/搜索