CSS / 前端技術 / 筆記 · 2020-12-09

CSS Pseudo Classes 偽元素

:active

活動連結,運用於標籤點選。

/* css範例 */

a:link {
  color: green;
}

a:visited {
  color: green;
}

a:hover {
  color: red;
}

a:active {
  color: yellow;
}

:valid 與 :invalid

:valid 設定表單驗證,填寫正確值元素樣式
:invalid 設定表單驗證,填寫無效或錯誤值元素樣式

<input>與<form>

/* css範例 */

input:invalid {
  background-color: #ffdddd;
}

form:invalid {
  border: 5px solid #ffdddd;
}

input:valid {
  background-color: #ddffdd;
}

input:valid + span::before {
  content: '✓';
  color: green;
}

form:valid {
  border: 5px solid #ddffdd;
}
  
input:required {
  border-color: #800000;
  border-width: 3px;
}

input:required:invalid {
  border-color: #c00000;
}

:required

選在表單必填元素,套用樣式,適用於<input>、<select>、<textarea>

<!--Html範例-->
<input type="text" required>
/* css範例 */

input:required {
  border: 1px dashed red;
}

:focus

滑鼠點擊元素與透過鍵盤[tab鍵]點選元素樣式

<!--Html範例-->

<input type="text" name="search">
/* css範例 */

input:focus {
  background-color: yellow;
}

input[type=text] {
  width: 100px;
  -webkit-transition: width .35s ease-in-out;
  transition: width .35s ease-in-out;
}

input[type=text]:focus {
  width: 250px;
}

:focus-visible

只針對鍵盤[tab鍵]點選元素樣式

:focus-within

滑鼠點擊元素與透過鍵盤[tab鍵]多焦點選取,雙重樣式
<!--html範例[點選input,form持續焦點樣式]-->

<form>
    <label for="given_name">Given Name:</label>
    <input id="given_name" type="text">
    <br>
    <label for="family_name">Family Name:</label>
    <input id="family_name" type="text">
</form>
/* css範例[點選input,form持續焦點樣式] */

form {
  border: 1px solid;
  color: gray;
  padding: 4px;
}

form:focus-within {
  background: #ff8;
  color: black;
}

input {
  margin: 4px;
}

:checked

選擇器已選取樣式,radio <input type=”radio”>、checkbox <input type=”checkbox”>、option <option>中 <select>,開啟狀態

:checked toggle進階使用參考

<!--html範例 [radio、checkbox、select]-->

<div>
  <input type="radio" name="my-input" id="yes">
  <label for="yes">Yes</label>

  <input type="radio" name="my-input" id="no">
  <label for="no">No</label>
</div>

<div>
  <input type="checkbox" name="my-checkbox" id="opt-in">
  <label for="opt-in">Check me!</label>
</div>

<select name="my-select" id="fruit">
  <option value="opt1">Apples</option>
  <option value="opt2">Grapes</option>
  <option value="opt3">Pears</option>
</select>
/* css範例 [radio、checkbox、select] */

div,
select {
  margin: 8px;
}

/* Labels for checked inputs */
input:checked + label {
  color: red;
}

/* Radio element, when checked */
input[type="radio"]:checked {
  box-shadow: 0 0 0 3px orange;
}

/* Checkbox element, when checked */
input[type="checkbox"]:checked {
  box-shadow: 0 0 0 3px hotpink;
}

/* Option elements, when selected */
option:checked {
  box-shadow: 0 0 0 3px lime;
  color: red;
}

:disabled

禁用元素樣式,selected, clicked on, typed into…

<!--Html範例-->

<input type="text" placeholder="Name" disabled>

<select>
  <option value="volvo">Volvo</option>
  <option value="saab" disabled>Saab</option>
  <option value="opel">Opel</option>
  <option value="audi" disabled>Audi</option>
  <option value="bmw">BMW</option>
</select>
/* css範例 */

input[type="text"]:disabled {
  background: #ccc;
}
option:disabled {
  background: red;
}

:enabled

使用元素樣式,selected, clicked on, typed into…

<!--Html範例-->

<input type="text" value="Mickey"><!--使用中-->
<input type="text" disabled="disabled" value="Disneyland"><!--禁用中-->
/* css範例 */

input[type=text]:enabled {
  background: #ffff00;
}

input[type=text]:disabled {
  background: #dddddd;
}

:empty

為空元素指定樣式

<!--Html範例-->

<div class="box"><!-- 此區塊為空元素= lime--></div>
<div class="box">此區塊有純文字 = pink</div>
<div class="box">
	<!-- 此區塊註解有空白或段行,舊瀏覽器會判斷有元素,而使用 pink -->
</div>
<div class="box">
	<p><!-- 次區塊有元素<p> = pink --></p>
</div>
/* css範例 */

