成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

還在用定時(shí)器嗎?借助 CSS 來監(jiān)聽事件

開發(fā) 前端
在使用mouseout?時(shí)還需要考慮 dom? 嵌套結(jié)構(gòu),因?yàn)檫@些事件在父級(jí) -> 子級(jí)的過程中仍然會(huì)觸發(fā),總之,細(xì)節(jié)會(huì)非常多,很容易誤觸發(fā)。

平時(shí)工作中很多場(chǎng)合都要用到定時(shí)器,比如延遲加載、定時(shí)查詢等等,但定時(shí)器的控制有時(shí)候會(huì)有些許麻煩,比如鼠標(biāo)移入停止、移出再重新開始。這次介紹幾個(gè)借助 CSS 來更好的控制定時(shí)器的方法,一起了解一下吧,相信可以帶來不一樣的體驗(yàn)。

一、hover 延時(shí)觸發(fā)

有這樣一個(gè)場(chǎng)景,在鼠標(biāo)停留在一個(gè)元素上1s?后才觸發(fā)事件,不滿1s?就不會(huì)觸發(fā),這樣的好處是,可以避免鼠標(biāo)在快速劃過時(shí),頻繁的觸發(fā)事件。如果是用js來實(shí)現(xiàn),可能會(huì)這樣。

var timer = null
el.addEventListener('mouseover', () => {
timer && clearTimeout(timer)
timer = setTimeout(() => {
// 具體邏輯
}, 1000)
})

是不是這樣?等等,這樣還沒完,這樣只做到了延時(shí),鼠標(biāo)離開以后還是會(huì)觸發(fā),還需要在鼠標(biāo)離開時(shí)取消定時(shí)器。

el.addEventListener('mouseout', () => {
timer && clearTimeout(timer)
})

另外,在使用mouseout?時(shí)還需要考慮 dom? 嵌套結(jié)構(gòu),因?yàn)檫@些事件在父級(jí) -> 子級(jí)的過程中仍然會(huì)觸發(fā),總之,細(xì)節(jié)會(huì)非常多,很容易誤觸發(fā)。

現(xiàn)在轉(zhuǎn)折來了,如果借用 CSS 就可以有效地避免上述問題,如下,先給需要觸發(fā)的元素加一個(gè)有延時(shí)的transition。

button:hover{
opacity: 0.999; /*無關(guān)緊要的樣式*/
transition: 0s 1s opacity; /*延時(shí) 1s */
}

這里只需一個(gè)無關(guān)緊要的樣式就行,如果opacity?已經(jīng)使用過了,可以使用其他的,比如transform:translateZ(.1px)?,也是可行的。然后添加監(jiān)聽transitionend方法。

GlobalEventHandlers.ontransitionend - Web API 接口參考 | MDN (mozilla.org)[1]。

el.addEventListener('transitionend', () => {
// 具體邏輯
})

這就結(jié)束了。無需定時(shí)器,也無需取消,更無需考慮 dom 結(jié)構(gòu),完美實(shí)現(xiàn)。

下面是一個(gè)小實(shí)例,在hover?一段時(shí)間后觸發(fā)alert。

圖片

Kapture 2022-09-11 at 15.56.37

原理和上面一致,完整代碼可以查看線上demo:hover_alert (codepen.io)[2]或者h(yuǎn)over_alert(runjs.work)[3]。

以后再碰到這樣的需要可以停下來思考一番,很多和mouseover有關(guān)的交互都可以用這種方式來實(shí)現(xiàn)。

二、長(zhǎng)按觸發(fā)事件

長(zhǎng)按也是一個(gè)比較常見的需求,它可以很好的和點(diǎn)擊事件區(qū)分開來,從而賦予更多的交互能力。

但是原生js中卻沒有這樣一個(gè)事件,如果要實(shí)現(xiàn)長(zhǎng)按事件,通常需要借助定時(shí)器和鼠標(biāo)按下事件,如下:

el.onmousedown = function(){
this.timer && clearTimeout(this.timer);
this.timer = settimeout(function(){
//業(yè)務(wù)代碼
},1000)
}
el.onmouseup = function(){
this.timer && clearTimeout(this.timer);
}

又是定時(shí)器和取消定時(shí)器的場(chǎng)景,和前面一個(gè)例子有些類似,也可以借助 CSS 來實(shí)現(xiàn),由于是鼠標(biāo)按下,可以聯(lián)想到:active,因此可以這樣來實(shí)現(xiàn)。

button:hover:active{
opacity: .999; /*無關(guān)緊要的樣式*/
transition: opacity 1s; /*延時(shí) 1s */
}

然后再監(jiān)聽transitionend方法;

el.addEventListener('transitionend', () => {
// 具體邏輯
})

是不是非常方便呢?下面是以前做過的一個(gè)小案例,實(shí)現(xiàn)了長(zhǎng)按觸發(fā)元素選中。

圖片

Kapture 2022-09-13 at 10.37.01

完整代碼可以查看線上demo:長(zhǎng)按框選 (codepen.io)[4]或者長(zhǎng)按框選 (runjs.work)[5]。

三、輪播和暫停

再來看一個(gè)比較有意思的例子,輪播圖。

通常輪播圖都會(huì)自動(dòng)播放,然后鼠標(biāo)hover時(shí)會(huì)暫停輪播圖,通常的做法是這樣的。

function autoPlay(){
timer && clearInterval(timer)
timer = setInterval(function(){
// 輪播邏輯
}, 1000)
}
autoPlay()
view.onmouseover = function(){
timer && clearInterval(timer)
}
el.onmouseout = function(){
autoPlay()
}

