你可能還不知道的 CSS 特性

1. :is():where()

:is(.header, .main) p {
  color: red;
}
:where(.header, .main) p {
  color: red;
}

其實這兩個選擇器等同於:

.header p, .main p {
  color: red;
}
.header p, .main p {
  color: red;
}

他們唯一不同之處,就是選擇器權重不同。等同於以:

/* :is */
.header p, .main p {
  color: red;
}
/* :where */
p {
  color: red;
}

🌰:一般可以用來簡寫一些選擇器

.div1 p, .div2 p .div3 p {}
/* 簡寫 */
:is(.div1, .div2, .div3) p {}

2. :not():has()

🌰:有時候可以更有語義化一點表示下圖需求:

在沒有 :not() 選擇器的時候,你可能會想到下面這樣的方式

.card + .card { /* 沒用過的看不懂 */
  margin-top: 20px;
}   

/* 或 */

.card {
  margin-bottom: 20px;
}
.card:last-child { /* 需要拆成了兩行來寫 */
  margin-bottom: 0;
}

如果換成 :not() 選擇器,可以這要來實現:

.card:not(:last-child) {
  margin-bottom: 20px
}

雖然 CSS 選擇器已經非常強大了,但一直以來,在 CSS 中沒有從子元素選到父元素的樣的選擇器(父選擇器):

即將到來的 :has() 選擇器它可以用來選擇父級元素

<section> <!-- section 邊框顏色是 blue --> 
  <h1>H1 Level Title</h1>
</section>  
<section> <!-- section 邊框顏色是 red --> 
  <h2>H2 Level Title</h2>
</section>  
section:has(h1) {
  border-color: blue;
}
section:has(h2) {
  border-color: red;
}

🌰:可能根據子元素的變化,改變父元素的樣式,而不必再給父元素添加額外的 class

3. :empty:blank

🌰:有時候數據爲空時,如下圖這樣:

此時我們還要額外隱藏容器,要是有了表示空狀態的僞類選擇器就可以直接這麼寫

section:empty {
  display: none; /* or others */
}

但是 :empty 只能選中沒有子元素的元素。子元素只可以是元素節點或文本(包括空格)。註釋或處理指令都不會產生影響。

<!-- 空元素 -->
<div class="error"></div>
<div class="error"><!-- 註釋 --></div>
<div class="error pseudo-elements(僞元素)"></div> 

<!-- 非空元素 -->
<div class="error"> </div> <!-- 中間有一個空格符 -->
<div class="error">
</div> <!-- 斷行 -->
<div class="error">
  <!-- 註釋 -->
    <!-- ... -->
  <!-- 註釋 -->
</div> <!-- 註釋斷行排列 -->
<div class="error"><span></span></div>

4. maskclip-path

5. mix-blend-mode

.wrapper {
    position: relative;
}
:is(.wrapper) svg, img {
    position: absolute;
    top: 0;
    left: 0;
}
.wrapper svg {
    fill: red;
  mix-blend-mode: multiply;
  z-index: 2;
}

<section class="wrapper">
        <svg id="js-couch" class="couch__overlay" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" preserveAspectRatio="none" width="1000" height="394"> 
            <defs> 
              <path d="M996.35 77.55q-1.85-1.95-8.65-3.75l-62.4-17.1q-9.3-2.75-12.15-2.5-1.8.15-2.85.45l-.75.3q2.25-16.3 3.75-22.05 1.15-4.4 1.4-10.8.2-6.6-.7-10.85-1.25-5.65-3.1-7.8-2.95-3.35-9.65-2.7-5.95.6-39.3 1.7-38.3 1.25-39.45 1.3-10.25.5-126.75.5-5.05 0-54.2 1.3-45.8 1.25-54.05.95-19.45-.45-30.4-.7-20.2-.55-23.1-1.3-22.3-5.85-26.5 1.25-2.65 4.55-3.85 7.9-.6 1.7-.7 2.5-.65-2.2-2.05-4.55-2.75-4.65-6.45-5.2-3.85-.55-13.65-.4-7.4.1-12 .4-.4.05-18.7.9-16.55.8-19.15 1.1-3.4.4-14.6 1.1-11.3.75-13.05.65h-9.8q-8.65-.05-11.45-.4-2.85-.35-9.25-.6-6.7-.15-8.5-.25-2.7-.1-27.75-.1-25.1 0-29.6.1-92.35 1.15-99 1.65-5.15.4-20 0-15.3-.4-24.4-1.25-6.75-.6-21-1.55-12.95-.9-14.85-1.1-6.45-1.05-11.05-1.5-8.7-.85-12.85.5-5.45 1.75-8.1 4.65-3.2 3.4-2.9 8.6.25 4.65 2.1 11.8 1 3.8 2.55 9.1 1 3.85 2.35 10.1-.1 1-1.5 1-1.75 0-7.7.85-7.1 1-9.8 2.05-2.4.9-23 4.75-21.2 3.9-22.05 4.15-8.2 1.85-15.05 3.35Q7.4 69.1 5.65 70.3 2.5 72.45 2 73.1.6 75 .75 79.2q.15 4.15 1.3 12.75.9 6.85 1.45 10 .5 2.75 8.55 54 6.65 42.15 7.35 46.85 1.15 7.65 4.9 28.55 4.55 25.2 6.35 31.2 2.45 8.15 3.8 11.75 1.85 4.9 3.2 5.75 1.25.8 6.85.65 2.75-.05 5.3-.25l23.85.35q.1 0 1 .95t2 .95q1.9 0 3.4-1.4l23.1-.25 43.65.4q135.05 2.15 137.9 1.9 1.25-.1 72.9.5 72.45.65 76.85.45 8.1-.35 64 .4 143.35.95 146 1.1.55.05 75.3.3 74.7.3 79.8.6 8.65.5 68.25-.35l51.75.5 1.6.4q1.95.35 3.8.05 1.45-.25 3.5-.2 1.9 0 3.35-.3 2.1-.45 8.25-.8 6.25-.3 8.75-.05 1.7.2 8 1 5.75.3 7.4-1.75 1.75-2.2 4.95-10.85 2.8-7.55 4.05-12.4.65-2.5 3.6-17.2 2.75-13.75 3.15-14.8.45-1.25 4.45-22.85 4.05-22.4 4.4-24.4.3-1.45 3.75-25.2 3.35-23.2 4-26.3 1.15-5.5 2.35-18.8 1.4-15.7.8-23.7-.6-8.35-3.35-11.15z" id="a" /> 
              </defs> 
            <use xlink:href="#a"/> 
          </svg>
          <img src="https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/f6df13a9d4a44573a45e9fc5cbcf012d~tplv-k3u1fbpfcp-zoom-1.image" alt="">
    </section>