.box {
  background: pink;
  height: 80px;
  width: 80px;
}

.box:empty {
  background: lime;
}

:in-range 與 :out-of-range

:in-range <input>元素值在min和max屬性指定的範圍限制內,設計樣式。
:out-of-range <input>元素值在min和max屬性指定的範圍限制外,設計樣式。

<!--Html範例-->

<input id="value1" name="value1" type="number" placeholder="1 to 10" min="1" max="10" value="12" required>
/* css範例 */

input {
  border: 1px solid black;
}

input:in-range {
  background-color: rgba(0, 255, 0, 0.25);
}

input:out-of-range {
  background-color: rgba(255, 0, 0, 0.25);
  border: 2px solid red;
}

input:in-range + label::after {
  content: 'okay.';
}

input:out-of-range + label::after {
  content: 'out of range!';
}

:lang(language-code)

指定元素值,並設定樣式

<p lang="it">Ciao bella!</p>
p:lang(it) { 
  background: yellow;
}

:first-child 與 :last-child

:first-child 設定第1個元素樣式
:last-child 設定倒數第1元素樣式

<!--Html範例-->

<div>
  <p>我是<p>元素第一行,套用樣式</p>
  <p>我是<p>元素第二行,無樣式</p>
</div>

<div>
  <h2>我是<h2>元素第一行,無樣式</h2>
  <p>我是<p>元素第三行,無樣式</p>
</div>
/* css範例 */

p:first-child {
  color: lime;
  background-color: black;
  padding: 5px;
}

:first-of-type 與 :last-of-type

:first-of-type 設定不同區塊裡,同一層第1個元素樣式
:last-of-type 設定不同區塊裡,同一層倒數第1元素樣式

<!--Html範例-->

<article>
    <div>我是第1個"div"元素,套用樣式。</div>
    
    <div>第2個"div"元素,<span>我是第一個"span"元素,套用樣式。</span></div>
    
    <div>第3個"div"元素,<em>我是第1個"em"元素,套用樣式。</em>, 另外<em>我是第2個"em"元素,無樣式。</em></div>
    
    <div>第4個"div"元素,<span>我是"div"中"span"的第一個元素,套用樣式。</span></div>
    
    <b>第1個"b"元素,套用樣式。</b>
    
    <div>第5個"div"元素,無樣式。</div>
</article>
/* css範例 */

article :first-of-type {
  background-color: pink;
}

:nth-child() 與 :nth-last-child()

選擇父元素內第n個元素

:nth-child(2) 設定第n個元素樣式
:nth-child(odd) 設定單數元素樣式
:nth-child(even) 設定雙數元素樣式

:nth-last-child為倒數計算

/* css範例 */

p:nth-child(2) {
  background: red;
}

p:nth-child(odd) {
  background: red;
}

p:nth-child(even) {
  background: blue;
}

(n) An+B 指定元素

An + B自定義數字:
A=循環數(組)
n=從0開始(計數器)
B=循環數範圍內的第n個元素(偏移值)

範例說明

p:nth-child(n) = 每個<p>元素

nth-child(2n+1) = 2元素循環組的第1個元素 = nth-child(odd)
nth-child(2n) = 2元素循環組的第2個元素 =nth-child(even)
nth-child(5n) = 5元素循環組的第5個元素
nth-child(n+7) = 第7個元素與以下所有元素
nth-child(-n+3) = 第3個元素與以上所有元素
nth-child(3n+4) = 3元素循環組以下的第4個元素

p:nth-child(1) or p:nth-child(0n+1) = 第1個元素 = first-child
p:nth-child(n+8):nth-child(-n+15) = 第8個元素以下到第15個元素以上 = 8~15

PS.IE8以上支援

/* css範例 */

tr:nth-child(1){
    background-color:#69C;
    }

:nth-of-type() 與 :nth-last-of-type()

選擇父元素內指定類型第n個元素

:nth-of-type(<nth> )
where
= <an-plus-b> | even | odd

:nth-of-type(2) 設定第n個元素樣式
:nth-of-type(odd) 設定單數元素樣式
:nth-of-type(even) 設定雙數元素樣式

:nth-last-of-type() 為倒數計算

/* css範例 */

/* Odd paragraphs */
p:nth-of-type(2n+1) {
  color: red;
}

/* Even paragraphs */
p:nth-of-type(2n) {
  color: blue;
}

/* First paragraph */
p:nth-of-type(1) {
  font-weight: bold;
}

/* This has no effect, as the .fancy class is only on the 4th p element, not the 1st */
p.fancy:nth-of-type(1) {
  text-decoration: underline;
}
<!--html範例-->

