JS30 day26 - Stripe Follow Along Dropdown
作業內容
這次的網頁要做出下拉式選單動態移動的效果
今天的作業其實 code 本身不難,難就難在你能不能想到用這個概念做出效果,如果是我應該想不到XD,創意性看來還要再加油
可以參考這份 CodePen的效果
學到什麼
-
CSS
- 這邊很特別的地方是把隱藏的選項顯現出來的方式,一開始是
display: none
加上opacity: 0
第一步驟先把display: none
變成diaplay: block
第二步再把opacity: 0
變成opacity: 1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20.dropdown {
opacity: 0;
position: absolute;
overflow: hidden;
padding: 20px;
top: -20px;
border-radius: 2px;
transition: all 0.5s;
transform: translateY(100px);
will-change: opacity;
display: none;
}
.trigger-enter .dropdown {
display: block;
}
.trigger-enter-active .dropdown {
opacity: 1;
} - 這邊很特別的地方是把隱藏的選項顯現出來的方式,一開始是
-
JS
- 有個很細節的地方在於,如果導覽列上方有東西,我們必須把座標值扣掉,否則白框位置會跑掉
1
2
3
4
5
6const coords = {
height: dropdownCoords.height,
width: dropdownCoords.width,
top: dropdownCoords.top - navCoords.top,
left: dropdownCoords.left - navCoords.left
}dropdownCoords.top - navCoords.top,
像這行就是下拉選單的座標扣掉導覽列的上方座標- 除此之外還有更細節的地方,一開始程式碼長的是下面這樣
1
2
3
4
5
6
7
8
9
10
11function handleEnter(){
this.classList.add('trigger-enter')
setTimeout(() => {
this.classList.add('trigger-enter-active')
},150)
//下略
}
function handleLeave(){
this.classList.remove('trigger-enter', 'trigger-enter-active')
}
//下略我再加上 class 的時候為了有動畫的效果,有個 setTimeout 設定 150 微秒之後才加上
trigger-enter-active
這 class,但移除的時候是同時移除
這樣會有個問題,當我在導覽列中快速移動,可能已經觸發到移除了,但 150 微秒還沒到,所以後面下拉選單的內容才跑出來
解決方法如下:再設上一個條件,150微秒的時候檢查是不是有一開始加上的那個 classtrigger-enter
,沒有的話就不用再加上這個 class1
2
3
4
5
6
7
8function handleEnter(){
this.classList.add('trigger-enter')
setTimeout(() => {
if(this.classList.contains('trigger-enter')){
this.classList.add('trigger-enter-active')
}
},150)
//下略
https://github.com/wesbos/JavaScript30
code 內容:
HTML:
1 | <h2>Cool</h2> |
CSS:
1 | html { |
JS:
1 | const triggers = document.querySelectorAll('.cool > li') |