欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

純CSS免費讓網(wǎng)站擁有暗黑模式切換功能的實現(xiàn)代碼

  發(fā)布時間:2021-02-22 16:48:57   作者:佚名   我要評論
這篇文章主要介紹了純CSS免費讓網(wǎng)站擁有暗黑模式切換功能的實現(xiàn)代碼,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下

前言

暗黑模式這個概念最早起源于 MacOS系統(tǒng)Mojave ,提供 淺色主題深色主題 兩種皮膚供用戶選擇, 深色主題 就是我們常說的 暗黑模式 。為了眼睛健康,筆者在手機、平板和電腦上都選擇了 暗黑模式 。

隨著蘋果官方逐漸要求各大系統(tǒng)平臺都得適配 暗黑模式 ,所以筆者也探索出一種應(yīng)該是 市面上最低成本網(wǎng)站暗黑模式適配方案 。

認識筆者的朋友應(yīng)該都知道筆者是一位重度CSS發(fā)燒友,當然這次也是使用純CSS實現(xiàn)這個方案。是的,不加任何一段JS,側(cè)面再次證明CSS的強大。

思路

思路很簡單,使用一個按鈕來回切換主題樣式。按鈕未選中則切換到 淺色主題 ,按鈕選中則切換到 深色主題 ??捎?:checked+ 打輔助完成這個任務(wù)。

:checked :選項選中的表單元素

 + :元素相鄰的同胞元素

使用 <input> 模擬按鈕,當按鈕處于選中狀態(tài)時觸發(fā) :checked ,通過 + 帶動后面相鄰的網(wǎng)站主體 <div> 進入 暗黑模式 ,選中狀態(tài)取消時則退出 暗黑模式 。

<body>
    <input class="ios-switch" type="checkbox">
    <div class="main">網(wǎng)站主體</div>
</body>

更多選擇器的功能和分類請回看筆者這篇文章 《可能是最全最易記的CSS選擇器分類大法》 。

切換按鈕

打算設(shè)計一個美觀的按鈕,可是沒有特別思路,就打開iPhone,把設(shè)置里的 切換按鈕 用純CSS實現(xiàn)一番。

尺寸和顏色都是與 iPhone切換按鈕 一致。思路是使用 <input> 模擬按鈕,聲明 appearance:none 將其默認外觀抹去,使用 ::before 模擬背景區(qū)域,使用 ::after 模擬點擊區(qū)域,在觸發(fā) :checked 后添加一些小動畫進行修飾,近乎完美地實現(xiàn)了 iPhone切換按鈕 。

