var - CSS自定義變量

    自定義CSS的變量,以便重復使用

    在開發網頁時,我配置了主色和背景色,以便我在接下的編碼過程中,重復去使用他們。

    但是,當我有了新的配送方案時,我就需要一個個的把他們的顏色搜索出來,批量替換。

    有沒有更省力的辦法呢? 一處修改,處處改好,CSS變量來了!!!

    定義與用法

    var() 函數用于插入自定義的屬性值,如果一個屬性值在多處被使用,該方法就很有用。

    一、變量的聲明

    聲明變量的時候,變量名前面要加兩根連詞線(--)。

    body {
      --foo: #7F583F;
      --bar: #F7EFD2;
    }

    上面代碼中,body選擇器里面聲明了兩個變量:--foo--bar

    它們與colorfont-size等正式屬性沒有什么不同,只是沒有默認含義。所以 CSS 變量(CSS variable)又叫做"CSS 自定義屬性"(CSS custom properties)。因為變量與自定義的 CSS 屬性其實是一回事。

    你可能會問,為什么選擇兩根連詞線(--)表示變量?因為$foo被 Sass 用掉了,@foo被 Less 用掉了。為了不產生沖突,官方的 CSS 變量就改用兩根連詞線了。

    各種值都可以放入 CSS 變量。

    注意:變量名大小寫敏感,--header-color--Header-Color是兩個不同變量。

    二、var() 函數

    var()函數用于讀取變量。

    
    a {
      color: var(--foo);
      text-decoration-color: var(--bar);
    }
    

    var()函數還可以使用第二個參數,表示變量的默認值。如果該變量不存在,就會使用這個默認值。

    
    color: var(--foo, #7F583F);
    

    第二個參數不處理內部的逗號或空格,都視作參數的一部分。

    
    var(--font-stack, "Roboto", "Helvetica");
    var(--pad, 10px 15px 20px);
    

    var()函數還可以用在變量的聲明。

    
    :root {
      --primary-color: red;
      --logo-text: var(--primary-color);
    }
    

    注意,變量值只能用作屬性值,不能用作屬性名。

    
    .foo {
      --side: margin-top;
      /* 無效 */
      var(--side): 20px;
    }
    

    上面代碼中,變量--side用作屬性名,這是無效的。

    三、變量值的類型

    如果變量值是一個字符串,可以與其他字符串拼接。

    --bar: 'hello';
    --foo: var(--bar)' world';
    

    利用這一點,可以 debug。

    
    body:after {
      content: '--screen-category : 'var(--screen-category);
    }
    

    如果變量值是數值,不能與數值單位直接連用。

    
    .foo {
      --gap: 20;
      /* 無效 */
      margin-top: var(--gap)px;
    }
    

    上面代碼中,數值與單位直接寫在一起,這是無效的。必須使用calc()函數,將它們連接。

    
    .foo {
      --gap: 20;
      margin-top: calc(var(--gap) * 1px);
    }
    

    如果變量值帶有單位,就不能寫成字符串。

    /* 無效 */
    .foo {
      --foo: '20px';
      font-size: var(--foo);
    }
    
    /* 有效 */
    .foo {
      --foo: 20px;
      font-size: var(--foo);
    }
    

    四、作用域

    同一個 CSS 變量,可以在多個選擇器內聲明。讀取的時候,優先級最高的聲明生效。這與 CSS 的"層疊"(cascade)規則是一致的。

    下面是一個例子

    
    <style>
      :root { --color: blue; }
      div { --color: green; }
      #alert { --color: red; }
      * { color: var(--color); }
    </style>
    
    <p>藍色</p>
    <div>綠色</div>
    <div id="alert">紅色</div>
    

    上面代碼中,三個選擇器都聲明了--color變量。不同元素讀取這個變量的時候,會采用優先級最高的規則,因此三段文字的顏色是不一樣的。

    這就是說,變量的作用域就是它所在的選擇器的有效范圍。

    
    body {
      --foo: #7F583F;
    }
    
    .content {
      --bar: #F7EFD2;
    }
    

    上面代碼中,變量--foo的作用域是body選擇器的生效范圍,--bar的作用域是.content選擇器的生效范圍。

    由于這個原因,全局的變量通常放在根元素:root里面,確保任何選擇器都可以讀取它們。

    :root {
      --main-color: #06c;
    }
    

    五、響應式布局

    CSS 是動態的,頁面的任何變化,都會導致采用的規則變化。

    利用這個特點,可以在響應式布局的media命令里面聲明變量,使得不同的屏幕寬度有不同的變量值。

    
    body {
      --primary: #7F583F;
      --secondary: #F7EFD2;
    }
    
    a {
      color: var(--primary);
      text-decoration-color: var(--secondary);
    }
    
    @media screen and (min-width: 768px) {
      body {
        --primary:  #F7EFD2;
        --secondary: #7F583F;
      }
    }
    

    六、兼容性處理

    對于不支持 CSS 變量的瀏覽器,可以采用下面的寫法。

    
    a {
      color: #7F583F;
      color: var(--primary);
    }
    

    也可以使用@support命令進行檢測。

    
    @supports ( (--a: 0)) {
      /* supported */
    }
    
    @supports ( not (--a: 0)) {
      /* not supported */
    }

    七、JavaScript 操作

    JavaScript 也可以檢測瀏覽器是否支持 CSS 變量。

    
    const isSupported =
      window.CSS &&
      window.CSS.supports &&
      window.CSS.supports('--a', 0);
    
    if (isSupported) {
      /* supported */
    } else {
      /* not supported */
    }
    

    JavaScript 操作 CSS 變量的寫法如下。

    
    // 設置變量
    document.body.style.setProperty('--primary', '#7F583F');
    
    // 讀取變量
    document.body.style.getPropertyValue('--primary').trim();
    // '#7F583F'
    
    // 刪除變量
    document.body.style.removeProperty('--primary');
    

    這意味著,JavaScript 可以將任意值存入樣式表。下面是一個監聽事件的例子,事件信息被存入 CSS 變量。

    
    const docStyle = document.documentElement.style;
    
    document.addEventListener('mousemove', (e) => {
      docStyle.setProperty('--mouse-x', e.clientX);
      docStyle.setProperty('--mouse-y', e.clientY);
    });
    

    那些對 CSS 無用的信息,也可以放入 CSS 變量。

    
    --foo: if(x > 5) this.width = 10;
    

    上面代碼中,--foo的值在 CSS 里面是無效語句,但是可以被 JavaScript 讀取。這意味著,可以把樣式設置寫在 CSS 變量中,讓 JavaScript 讀取。

    所以,CSS 變量提供了 JavaScript 與 CSS 通信的一種途徑。

    更多

    現在常用的是lesssas,他們的功能更加強大,可以實現函數式編程,是現在開發項目的主要技術之一。

    當然,他們的基礎還是CSS,打好基礎,才能蓋起高樓大廈。

    補充其他常用函數

    • attr()(返回選擇元素的屬性值。)
    • calc()(允許計算 CSS 的屬性值,比如動態計算長度值。)
    • var()(用于插入自定義的屬性值。)

    參考文章

    默認分類

    v-bind動態綁定樣式 - Vue3新手基礎教程

    2022-8-15 18:06:27

    默認分類

    Proxy - Javascript中的代理器

    2022-9-1 15:35:32

    ??
    Npcink上的部份代碼及教程來源于互聯網,僅供網友學習交流,若您喜歡本文可附上原文鏈接隨意轉載。
    無意侵害您的權益,請發送郵件至 1355471563#qq.com 或點擊右側 私信:Muze 反饋,我們將盡快處理。
    0 條回復 A文章作者 M管理員
      暫無討論,說說你的看法吧
    ?
    個人中心
    購物車
    優惠劵
    今日簽到
    有新私信 私信列表
    搜索
    主站蜘蛛池模板: 久久精品视频一区二区三区| 国产精品美女一区二区| 亚洲AV福利天堂一区二区三 | 国产福利91精品一区二区三区| 在线电影一区二区| 国产韩国精品一区二区三区久久| 一区二区三区四区在线视频 | 波多野结衣精品一区二区三区| 国产精品美女一区二区视频| 一区在线免费观看| 精品视频一区二区观看| 婷婷亚洲综合一区二区| 精品视频一区二区三区四区 | 国产成人精品一区二区三区| 在线观看精品视频一区二区三区| 麻豆文化传媒精品一区二区| 亚洲AV无码一区东京热| 中文字幕在线观看一区| 中文字幕久久久久一区| 亚洲毛片不卡av在线播放一区| 国产精品久久亚洲一区二区| 成人无码一区二区三区| 另类ts人妖一区二区三区| 亚洲一本一道一区二区三区| 亚洲中文字幕一区精品自拍| 无码日韩人妻av一区免费| 无码人妻精一区二区三区| 无码视频免费一区二三区| 麻豆va一区二区三区久久浪| 四虎在线观看一区二区| 午夜视频久久久久一区| 精品一区二区三区四区在线| 久久精品中文字幕一区| 中文字幕AV无码一区二区三区| 亚洲一区二区三区不卡在线播放| 亚洲熟女综合色一区二区三区| 日本高清成本人视频一区| 精品日本一区二区三区在线观看| 本免费AV无码专区一区| 久久精品国产一区二区| 成人国内精品久久久久一区 |