又是定時(shí)器的取消和設(shè)置,要綁定一堆事件,太煩人了,可以換種方式嗎?當(dāng)然可以了,借助 CSS 動(dòng)畫,一切都好辦了。

和前面不太相同的是,這里是setInterval?,可以重復(fù)觸發(fā),那 CSS 中有什么可以重復(fù)觸發(fā)的呢?沒錯(cuò),就是 CSS 動(dòng)畫!當(dāng) CSS 動(dòng)畫設(shè)置次數(shù)為infinite?就可以無限循環(huán)了,和這個(gè)定時(shí)器效果非常類似,而且可以直接通過:hover?暫停和播放動(dòng)畫。監(jiān)聽每次動(dòng)畫的觸發(fā)可以用animationiteration這個(gè)方法,表示每個(gè)動(dòng)畫輪回就觸發(fā)一次。

GlobalEventHandlers.onanimationiteration - Web API 接口參考 | MDN (mozilla.org)[6]。

所以用這種思路實(shí)現(xiàn)就是;

.view {
animation: scroll 1s infinite; /*每1s動(dòng)畫,無限循環(huán)*/
}
.view:hover{
animation-play-state: paused; /*hover暫停*/
}
@keyframes scroll {
to {
transform: translateZ(.1px); /*無關(guān)緊要的樣式*/
}
}

然后再監(jiān)聽animationiteration事件;

view.addEventListener("animationiteration", () => {
// 輪播邏輯
})

是不是省去了大半的js代碼?而且也更好理解,控制也更為方便。

下面是一個(gè)通過animationiteration?來代替setInterval實(shí)現(xiàn)的輪播圖。

圖片

Kapture 2022-09-11 at 16.43.49

完整代碼可以查看線上demo:CSS banner(codepen.io)[7]或者css_banner(runjs.work)[8]。

四、總結(jié)一下

以上就是你可能不需要定時(shí)器的幾個(gè)替代方案,相比定時(shí)器而言,CSS 在控制定時(shí)器的開啟和暫停上更有優(yōu)勢(shì),下面總結(jié)一下:

  • :hover?配合transition?延時(shí)、transitionend監(jiān)聽可以實(shí)現(xiàn)鼠標(biāo)經(jīng)過延時(shí)觸發(fā)效果。
  • :active?配合transition?延時(shí)、transitionend監(jiān)聽可以實(shí)現(xiàn)長(zhǎng)按觸發(fā)效果。
  • CSS 動(dòng)畫設(shè)置infinite?后配合animationiteration監(jiān)聽可以實(shí)現(xiàn)周期性觸發(fā)效果。
  • 可以直接通過:hover來控制臺(tái)動(dòng)畫的暫停和播放。

當(dāng)然,可以利用的不僅僅是以上幾個(gè)案例,任何和 CSS 交互(:hover、:active)有類似功能的都可以朝這個(gè)方向去思考,是不是可以實(shí)現(xiàn)地更加優(yōu)雅?

責(zé)任編輯:武曉燕 來源: 前端偵探
相關(guān)推薦

2022-05-06 16:12:40

定時(shí)器CSS前端

2024-11-12 16:28:34

2024-08-15 08:56:17

2012-07-19 10:03:32

2022-11-14 18:43:03

JSCSS節(jié)流

2021-11-02 16:44:40

部署DevtoolsJRebel

2020-12-07 05:50:54

print()Python代碼

2021-01-03 17:14:16

ORMObjective S運(yùn)行

2020-03-04 14:05:35

戴爾

2009-11-11 10:14:10

linux定時(shí)器操作系統(tǒng)

2010-07-28 15:56:22

FlexTimer定時(shí)

2025-04-02 08:47:23

DOM文檔結(jié)構(gòu)API

2009-04-12 08:51:50

Symbian諾基亞移動(dòng)OS

2011-02-23 10:20:45

2021-03-31 08:33:17

SysTick定時(shí)器SysTick定時(shí)器

2013-07-29 10:10:40

TCP協(xié)議TCP定時(shí)器TCP

2024-08-26 15:17:16

2023-01-10 13:53:21

Linux定時(shí)器

2022-11-02 11:40:16

Flowable定時(shí)器流程

2024-10-11 16:34:22

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 在线看国产 | 日韩视频在线一区 | 人妖videosex高潮另类 | 波多野结衣亚洲 | 黄免费观看视频 | 激情五月婷婷综合 | 产真a观专区| 国产在线一区二区三区 | www.亚洲一区 | 亚洲精品久久久一区二区三区 | 国产一区二区在线播放 | 亚洲综合大片69999 | 国产精品爱久久久久久久 | 欧美在线一区二区视频 | 国产精品一二区 | 一区二区国产精品 | 亚洲三级av | 国产精品久久精品 | 天天爱天天操 | 精品国产视频 | 亚洲一区二区三区在线观看免费 | 播放一级毛片 | 激情欧美一区二区三区 | 亚洲高清视频在线 | 日韩精品一区二区三区中文字幕 | 欧美一页| 91 久久| 国产精品久久久久久中文字 | 天天艹天天干天天 | 精品网| 337p日本欧洲亚洲大胆 | 97精品国产97久久久久久免费 | www.久久久久久久久 | 欧美黄 片免费观看 | 一区二区小视频 | 久久国产精品久久国产精品 | 日本一本在线 | 国产成人亚洲精品 | 国产 日韩 欧美 制服 另类 | 国产91亚洲精品一区二区三区 | 一区二区亚洲 |