<input class="ios-switch" type="checkbox">
.btn {
    border-radius: 31px;
    width: 102px;
    height: 62px;
    background-color: #e9e9eb;
}
.ios-switch {
    position: relative;
    appearance: none;
    cursor: pointer;
    transition: all 100ms;
    @extend .btn;
    &::before {
        position: absolute;
        content: "";
        transition: all 300ms cubic-bezier(.45, 1, .4, 1);
        @extend .btn;
    }
    &::after {
        position: absolute;
        left: 4px;
        top: 4px;
        border-radius: 27px;
        width: 54px;
        height: 54px;
        background-color: #fff;
        box-shadow: 1px 1px 5px rgba(#000, .3);
        content: "";
        transition: all 300ms cubic-bezier(.4, .4, .25, 1.35);
    }
    &:checked {
        background-color: #5eb662;
        &::before {
            transform: scale(0);
        }
        &::after {
            transform: translateX(40px);
        }
    }
}

請戳 這里 查看在線演示與源碼。

暗黑模式

還記得4月4日那次全網(wǎng)開啟悼念模式嗎?筆者發(fā)表了一篇文章 《一行代碼全站進入悼念模式》 ,巧妙地使用 filter 這個強大的CSS屬性。

html {
    filter:grayscale(1);
}

真的是一行代碼,本次也不例外, 一行代碼全站進入暗黑模式 。

html {
    filter: invert(1) hue-rotate(180deg);
}

filter 的兼容性不差,各位同學可放心使用,還有一些細節(jié)地方需注意,本文就不重復講解了,詳情可回看 《一行代碼全站進入悼念模式》 。

filter 是一個非常神奇的屬性,能將 Photoshop 一些基礎(chǔ)的濾鏡效果應(yīng)用到網(wǎng)站上。筆者平時非常喜歡使用 filter ,在筆者的CodePen 上有許多純CSS特效都使用了 filter ,細心的同學可能會發(fā)現(xiàn)筆者特別喜歡使用 hue-rotate() 這個函數(shù)結(jié)合 CSS變量 動態(tài)生成過渡顏色,詳情請回看 《妙用CSS變量,讓你的CSS變得更心動》 。

本次的 暗黑模式 使用到兩個濾鏡函數(shù): invert() 、 hue-rotate()

invert() :反相,反向輸出圖像著色,值為 0% 則無變化,值為 0~100% 則是線性乘子效果,值為 100% 則完全反轉(zhuǎn)

hue-rotate() :色相旋轉(zhuǎn),減弱圖像著色,處理非黑白的顏色,值為 0deg 則無變化,值為 0~360deg 則逐漸減弱,值超過 360deg 則相當繞N圈再計算剩余的值

invert() 簡單理解就是 黑變白,白變黑,黑白顛倒 。 hue-rotate() 簡單理解就是 沖淡顏色 。為了確保主題色調(diào)不會改變,將色相旋轉(zhuǎn)聲明為 180deg 比較合理。

依據(jù)上述分析的思路,當按鈕處于選中狀態(tài)時使用 + 連帶后面的同胞元素也進入選中狀態(tài)。若同胞元素無背景色需聲明 background-color:#fff ,否則無法讓濾鏡效果起效,為了讓這個同胞元素在使用濾鏡效果時過渡得更自然,聲明 transition:all 300ms

.ios-switch {
    ...
    &:checked {
        ...
        & + .main {
            filter: invert(1) hue-rotate(180deg);
        }
    }
}
.main {
    background-color: #fff;
    transition: all 300ms;
}

CodePen 上為了更好地展示效果,就使用 <iframe> 引入我們最愛的 掘金社區(qū) ,免費為其增加 暗黑模式 切換功能:wink:。同時在排版上做了少量修改,請戳 這里 查看在線演示與源碼。

優(yōu)化

細心的同學可能會發(fā)現(xiàn),怎么圖片都變成照B超的感覺了。

按照設(shè)計原則來說,換膚只針對組件,像一些媒體類型的元素,例如背景、圖片、視頻等,都是不能直接處理的,需保持其原樣。既然 暗黑模式 是使用了濾鏡的反相和色相旋轉(zhuǎn)實現(xiàn),那么對這些媒體元素再次使用濾鏡的反相和色相旋轉(zhuǎn)就能復原了。使用過 Photoshop濾鏡 的同學應(yīng)該會更清楚。

img,
video {
    filter: invert(1) hue-rotate(180deg);
}

還有一個問題,背景怎樣處理?眾所周知,背景是使用 background 系列屬性進行聲明的,因此無法通過特定的選擇器進行標注。但是,可換種思路處理,就是給有背景的元素加上一個特定類名,將其包含到上述規(guī)則里即可。

通過 Chrome DevTools 查看 掘金社區(qū) 的網(wǎng)站源碼,發(fā)現(xiàn)這些頭像、縮略圖和展示圖都有一些特定類名,將其特定類名添加到規(guī)則里。

img,
video,
.avatar,
.image,
.thumb {
    filter: invert(1) hue-rotate(180deg);
}

在通用網(wǎng)站里,這個類名可自行定義,最可行的方法就是定義一個特定類名 .exclude 。不使用濾鏡效果的元素統(tǒng)統(tǒng)加上 .exclude 。

.exclude {
    filter: invert(1) hue-rotate(180deg);
}

改造

上述為了方便演示代碼,在 CodePen Demo 里使用 <iframe> 引入我們最愛的 掘金社區(qū) 。由于無法對 <iframe> 進行樣式聲明,所以轉(zhuǎn)移到 掘金社區(qū) 上,通過 Chrome DevTools 直接改造。

Chrome瀏覽器 里按 F12Cmd+Alt+I 打開 Chrome DevTools ,分析網(wǎng)站的HTML結(jié)構(gòu)。

<body>
    <div id="__nuxt">...</div>
</body>

<body> 里插入 切換按鈕

<body>
    <input class="ios-switch" type="checkbox">
    <div id="__nuxt">...</div>
</body>

把以下 SCSS代碼 轉(zhuǎn)換成 CSS代碼 插入到 <head> 新建的 <style> 里。推薦一個在線 SASS轉(zhuǎn)CSS工具網(wǎng)站 ,復制以下代碼到網(wǎng)站里直接轉(zhuǎn)換,完成后再貼到 <style> 里。

.btn {
    border-radius: 31px;
    width: 102px;
    height: 62px;
    background-color: #e9e9eb;
}
.ios-switch {
    position: relative;
    appearance: none;
    cursor: pointer;
    transition: all 100ms;
    @extend .btn;
    &::before {
        position: absolute;
        content: "";
        transition: all 300ms cubic-bezier(.45, 1, .4, 1);
        @extend .btn;
    }
    &::after {
        position: absolute;
        left: 4px;
        top: 4px;
        border-radius: 27px;
        width: 54px;
        height: 54px;
        background-color: #fff;
        box-shadow: 1px 1px 5px rgba(#000, .3);
        content: "";
        transition: all 300ms cubic-bezier(.4, .4, .25, 1.35);
    }
    &:checked {
        background-color: #5eb662;
        &::before {
            transform: scale(0);
        }
        &::after {
            transform: translateX(40px);
        }
        & + #__nuxt {
            filter: invert(1) hue-rotate(180deg);
            img,
            video,
            .avatar,
            .image,
            .thumb {
                filter: invert(1) hue-rotate(180deg);
            }
        }
    }
}
#__nuxt {
    background-color: #fff;
    transition: all 300ms;
}

