俗話說的好,一天一蘋果,醫生遠離我
一天一 JS,What the f*ck JavaScript?
small steps every day - 記錄著新手村日記
先寫一段 CSS 來改變 img 的 padding & filter & backgorund
畫面有三個變數: Space
, Blur
, Base Color
,當我們在畫面拉動時它會立即更新畫面
html 的整體結構如下所示, class="controls"
包住 label+input
並且在 id="spacing"
中有 type="range"
與 type="range"
可以調整控制項與選擇顏色以更動下方的照片。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Scoped CSS Variables and JS</title>
</head>
<body>
<h2>Update CSS Variables with <span class='hl'>JS</span></h2>
<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>
<img src="https://source.unsplash.com/7bwQXzbF6KE/800x500">
<style>
/*
misc styles, nothing to do with CSS variables
*/
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;
}
</style>
</body>
</html>
type="range"、type="color"
type 屬性規定 input 元素的類型,其屬性值可以有 button、checkbox、file、hidden、image、password、radio、reset、submit、text。而 color、range兩者為 HTML5 新的屬性值
Color:使用者可以開啟選擇顏色器選取所要之顏色
Color: <input type="color" name="user_color" />
Range:使用者可以滑動選擇範圍內的數值
<input type="range" name="points" min="1" max="10" />
透過 JS 研究 CSS 中的 :root 是什麼?
也可以把 :root 變成 html,它指的是指向文件根的標籤
document.querySelector(':root')
// html
document.querySelector(':root') === document.querySelector('html')
// true
document.querySelector(':root') === document.documentElement
// true
<style>
:root {
--base: #ffc600;
--spacing: 10px;
--blur: 10px;
}
img {
padding: var(--spacing);
background: var(--base);
filter: blur(var(--blur));
}
.hl {
color: var(--base);
}
/*下略*/
</style>
首先,透過 querySelectorAll
抓出 class="controls" 內的 input 標籤,設定變數為 inputs,記得如這樣抓出來的 inputs 是一個 List,他是沒有辦法使用 map 的!
<script>
const inputs = document.querySelectorAll('.controls input')
</script>
將抓出來的 List 透過迴圈並用 addEventListener
來監視假設 input 裡的 value 更換會呼叫方法,方法會印出 HTML 中 input 的 name & value(change在滑動時不會呼叫方法,放開滑鼠後才會執行、要持續的話必須要加上 mousemove
)
EventTarget.addEventListener():https://ubin.io/AQGZfT
<script>
const inputs = document.querySelectorAll('.controls input')
inputs.forEach(function(input){
input.addEventListener('change',changeinput)
input.addEventListener('mousemove',changeinput)
})
function changeinput(){
console.log(this.name,this.value)
}
// spacing 200
// base #ff0000
// blur 20
// ...
</script>
可以印出值之後,透過 switch case 的方式來更換 CSS,如果是抓到 spacing
就要改動其 CSS 中的 padding,抓到 blur
就要改動其CSS 中的 filter 濾鏡,抓到 base
就要改動其 CSS 中的 background,
w3c filter:https://ubin.io/pg51KQ
<script>
// 上略
function changeinput(){
// console.log(this.name,this.value)
switch (this.name) {
case `spacing`:
document.querySelector('img').style.padding = this.value + 'px'
break;
case `blur`:
document.querySelector('img').style.filter = `blur(${this.value}px)`
break;
case `base`:
document.querySelector('img').style.background = this.value
break;
}
}
</script>
就大功告成啦!
<script>
const inputs = document.querySelectorAll('.controls input')
inputs.forEach(function(input){
input.addEventListener('change',changeinput)
input.addEventListener('mousemove',changeinput)
})
function changeinput(){
// console.log(this.name,this.value)
switch (this.name) {
case `spacing`:
document.querySelector('img').style.padding = this.value + 'px'
break;
case `blur`:
document.querySelector('img').style.filter = `blur(${this.value}px)`
break;
case `base`:
document.querySelector('img').style.background = this.value
break;
}
}
</script>
本刊同步於個人網站:http://chestertang.site/
本次範例程式碼原作者來源:https://reurl.cc/1QgokY