iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 18
0
自我挑戰組

前端新手的學習筆記系列 第 18

Day18:每天一個小練習 - JS30-03-CSS Variables and JS

  • 分享至 

  • xImage
  •  

到處都是烤肉味和煙火聲...


依照Alex老師的教學

練習用的HTML

<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="0" data-sizing="px">
    <label for="base">Base Color</label>
    <input id="base" type="color" name="base" value="#ffe1a8">
</div>
<img src="圖片位置">

這個練習要使用CSS變數,並透過JS動態改變變數的值

    :root {
      --base: #ffc600;  //變數
      --spacing: 10px;  
      --blur: 10px;
    }

    img {
      padding: var(--spacing);  //使用變數
      background: var(--base);
      filter: blur(var(--blur));
    }

先寫出監聽

inputs.forEach(item => {
     item.addEventListener('change', changeHandler); 
	//滑鼠放開時才呈現
  })

寫被監聽的方訊,因為this,此處不能使用箭頭函式,會抓不到資料

function changeHandler() {
       console.log(this.name, this.value); //確認觸發的值
}

增加滑鼠移動時的監聽

inputs.forEach(item => {
  item.addEventListener('change', changeHandler); //滑鼠放開時才呈現
  item.addEventListener('mousemove', changeHandler); //滑鼠移動時即時呈現
    })

接下來要動態改變CSS的值,比較土法煉鋼的寫法是一個一個寫需要改變的值

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;
      document.querySelector('.JS').style.color=this.value;
         break;
     default:
         break;
        }

這裡的寫法是使用

//使用三元運算子 - 條件?成立:不成立
document.documentElement.style.setProperty(`--${this.name}`, this.value + (this.name === 'base' ? '' : 'px'));

範例裡的HTML有設定data-*用來讀取,因此改為由讀取資料修正所需單位就完成了

// 使用讀取資料修正單位
const unit = this.dataset.sizing || ''; //有給單位就抓,否則就是預設的空值
document.documentElement.style.setProperty(`--${this.name}`, this.value + unit);

完整的code

// (function () {
    const inputs = document.querySelectorAll('.controls input'); //選取所有input

    function changeHandler() {
        // console.log(this.name, this.value); //確認觸發的值

        //使用三元運算子 - 條件?成立:不成立
        // document.documentElement.style.setProperty(`--${this.name}`, this.value + (this.name === 'base' ? '' : 'px'));
        
        // 使用讀取資料修正單位
        const unit = this.dataset.sizing || ''; //有給單位就抓,否則就是預設的空值
        document.documentElement.style.setProperty(`--${this.name}`, this.value + unit);
    }


    inputs.forEach(item => {
        item.addEventListener('change', changeHandler); 
        //滑鼠放開時才呈現
        item.addEventListener('mousemove', changeHandler); 
        //滑鼠移動時即時呈現
        //如果只有mousemove,遇到color類需要點選的會有問題,但沒有做到需要點選的可以只用mousemove
    })
// })();

連結


上一篇
Day17:每天一個小練習 - JS30-02-JS and CSS Clock
下一篇
Day19:每天一個小練習 - JS30-04-Array Cardio
系列文
前端新手的學習筆記32
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言