挑戰 JS30 #3 - CSS Variables

閱讀時間約 7 分鐘

本次的挑戰是「CSS Variables」,需要達成的目標是:

「使用者操作拉桿或是選色器時,底下圖片的樣式會有對應的變化。」

此次挑戰涉及以下內容:

  • input 標籤
  • 效果對應的 CSS 屬性
  • CSS 變數
  • 事件綁定

嘗試拆解流程

畫完流程圖之後,很容易看出自己不確定的部分,將這些部分各個擊破以後,也就順利梳理出實作的脈絡,所以這次挑戰比預期還快完成。

雖然看了作者的寫法以後,又發現自己寫得好冗哈哈,這篇文章就一起來看看此次挑戰有哪些知識點和需要修正的地方吧!

raw-image

看完作者的寫法之後,發現流程可以簡化成這樣

raw-image

知識點

CSS - filter 屬性

可以套用模糊、對比等濾鏡效果,更多值可參考 MDN

filter: blur(10px); //模糊
filter: brightness(10%); //明亮

CSS 變數

  • 宣告變數:通常會放在 :root 選擇器中,並使用 --變數名稱 方式來宣告
:root{
--bg-color: #ccc;
--primary: #333;
}
  • 取用變數:需要使用 var 取值
body{
background-color: var(--bg-color);
}

還可以寫得更好的地方

JS30 作者直接透過迴圈監聽每個 input,筆者則是一個一個手動挑出來,程式碼不只冗長,還很沒有效率,以下比較看看兩者寫法:

  • 筆者的寫法
const spacerController = document.querySelector("#spacing");
const blurController = document.querySelector("#blur");
const colorController = document.querySelector("#base");
const target = document.querySelector("img");

function changeSpacer() {
target.style.borderWidth = `${spacerController.value}px`;
}
function changeBlur() {
target.style.filter = `blur(${blurController.value}px)`;
}
function changeColor() {
target.style.borderColor = `${colorController.value}`;
}

spacerController.addEventListener("input", changeSpacer);
blurController.addEventListener("input", changeBlur);
colorController.addEventListener("input", changeColor);
  • 作者的寫法
const inputs = document.querySelectorAll(".controls input");

function handleUpdate() {
const suffix = this.dataset.sizing || "";
document.documentElement.style.setProperty(
`--${this.name}`,
this.value + suffix
);
}

inputs.forEach((input) => input.addEventListener("change", handleUpdate));
inputs.forEach((input) => input.addEventListener("mousemove", handleUpdate));


這次比較多是寫法上可以再調整的地方,所以下面會再進一步探討:

CSS 變數 + documentElement

將變數放到 :root 裡,再透過 JS 去選擇根元素,就能直接對一開始在 :root 裡宣告的變數做操作,也就能直接變動套用了這些變數的 CSS 屬性,相當方便!

另外都是透過 input 的 name 或是自行新增 data 屬性來組合出想要指向的變數名稱與單位,以及 value 取得數值

<input
id="spacing"
type="range"
name="spacing"
min="10"
max="200"
value="10"
data-sizing="px"
/>;
:root {
--​base: #fff;

//這邊的值要對應 input 元素的 value 值,視覺和實際值才會相符
--spacing: 10px;
--blur: 10px;
}

