如今不少app 都已經實現了
夜間模式
,這樣能夠在夜間的時候保護咱們的眼睛呢?因而,就有了給本身博客添加夜間模式的想法,花很少說,開始吧。javascript
本質上講,「夜間模式」就是在指定時間段內修改頁面配色、圖片亮度等,所以咱們把問題拆開爲三部分進行分析:css
動態修改頁面配色、圖片亮度 既然提到了動態,就免不了要用到JavaScript了。
咱們知道樣式有三種書寫形式,分別爲外聯、內聯和內嵌。使用JS修改樣式,就要從這三個地方入手:java
第四種方法違反了「結構與表現分離的設計思想」,且內嵌樣式優先級太高
並且真正實現的話,須要對大量元素編寫JS代碼,執行效率低下,維護困難,所以通常不做考慮
前三種方法都有其適用場景,在這裏選擇第二種web
以class來區分樣式,實現了功能與表現的分離。對於JS代碼來講,問題變成了如何操做元素的class,而沒必要關心樣式的具體表現。後端
JS中Element.classList
的add()
和remove()
方法,正好知足咱們的需求,且支持絕大多數瀏覽器(IE10以上支持)
但先別急着寫,還有一個細節:夜間模式這個狀態應被保存下來一直生效,或持續到本次會話結束,cookie
能夠知足咱們的要求
因此事情就很明朗了,編寫代碼:瀏覽器
function switchNightMode(){ var night = document.cookie.replace(/(?:(?:^|.*;\s*)night\s*\=\s*([^;]*).*$)|^.*$/, "$1") || '0'; if(night == '0'){ document.body.classList.add('night'); document.cookie = "night=1;path=/" console.log('夜間模式開啓'); }else{ document.body.classList.remove('night'); document.cookie = "night=0;path=/" console.log('夜間模式關閉'); } }
便可實現夜間模式的切換和狀態保存。cookie
思路很簡單,頁面加載後判斷時間,在指定範圍內修改元素class。這裏有一個知識點當即調用函數網絡
(function(){ if(document.cookie.replace(/(?:(?:^|.*;\s*)night\s*\=\s*([^;]*).*$)|^.*$/, "$1") === ''){ if(new Date().getHours() > 22 || new Date().getHours() < 6){ document.body.classList.add('night'); document.cookie = "night=1;path=/"; console.log('夜間模式開啓'); }else{ document.body.classList.remove('night'); document.cookie = "night=0;path=/"; console.log('夜間模式關閉'); } }else{ var night = document.cookie.replace(/(?:(?:^|.*;\s*)night\s*\=\s*([^;]*).*$)|^.*$/, "$1") || '0'; if(night == '0'){ document.body.classList.remove('night'); }else if(night == '1'){ document.body.classList.add('night'); } } })();
在上面的代碼中,咱們控制了body的class,這是全部頁面元素的祖先元素。啓用夜間模式時,body的class值含有night
所以在編寫夜間模式的樣式時,在樣式選擇器前加body.night便可,可酌情使用!important
例如:app
body.night{ background-color: #263238; color: #aaa; }
使用CSS濾鏡中的brightness()濾鏡(僅支持現代瀏覽器)
body.night img { filter: brightness(30%); }
由於是在本地經過JS操控樣式,因此在JS加載先後樣式不同,會致使頁面閃爍。
可在博客主題中加上判斷,知足時間段及檢測到cookie含有相關字段後可直接輸出body class爲night,如:
<body class="<?php echo($_COOKIE['night'] == '1' || date("H") > 22 || date("H") < 6 ? 'night' : ''); ?>">
只須要兩步就能夠了,說明以下:
js
代碼塊 ,能夠經過引用的方式引入,也能夠經過寫在側邊欄(記得博客園側邊欄是支持js的,我沒有試過,請自行測試。)部分資源引用於網絡。
Element.classList - Web API | MDN
給博客添加夜間模式
Document.cookie - Web API 接口 | MDN
filter - CSS | MDN