1 回答

TA貢獻1786條經驗 獲得超13個贊
您的代碼的主要問題是您僅使用一個標志變量 ( mousedOver) 來確定 3 個動畫中的任何一個何時應處于活動狀態。因此,如果有人將鼠標移到其中一個元素上,它會等待 1000 毫秒并將標志設置為 1,然后說“好吧,我會等待 1000 毫秒,然后再次檢查是否mousedOver仍然為 1”。如果用戶在 1000 毫秒之前將鼠標移開(設置mousedOver為 0)然后移動到另一個元素(設置為mousedOver1),那么當第一個元素再次檢查并看到它mousedOver仍然是 1 時,它沒有理由停止動畫。
有幾種方法可以解決這個問題:
首先,您可以為每個元素使用不同的標志,您可以確定該特定元素何時應取消其超時。這需要更多的工作,但可能會讓事情更容易閱讀和理解。
另一種 JS 解決方案使用clearTimeout方法:將每個超時 ID 存儲在一個變量中,以便您可以在鼠標懸停時“清除”/取消它們:
JavaScript
var timeoutID = null;
// Whenever you set a timeout, store its index to be cleared if necessary
timeoutID = setTimeout(test,1000);
// inside the "mouseout" handler
clearTimeout(timeoutID);
請注意,您只需要一個 timeoutID 變量,因為您將在創建新超時之前清除任何現有超時 (onmouseout)。
最后是純 CSS 方法。由于您使用的是 CSS flex,我假設您可以使用 CSS3。您可以考慮始終將它們放在那里并更改顏色或不透明度,即將 CSScolor從rgba(0, 0, 0, 0)更改為rgba(0, 0, 0, 1)或opacity從0更改為 ,而不是添加/刪除這些省略號1。當使用其中一個 JS 進程時,這甚至可能是一個好主意,因為至少你知道當顯示點時文本不會移動。
此選項與上面選項之間的主要視覺區別在于,這些選項會顯示一些“淡入”,這可能不是您想要的。下面的代碼顯示了如何設置所有“第一個”點(設置第二個和第三個點類似)。
CSS
@keyframes show-first-dot {
/* Start all the animations transparent */
0% {
color: rgba(0, 0, 0, 0);
}
/* End transparency at a different % for each dot to control when it fades in */
50% {
color: rgba(0, 0, 0, 0);
}
/* End all the animations opaque */
100% {
color: rgba(0, 0, 0, 1);
}
}
/* keep dot transparent by default */
.nav > p a {
color: rgba(0, 0, 0, 0);
}
/* Keep each dot opaque after animation ends */
.nav > p:hover a {
color: rgba(0, 0, 0, 1);
}
/* Use CSS selectors to assign animations to each dot */
.nav > p:hover a:first-of-type {
animation-name: show-first-dot;
animation-duration: 1s;
}
/* ... set up an animation for nth-of-type(2), etc. for as many dots as you want */
- 1 回答
- 0 關注
- 119 瀏覽
添加回答
舉報