<div>
  <div>無效果套用</div>
  <p>我是p:nth-of-type(1)結果</p>
  <p>我是p:nth-of-type(2n)結果</p>
  <div>無效果套用</div>
  <p>我是p:nth-of-type(2n+1)結果</p>
  <p class="fancy">無效果套用,p.fancy:nth-of-type(1)為第1個p元素,本.fancy元素為第4個p元素=p.fancy:nth-of-type(4)</p>
</div>

:not(selector)

css3選擇器,套用指定以外元素樣式。

:not(.class)

指定class以外元素樣式。

/* css範例 */

div {
  color: black;
}
div:not(.active) {
  color: green;
}
<!--html範例-->

<div class="active">我是black樣式</div>
<div>我是green樣式</div>
<div>我是green樣式</div>

:not(.class):not(.class)

指定雙重class以外元素樣式。

/* css範例 */

div {
  color: black;
}
div:not(.active1) :not(.active2) {
  color: green;
}
<!--html範例-->

<div class="active1">我是black樣式</div>
<div>我是green樣式</div>
<div class="active2">我是black樣式</div>

:not(:first-child)

第1個元素以外元素樣式。

/* css範例 */

ul li{ 
      color:#000000;
}
ul li:not(:first-child){ 
      color:#red;
}
<!--html範例-->

<ul>
     <li>列表1 我是黑色</li>
     <li>列表2 我是紅色</li>
     <li>列表3 我是紅色</li>
</ul>

:only-child

父元素內指定類型,並僅有1個指定類型元素,才會有樣式,如父元素有其他類型元素或有第2個指定元素,也不會有樣式

/* css範例 */
p:only-child {
  background: red;
}
<!--html範例-->

<div><p>1個指定元素,套用樣式</p></div>
<div><p>This is a paragraph.</p><p>This is a paragraph.</p>2種指定元素,無套用樣式</div>
<div><span>This is a span.</span><p>This is a paragraph.</p>2種類型元素,2種類型元素中有1個指定元素,無套用樣式</div>

:only-of-type

父元素內指定類型,並僅單1個指定類型元素,才會有樣式,如父元素有其他類型元素,但有單1個指定元素,同樣會針對該類型套用樣式,如有第2個指定元素,則不會套用樣式

/* css範例 */

p:only-of-type {
  background: red;
}
<!--html範例-->

<div><p>1個指定元素,套用樣式</p></div>
<div><p>This is a paragraph.</p><p>This is a paragraph.</p>2種指定元素,無套用樣式</div>
<div><span>This is a span.</span><p>This is a paragraph.</p>2種類型元素,2種類型元素中有1個指定元素,套用樣式</div>

:optional

選擇表單內沒設定必填(required)屬性,套用樣式,適用於<input>、<select>、<textarea>

/* css範例 */

label {
  display: block;
  margin: 1px;  
  padding: 1px;
}

.field {
  margin: 1px;
  padding: 1px;
}
 
input:optional {
  border-color: rebeccapurple;
  border-width: 3px;
}
<!--html範例-->

<form>
  <div class="field">
    <label for="url_input">Enter a URL:</label>
    <input type="url" id="url_input"> 非必填元素,套用樣式
  </div>

  <div class="field">
    <label for="email_input">Enter an email address:</label>
    <input type="email" id="email_input" required> 必填元素,無套用樣式
  </div>
</form>

:read-only 與 :read-write

:read-only 選擇表單內不可編輯(readonly)元素
:read-write 選擇表單內可編輯元素
套用樣式,適用於<input>、<textarea>

/* css範例 */

input:-moz-read-only, textarea:-moz-read-only,
input:read-only, textarea:read-only {
  border: 0;
  box-shadow: none;
  background-color: white;
}

textarea:-moz-read-write,
textarea:read-write {
  box-shadow: inset 1px 1px 3px #ccc;
  border-radius: 5px;
}
<!--html範例-->

<form>
    本表單不可編輯,套用:read-only樣式
    <input type="text" value="" readonly>
    <textarea name="address" readonly></textarea>
</form>

<form>
    本表單可編輯,套用:read-write樣式
    <input type="text" value="">
    <textarea></textarea>
</form>

:target

點選連結標籤,套用點選至標籤內容範圍樣式(url的id)

<!--html範例-->
<p><a href="#news1">連結標籤 1</a></p>
<p><a href="#news2">連結標籤 2</a></p>

<p id="news1"><b>點選連結標籤,這裡會顯示套用樣式效果...</b></p>
<p id="news2"><b>點選連結標籤,這裡會顯示套用樣式效果...</b></p>
/* css範例 */

:target {
  border: 2px solid #D4D4D4;
  background-color: #e5eecc;
}

:first

<!--html範例-->

<p>First Page.</p>
<p>Second Page.</p>
<button>Print!</button>
/* css範例 */

/* Selects the first page when printing */
@page :first {
  margin-left: 50%;
  margin-top: 50%;
}

p {
  page-break-after: always;
}