JS30 day16 - JS30 day16 Text Shadow Mouse Move Effect
作業內容
今天教學的內容是根據滑鼠的移動來讓文字的陰影跟著移動,在這裡面我目前認為還有很難發現的雷 (this 跟 e.target 不同),整體而言我覺得效果滿酷的!
可以看看這個CodePen
學到什麼
-
JS
- ES6 語法糖:
1
2
3
4const width = hero.offsetWidth
const height = hero.offsetHeight
// ES6 語法上面兩行可以變成下面這樣
const { offsetWidth: width, offsetHeight: height } = hero- 一開始的 JS 長這樣:
1
2
3
4
5
6
7
8
9
10const hero = document.querySelector('.hero')
const text = document.querySelector('h1')
function shadow(e){
const { offsetWidth: width, offsetHeight: height } = hero
let { offsetX: x, offsetY: y } = e
console.log(x,y)
}
hero.addEventListener('mousemove', shadow)奇怪的是這時候如果把滑鼠移到 h1 左上方,座標會接近 0
這是因為這時候我們的 event taget 是 h1 而不是 hero!1
2
3
4console.log(this, e.target)
function shadow(e){
console.log(this, e.target) // 如果在 h1 上面的話,this 仍然是 hero,但 e.target 是 h1
}因此方法要改寫成
1
2
3
4
5
6
7
8function shadow(e){
const { offsetWidth: width, offsetHeight: height } = hero
let { offsetX: x, offsetY: y } = e
if(this !== e.target){
x = x + e.target.offsetLeft
y = y + e.target.offsetTop
}
}這樣寫的話,如果 target 變成 h1 就會加上 h1 左上角的 x 跟 y 座標,達到統一效果
參考資料:
https://github.com/wesbos/JavaScript30
code 內容:
HTML:
1 | <div class="hero"> |
CSS:
1 | html { |
JS:
1 | const hero = document.querySelector('.hero') |