完成后發(fā)現(xiàn) 切換按鈕 沒有出現(xiàn),可通過 position:absolute 將其絕對定位到想要顯示的位置。

.ios-switch {
    position: absolute;
    right: 0;
    top: 0;
    z-index: 99999;
    outline: none;
}

或在 <div id="__nuxt"> 里任意地方創(chuàng)建一個 <label> ,通過聲明 <input class="ios-switch" id="toggle" hidden><label for="toggle"> 互相綁定,將 <input> 的觸發(fā)區(qū)域轉(zhuǎn)移到 <label> 上。具體怎樣實現(xiàn),可參照筆者這個 純CSS標簽導航欄 實現(xiàn)。

若覺得講解有點亂,可稍作整理,三步完成上述操作。

打開掘金社區(qū)網(wǎng)站

F12Cmd+Alt+I 打開 Chrome DevTools

<head> 里插入 <style>

為了方便復制粘貼,筆者將上述分析得出的CSS代碼進行壓縮。

<style>.btn,.ios-switch::before,.ios-switch{border-radius:31px;width:102px;height:62px;background-color:#e9e9eb;}.ios-switch{position:relative;appearance:none;cursor:pointer;transition:all 100ms;}.ios-switch::before{position:absolute;content:"";transition:all 300ms cubic-bezier(0.45,1,0.4,1);}.ios-switch::after{position:absolute;left:4px;top:4px;border-radius:27px;width:54px;height:54px;background-color:#fff;box-shadow:1px 1px 5px rgba(0,0,0,0.3);content:"";transition:all 300ms cubic-bezier(0.4,0.4,0.25,1.35);}.ios-switch:checked{background-color:#5eb662;}.ios-switch:checked::before{transform:scale(0);}.ios-switch:checked::after{transform:translateX(40px);}.ios-switch:checked + #__nuxt{filter:invert(1) hue-rotate(180deg);}.ios-switch:checked + #__nuxt img,.ios-switch:checked + #__nuxt video,.ios-switch:checked + #__nuxt .avatar,.ios-switch:checked + #__nuxt .image,.ios-switch:checked + #__nuxt .thumb{filter:invert(1) hue-rotate(180deg);}#__nuxt{background-color:#fff;transition:all 300ms;}.ios-switch{position:absolute;right:0;top:0;z-index:99999;outline:none;}</style>

<body> 里插入 <input>

<body>
    <input class="ios-switch" type="checkbox">
    <div id="__nuxt">...</div>
</body>

就這樣,一個純CSS的實現(xiàn)方案就能讓網(wǎng)站瞬間擁有 暗黑模式 切換功能,有沒有又對CSS刮目相看了。

總結(jié)

整個 純CSS實現(xiàn)方案 圍繞著 :checked 、 +filter 三個點進行,缺一不可。看似簡單,若不是常用CSS做特效也很難想象出區(qū)區(qū)三個點打輔助也能完成一個這么強大的功能。

<body>
    <input class="ios-switch" type="checkbox">
    <div class="main">網(wǎng)站主體</div>
</body>
.ios-switch {
    ...
    &:checked {
        ...
        & + .main {
            filter: invert(1) hue-rotate(180deg);
            img,
            video,
            .exclude {
                filter: invert(1) hue-rotate(180deg);
            }
        }
    }
}
.main {
    background-color: #fff;
    transition: all 300ms;
}

相比于 CSS+JS實現(xiàn)方案 而言,無需維護一整套 暗黑模式 樣式代碼,無需操作 DOM ,沒有了往常復雜的操作。除非要做一整套高度定制的 暗黑模式 才需一個 CSS+JS實現(xiàn)方案 ,否則用該方案即可。

本方案具有以下特點。

  • 純CSS實現(xiàn),簡單高效,逼格更高
  • 幾乎沒有維護成本,快速迭代
  • 充分利用濾鏡效果,兼容性好

試試無妨,完成了覺得效果不錯就趕緊找你老板加薪去:stuck_out_tongue_winking_eye:,哈哈!

到此這篇關(guān)于純CSS免費讓網(wǎng)站擁有暗黑模式切換功能的實現(xiàn)代碼的文章就介紹到這了,更多相關(guān)CSS暗黑模式切換內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持腳本之家!

相關(guān)文章

  • CSS變量實現(xiàn)暗黑模式的示例代碼

    這篇文章主要介紹了CSS變量實現(xiàn)暗黑模式的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習
    2020-03-16
  • Html頁面支持暗黑模式的實現(xiàn)

    這篇文章主要介紹了Html頁面支持暗黑模式的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習
    2019-12-26
  • 詳解Html5項目適配系統(tǒng)深色模式方案總結(jié)

    這篇文章主要介紹了詳解Html5項目適配系統(tǒng)深色模式方案總結(jié),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一
    2021-04-14

最新評論