iT邦幫忙

第 11 屆 iT 邦幫忙鐵人賽

DAY 3
0
自我挑戰組

新手村-30 Day JS Coding Challenge系列 第 3

新手村03 - CSS Variables

03 - CSS Variables

俗話說的好,一天一蘋果,醫生遠離我

一天一 JS,What the f*ck JavaScript?

small steps every day - 記錄著新手村日記

完成目標

先寫一段 CSS 來改變 img 的 padding & filter & backgorund
畫面有三個變數: Space, Blur, Base Color,當我們在畫面拉動時它會立即更新畫面

  • 功能
    • 拉動、點擊
  • 畫面
    • 改變控制項會立即改變畫面

index_START.html

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>

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" />
    

CSS

  • 透過 JS 研究 CSS 中的 :root 是什麼?

    也可以把 :root 變成 html,它指的是指向文件根的標籤

    document.querySelector(':root')
    // html
    document.querySelector(':root') === document.querySelector('html')
    // true
    document.querySelector(':root') === document.documentElement
    // true
    

CSS - step by step

<style>
    :root {
      --base: #ffc600;
      --spacing: 10px;
      --blur: 10px;
    }

    img {
      padding: var(--spacing);
      background: var(--base);
      filter: blur(var(--blur));
    }

    .hl {
      color: var(--base);
    }

    /*下略*/ 
</style>

JS - step by step

首先,透過 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>

就大功告成啦!

JS - Final

<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


上一篇
新手村02 - JS and CSS Clock
下一篇
新手村04 - Array Cardio Day 1
系列文
新手村-30 Day JS Coding Challenge30

1 則留言

0
yolala
iT邦新手 5 級 ‧ 2019-09-18 09:44:17

good~

Chester iT邦新手 5 級 ‧ 2019-09-18 10:07:58 檢舉

謝謝!有錯誤再請你不吝指教

我要留言

立即登入留言