img {
border-width: var(--spacing);
border-style: solid;
border-color: var(--base);
filter: blur(var(--blur));
}
function control(){
//如果 this.dataset.size 為 true 就回傳該值
//為 false 就回傳空字串
const unit = this.dataset.size || "";
document.documentElement.style.setProperty(`--${this.name}`, this.value+unit;
}

之後透過 forEach 迴圈將事件賦予到所有 input 元素上。

input 事件

比較特別的是這邊的事件是使用 "input",當滑鼠拖曳時就會觸發事件,原本一開始是使用 "change" 事件,但是都要在滑鼠拖曳再放開後才會觸發事件,相對沒那麼即時。

const controllers = document.querySelectorAll(".controls input");
controllers.forEach((controller) => {
controller.addEventListener("input", control);
});


附上此次實作結果,今天就介紹到這裡,若有錯誤歡迎指正,也歡迎大家分享自己的看法。

參考資料

7會員
30內容數
正在一點一滴學習程式,相信知識量總有一天會匯聚成大海,目前專門研究前端中。
留言0
查看全部
發表第一個留言支持創作者!
傑米的沙龍 的其他內容
本次的挑戰是「CSS + JS Clock」,需要達成的目標是:「時鐘的指針會轉動,指針都必須依據現實時鐘的規則前進。」這次需要搭配 CSS 動畫,製作時鐘的指針旋轉效果。
這系列文章會記錄 JS 30 當次挑戰時使用到的語法和相關知識。JS 30 官方有提供所有製作網頁的資源,不需要任何事前準備,就能無痛開始撰寫 JS,寫完之後還有 JS 30 作者提供的解答,不知道怎麼下手時可以參考、寫完之後也能了解更多解法,改善自己的寫法。
本次的挑戰是「CSS + JS Clock」,需要達成的目標是:「時鐘的指針會轉動,指針都必須依據現實時鐘的規則前進。」這次需要搭配 CSS 動畫,製作時鐘的指針旋轉效果。
這系列文章會記錄 JS 30 當次挑戰時使用到的語法和相關知識。JS 30 官方有提供所有製作網頁的資源,不需要任何事前準備,就能無痛開始撰寫 JS,寫完之後還有 JS 30 作者提供的解答,不知道怎麼下手時可以參考、寫完之後也能了解更多解法,改善自己的寫法。
你可能也想看
Google News 追蹤
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
美國總統大選只剩下三天, 我們觀察一整週民調與金融市場的變化(包含賭局), 到本週五下午3:00前為止, 誰是美國總統幾乎大概可以猜到60-70%的機率, 本篇文章就是以大選結局為主軸來討論近期甚至到未來四年美股可能的改變
什麼樣的環境或情況讓你感到最安全呢? 哪些習慣或模式讓你覺得最熟悉呢? 你知道自己的舒適圈嗎? 你是否有想過目前的生活是否過於安逸? 或是曾想過能否為自己創造出更多的可能性? (圖片出處:https://images.ctee.com.tw/newsphoto/2022-02-05
Thumbnail
閱讀的內容可以實踐嗎? 最近因為同事推薦,而閱讀了《愛的哲學課》,當我在方格子寫完-誰讓你看見愛?-<愛的哲學課>書評 突然靈機一動,在書中有這麼多似懂非懂的箴言(也像是心靈雞湯...), 如果我每天試著把1句話應用在生活上,會是什麼樣的體驗?於是開啟了這次的挑戰
Thumbnail
今天來學習新的對話 首先需知道的詞彙如下 убрать (to clean up) (v.p.) грязная (dirty) (adj.) обещать (to promise) (v.imp.) занятый (busy) (adj.) оправдание (excuse)
Thumbnail
「真正讓你勇敢的,從來不是你的感覺,而是你的行動」— 網球名將阿格西 最近看完⟪ 公開 : 阿格西自傳 ⟫後得到這句話,讓我想到我一直想要做,卻一直找藉口的事情,那就是運動。 自從生完孩子後,身體不僅無法恢復到從前的狀態,體重還不斷增加。隨著這些變化,健康也開始出現問題
Thumbnail
不再被他人的話語輕易傷害,是一種成長。家人常開著似有似無的玩笑,說我「能力不行、很差」、或是「就是因為找不到工作才回家裡上班」。這些話語曾經深深刺痛我,也無法避免地反駁,也因此讓家人間的感情產生嫌隙。我總是思索,究竟該如何才能符合他們心中的期待。
Thumbnail
前幾天中秋連假時,有個粉絲專頁募集大家的答案:說出一部關於月亮的電影。不少影迷紛紛響應,我的答案是:《下一站,天國!》。
Thumbnail
我還可以用 不要丟棄我 不!要!啊! 我是裝飾擺設 你看不到我 你看不到我 我是你們的回憶 你不能遺棄我呀 對不起!感謝!再見! 最近又開始斷捨離,整理時,一邊檢視物品,一邊想像物品會對我說甚麼? 我想對它們說:對不起,我們要輕裝上路!感謝你們過去陪伴,再見!
Thumbnail
魔鬼說 跳下去 所有痛苦絕望 消失殆盡 跳下去 世界不會因為你而停轉 折翼的天使說 信望愛 留下來 一起旁觀世界的運轉
Thumbnail
新媒體的崛起,不論是社群平台、Youtube、部落格,每個人都有一個讓他人認識自己的門戶,但,回到自我本身,有沒有想過,隨著時代的轉變,更多企業需要透過影音履歷來認識你!這麼多年來,你是否也未曾想過要用一分鐘時間來介紹自己呢?我也有過同樣的瓶頸,但,在這裡,我已經找到解法,就一起來實務操作吧!
Thumbnail
  先帶大家認識一下,2012 NBA選秀第1輪第6順位誕生出來的波特蘭拓荒者一哥Damian Lillard是當年賽季的新人王,賽季打不到一半,Lillard的名聲就開始響徹雲霄,先是取得技術挑戰的冠軍再破NBA新秀最多三分球紀錄,而後再以19分6.5助攻3.1籃板取得自己的新人王...
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
美國總統大選只剩下三天, 我們觀察一整週民調與金融市場的變化(包含賭局), 到本週五下午3:00前為止, 誰是美國總統幾乎大概可以猜到60-70%的機率, 本篇文章就是以大選結局為主軸來討論近期甚至到未來四年美股可能的改變
什麼樣的環境或情況讓你感到最安全呢? 哪些習慣或模式讓你覺得最熟悉呢? 你知道自己的舒適圈嗎? 你是否有想過目前的生活是否過於安逸? 或是曾想過能否為自己創造出更多的可能性? (圖片出處:https://images.ctee.com.tw/newsphoto/2022-02-05
Thumbnail
閱讀的內容可以實踐嗎? 最近因為同事推薦,而閱讀了《愛的哲學課》,當我在方格子寫完-誰讓你看見愛?-<愛的哲學課>書評 突然靈機一動,在書中有這麼多似懂非懂的箴言(也像是心靈雞湯...), 如果我每天試著把1句話應用在生活上,會是什麼樣的體驗?於是開啟了這次的挑戰
Thumbnail
今天來學習新的對話 首先需知道的詞彙如下 убрать (to clean up) (v.p.) грязная (dirty) (adj.) обещать (to promise) (v.imp.) занятый (busy) (adj.) оправдание (excuse)
Thumbnail
「真正讓你勇敢的,從來不是你的感覺,而是你的行動」— 網球名將阿格西 最近看完⟪ 公開 : 阿格西自傳 ⟫後得到這句話,讓我想到我一直想要做,卻一直找藉口的事情,那就是運動。 自從生完孩子後,身體不僅無法恢復到從前的狀態,體重還不斷增加。隨著這些變化,健康也開始出現問題
Thumbnail
不再被他人的話語輕易傷害,是一種成長。家人常開著似有似無的玩笑,說我「能力不行、很差」、或是「就是因為找不到工作才回家裡上班」。這些話語曾經深深刺痛我,也無法避免地反駁,也因此讓家人間的感情產生嫌隙。我總是思索,究竟該如何才能符合他們心中的期待。
Thumbnail
前幾天中秋連假時,有個粉絲專頁募集大家的答案:說出一部關於月亮的電影。不少影迷紛紛響應,我的答案是:《下一站,天國!》。
Thumbnail
我還可以用 不要丟棄我 不!要!啊! 我是裝飾擺設 你看不到我 你看不到我 我是你們的回憶 你不能遺棄我呀 對不起!感謝!再見! 最近又開始斷捨離,整理時,一邊檢視物品,一邊想像物品會對我說甚麼? 我想對它們說:對不起,我們要輕裝上路!感謝你們過去陪伴,再見!
Thumbnail
魔鬼說 跳下去 所有痛苦絕望 消失殆盡 跳下去 世界不會因為你而停轉 折翼的天使說 信望愛 留下來 一起旁觀世界的運轉
Thumbnail
新媒體的崛起,不論是社群平台、Youtube、部落格,每個人都有一個讓他人認識自己的門戶,但,回到自我本身,有沒有想過,隨著時代的轉變,更多企業需要透過影音履歷來認識你!這麼多年來,你是否也未曾想過要用一分鐘時間來介紹自己呢?我也有過同樣的瓶頸,但,在這裡,我已經找到解法,就一起來實務操作吧!
Thumbnail
  先帶大家認識一下,2012 NBA選秀第1輪第6順位誕生出來的波特蘭拓荒者一哥Damian Lillard是當年賽季的新人王,賽季打不到一半,Lillard的名聲就開始響徹雲霄,先是取得技術挑戰的冠軍再破NBA新秀最多三分球紀錄,而後再以19分6.5助攻3.1籃板取得自己的新人王...