跟著做 JS 30 第三個作品 調整照片:邊框大小 模糊度 邊框顏色
跟著做出來的範例
想法示意
這個練習的重點在於
- spacing 改變 padding
- blur 使用 filter 改變 blur
- base color 改變 background
這三個部分它們怎麼使用 JS 去串聯到 style 裡面做修改,甚至他們有”單位”(ex.px,rem)的情況下
HTML:
首先可以先觀察一開始的原始檔案我就學習到一些基本的 HTML 使用:
認識 HTML type Attribute
- range:滑動桿
- color:顯示顏色選擇器
- min/max: 代表最大最小值
- data-sizing:
HTML5 中的 data-_ attribute 屬性的 _ 的部分是可以自訂的,其中的內容如果要被 JS 讀取得使用dataset
這個物件就可以抓取瞜!
本篇作品 HTML:
1 2 3 4 5 6 7 8 9 10
| <div class="controls"> <label for="spacing">Spacing:</label> <input id="spacing" type="range" name="spacing" min="10" max="200" value="10" data-sizing="px">
<label for="blur">Blur:</label> <input id="blur" type="range" name="blur" min="0" max="25" value="10" data-sizing="px">
<label for="base">Base Color</label> <input id="base" type="color" name="base" value="#ffc600"> </div>
|
CSS:
CSS Variables
使用 CSS 變數有什麼好處呢?
- 統一整個樣式表的樣式 讓大家在原始碼中的數值統一
- 基於預定的數值做計算 因為都有了基準數值後,變數就可以整體做計算,不用一一調整
第一個步驟是宣告變數:
1 2 3 4 5
| :root { --base: #ffc600; --spacing: 10px; --blur: 10px; }
|
第二個步驟是取值階段:
1 2 3 4 5
| img { padding: var(--spacing); background: var(--base); filter: blur(var(--blur)); }
|
本篇作品 CSS:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| :root { --base: #ffc600; --spacing: 10px; --blur: 10px; }
img { padding: var(--spacing); background: var(--base); filter: blur(var(--blur)); }
.hl { color: var(--base); }
body { text-align: center; background: #193549; color: white; font-family: 'helvetica neue', sans-serif; font-weight: 100; font-size: 50px; }
.controls { margin-bottom: 50px; }
input { width: 100px; }
|
JS:
一開始必須先使用 querySelectorAll 抓取要改變的地方也就是
.controls 底下的 <input>
HTMLtag 底下的 value
1
| const inputs = document.querySelectorAll('.controls input');
|
抓去後使用 forEach 在剛剛設定的變數 inputs 上面因為做一個一個操作的時候會使用 forEach,並加入 addEventListener 做事件監聽處理”change”,”mousemove”讓滑鼠在點擊 slidebar 的時候會改變 CSS 的數值進而改變畫面。
兩個使用到的事件:
1 2 3 4
| inputs.forEach(function (input) { input.addEventListener('change', changeHandler) input.addEventListener('mousemove', changeHandler)
|
接下來處理最後一件事情把抓取到的數值以及單位放入 style 裡面使用 setProperty
style.setProperty(propertyName, value, priority);
dataset
這邊來選取 HTMLtag 裡面的屬性上面有提到來選取他設定的屬性或者是''
為空
1
| document.documentElement.style.setProperty('--' + this.name, this.value + (this.dataset.sizing || ''))
|
完整程式碼編排:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| <script> ;(function () { const inputs = document.querySelectorAll('.controls input');
function changeHandler() {
document.documentElement.style.setProperty('--' + this.name, this.value + (this.dataset.sizing || ''))
} inputs.forEach(function (input) { input.addEventListener('change', changeHandler) input.addEventListener('mousemove', changeHandler) })
})() </script>
|
小補充
所有的事件都可以看這個參照~
Event reference
HTML range color
CSS 變數
dataset
setProperty 融合變數的寫法很特別
可以再多留意~