var - CSS自定義變量

    自定義CSS的變量,以便重復(fù)使用

    在開發(fā)網(wǎng)頁時(shí),我配置了主色和背景色,以便我在接下的編碼過程中,重復(fù)去使用他們。

    但是,當(dāng)我有了新的配送方案時(shí),我就需要一個(gè)個(gè)的把他們的顏色搜索出來,批量替換。

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

    定義與用法

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

    一、變量的聲明

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

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

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

    它們與colorfont-size等正式屬性沒有什么不同,只是沒有默認(rèn)含義。所以 CSS 變量(CSS variable)又叫做"CSS 自定義屬性"(CSS custom properties)。因?yàn)樽兞颗c自定義的 CSS 屬性其實(shí)是一回事。

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

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

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

    二、var() 函數(shù)

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

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

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

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

    第二個(gè)參數(shù)不處理內(nèi)部的逗號或空格,都視作參數(shù)的一部分。

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

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

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

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

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

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

    三、變量值的類型

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

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

    利用這一點(diǎn),可以 debug。

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

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

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

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

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

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

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

    四、作用域

    同一個(gè) CSS 變量,可以在多個(gè)選擇器內(nèi)聲明。讀取的時(shí)候,優(yōu)先級最高的聲明生效。這與 CSS 的"層疊"(cascade)規(guī)則是一致的。

    下面是一個(gè)例子

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

    上面代碼中,三個(gè)選擇器都聲明了--color變量。不同元素讀取這個(gè)變量的時(shí)候,會(huì)采用優(yōu)先級最高的規(guī)則,因此三段文字的顏色是不一樣的。

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

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

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

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

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

    五、響應(yīng)式布局

    CSS 是動(dòng)態(tài)的,頁面的任何變化,都會(huì)導(dǎo)致采用的規(guī)則變化。

    利用這個(gè)特點(diǎn),可以在響應(yīng)式布局的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命令進(jìn)行檢測。

    
    @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 變量的寫法如下。

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

    這意味著,JavaScript 可以將任意值存入樣式表。下面是一個(gè)監(jiān)聽事件的例子,事件信息被存入 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 讀取。這意味著,可以把樣式設(shè)置寫在 CSS 變量中,讓 JavaScript 讀取。

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

    更多

    現(xiàn)在常用的是lesssas,他們的功能更加強(qiáng)大,可以實(shí)現(xiàn)函數(shù)式編程,是現(xiàn)在開發(fā)項(xiàng)目的主要技術(shù)之一。

    當(dāng)然,他們的基礎(chǔ)還是CSS,打好基礎(chǔ),才能蓋起高樓大廈。

    補(bǔ)充其他常用函數(shù)

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

    參考文章

    默認(rèn)分類

    v-bind動(dòng)態(tài)綁定樣式 - Vue3新手基礎(chǔ)教程

    2022-8-15 18:06:27

    默認(rèn)分類

    Proxy - Javascript中的代理器

    2022-9-1 15:35:32

    ??
    Npcink上的部份代碼及教程來源于互聯(lián)網(wǎng),僅供網(wǎng)友學(xué)習(xí)交流,若您喜歡本文可附上原文鏈接隨意轉(zhuǎn)載。
    無意侵害您的權(quán)益,請發(fā)送郵件至 1355471563#qq.com 或點(diǎn)擊右側(cè) 私信:Muze 反饋,我們將盡快處理。
    0 條回復(fù) A文章作者 M管理員
      暫無討論,說說你的看法吧
    ?
    個(gè)人中心
    購物車
    優(yōu)惠劵
    今日簽到
    有新私信 私信列表
    搜索
    主站蜘蛛池模板: 四虎成人精品一区二区免费网站| 无码日韩精品一区二区三区免费| 国产一区二区三区在线观看精品 | 无码人妻久久久一区二区三区| tom影院亚洲国产一区二区| 国99精品无码一区二区三区| 人妻无码一区二区不卡无码av| 日韩制服国产精品一区| 国产福利视频一区二区| 日韩精品一区二区三区中文字幕| 精品一区二区三区影院在线午夜| 无码一区二区三区免费视频| 亚洲性无码一区二区三区| 亚洲制服中文字幕第一区| 日本精品一区二区三区四区| 高清无码一区二区在线观看吞精| 精品一区二区三区四区在线播放| 日本精品高清一区二区| 高清一区二区三区免费视频| 亚洲av无码成人影院一区| 国产在线精品一区在线观看| 成人免费av一区二区三区| 精品人妻系列无码一区二区三区| 国产成人免费一区二区三区| 日韩AV无码一区二区三区不卡毛片| 亚洲一区二区久久| 国产免费播放一区二区| 国产高清精品一区| 武侠古典一区二区三区中文| 久久久综合亚洲色一区二区三区| 蜜臀Av午夜一区二区三区| 国产精品制服丝袜一区| 国产在线观看一区二区三区四区| 一区二区三区在线| 亚洲国产精品第一区二区| 无码国产精品一区二区免费I6| 老湿机一区午夜精品免费福利| 亚洲视频在线一区二区| 88国产精品视频一区二区三区| 极品少妇一区二区三区四区| 精品国产日韩亚洲一区|