在線:https://codepen.io/kylewetton/pen/OJLmJoV

6. CSS 等比縮放 aspect-ratio

.container {
  width: 100%;
  aspect-ratio: 1 / 1; /* 生成一個 1:1 的正方形 */
}

🌰:

7. CSS 滾動捕捉 scroll-snap-type

🌰:實現 h5 滾動效果

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        * {margin: 0;padding:0;}
       .container {
            height: 100vh;
            overflow-y: auto;
            scroll-behavior: smooth;
            -webkit-overflow-scrolling: touch;
            scroll-snap-type: y mandatory;
            scroll-snap-stop: always;
        }
        /* .container::-webkit-scrollbar {
            display: none;
        } */ 

        .container img {
            height: 100vh;
            width: 100%;
            scroll-snap-align: center;
            vertical-align: middle;
        }


    </style>
</head>
<body>
    <div class="container">
        <img src="https://picsum.photos/500/300?random=1" alt="">
        <img src="https://picsum.photos/500/300?random=2" alt="">
        <img src="https://picsum.photos/500/300?random=3" alt="">
        <img src="https://picsum.photos/500/300?random=4" alt="">
        <img src="https://picsum.photos/500/300?random=5" alt="">
        <img src="https://picsum.photos/500/300?random=6" alt="">
        <img src="https://picsum.photos/500/300?random=7" alt="">
      </div>
</body>
</html>

在電腦上的滾動略有卡頓,手機上體驗良好

🌰:Demo: codepen.io/airen/full/…(圖片的中心位置和容器中心位置對齊)
🌰:Demo: codepen.io/airen/full/… ( iOS的一些原生交互)
🌰:Demo: codepen.io/airen/full/…

8. CSS Gap(溝槽)

.gap { 
  gap: 10px; 
} 
/* 等同於 */ 
.gap { 
  row-gap: 10px; 
  column-gap: 10px 
} 

9. CSS 邏輯屬性 (個人暫無用處)

可能在某些國際化需求上會用到

<style>
.right {
    direction: rtl;
    unicode-bidi: embed;
}
:is(.right, .left) p {display: inline-block;}
:is(.right, .left) .avatar {
    margin-inline-end: 1rem; // 邏輯屬性
    /* 等於以下兩句話 */
    /*
    .avatar {
      margin-right: 1rem;
    }
    div[dir="rtl"] .avatar {
      margin-right: 0;
      margin-left: 1rem;
    }
    */
}
</style>
<div>
    <div class="left">
      <p class="avatar">頭像</p>
      <p>內容: abcdefg</p>
    </div>
    <div class="right" dir="rtl">
      <p class="avatar">頭像</p>
      <p>內容: abcdefg</p>
    </div>
</div>

10. CSS 比較函數 min()max()clamp()

🌰:min(50vw, 500px) 在瀏覽器視窗寬度改變時,返回的值的變化:

clamp(MIN, VAL, MAX),這三個值之間的關係(或者說取值的方式):
  • 如果 VAL 在 MIN 和 MAX 之間,則使用 VAL 作爲函數的返回值
  • 如果 VAL 大於 MAX ,則使用 MAX 作爲函數的返回值
  • 如果 VAL 小於 MIN ,則使用 MIN 作爲函數的返回值
.element { 
    width: clamp(100px, 50vw, 500px); 

    /* 50vw相當於視窗寬度的一半,如果視窗寬度是760px的話,那麼50vw相當等於380px*/ 
    width: clamp(100px, 380px, 500px); 

    /* 用min()和max()描述*/ 
    width: max(100px, min(380px, 500px));

    /*min(380px, 500px)返回的值是380px*/ 
    width: max(100px, 380px);

    /*max(100px, 380px)返回的值是380px*/ 
    width: 380px; 
}

11. CSS 內容可見性 content-visibility 未實測

在這種場合下,我們可以使用CSS的 content-visibility 來跳過屏幕外的內容渲染。也就是說,如果你有大量的離屏內容(Off-screen Content),這將會大幅減少頁面渲染時間。

section {
  content-visibility: auto;
  contain-intrinsic-size: 1000px;
}

12. CSS 的嵌套 未發佈

W3C 也在討論和定義CSS中的嵌套規則。目前兩種規則:

foo {
    color: red;
  
  @nest bar {
    color: green;
  }
}

// 或者 
foo {
    color: red;
  
  & bar {
    color: green;
  }
}

// 都等同於
foo {
    color: red;
}

foo bar {
    color: green;
}

13. @scope

/* @scope (<root>#) [to (<boundary>#)]? { … } */

@scope (.tabs) to (.panel) {
  :scope { /* targeting the scope root */ }
  .light-theme :scope .tab { /* contextual styles */ }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章