日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

純 CSS 檢測滾動的速度和方向

來源: 責編: 時間:2024-06-27 17:14:26 132觀看
導讀CSS可以做的事情越來越越多了。我們經常會碰到這樣的場景,很多網頁會在右下角放一個固定入口,有可能是返回頂部,有可能廣告,為了避免干擾,在頁面滾動時,會把這些入口臨時收起來,停止滾動后再出現,就像這樣圖片通常我們實現這

CSS可以做的事情越來越越多了。akm28資訊網——每日最新資訊28at.com

我們經常會碰到這樣的場景,很多網頁會在右下角放一個固定入口,有可能是返回頂部,有可能廣告,為了避免干擾,在頁面滾動時,會把這些入口臨時收起來,停止滾動后再出現,就像這樣akm28資訊網——每日最新資訊28at.com

圖片圖片akm28資訊網——每日最新資訊28at.com

通常我們實現這樣的效果會借助JS的定時器,并且監聽頁面滾動,其實也不復雜,大概是這樣實現akm28資訊網——每日最新資訊28at.com

let timer;window.addEventListener('scroll', function(){  // 是否在滾動  isScroll = true  timer && clearTimeout(timer)  timer = setTimeout(() => {    isScroll = false  }, 150)})

現如今,CSS也能實現這樣的功能了,也就是可以檢測頁面是否在滾動,進一步,還能檢測滾動的速度和方向,一起來看看吧~akm28資訊網——每日最新資訊28at.com

一、CSS 檢測原理

說起原理,其實和JS是差不多的,都是有個類似于定時、延時的機制。那具體如何做呢?下面一步一步來介紹。akm28資訊網——每日最新資訊28at.com

akm28資訊網——每日最新資訊28at.com

比如,我們有這樣一個可以滾動的頁面;akm28資訊網——每日最新資訊28at.com

<body>  <div class="item"></div>  <div class="item"></div>  <div class="item"></div>  <div class="item"></div>  <div class="item"></div>  <div class="item"></div>  <div class="item"></div>  <div class="item"></div>	...</body>

簡單修飾一下,效果是這樣的;akm28資訊網——每日最新資訊28at.com

圖片圖片akm28資訊網——每日最新資訊28at.com

然后我們需要用 CSS檢測滾動的進度,該如何做呢?沒錯,就是用 CSS變量。akm28資訊網——每日最新資訊28at.com

假設有一個這樣的動畫,--scroll-position從0變到100,如下:akm28資訊網——每日最新資訊28at.com

@keyframes adjust-pos {  form {     --scroll-position: 0;  }  to {    --scroll-position: 100;  }}

為了方便演示,我們可以把這個動畫的變化過程顯示在頁面上;akm28資訊網——每日最新資訊28at.com

<div class="debug" hidden>  <div data-id="--scroll-position"></div></div>

這里利用CSS計數器,直接用偽元素顯示CSS變量值;akm28資訊網——每日最新資訊28at.com

具體實現如下:akm28資訊網——每日最新資訊28at.com

:root {  animation: adjust-pos linear 3s;}.debug{  counter-reset: scroll-position calc(var(--scroll-position) * 1);}[data-id="--scroll-position"]::after {  content: "--scroll-position: " counter(scroll-position);}

現在效果如下:akm28資訊網——每日最新資訊28at.com

圖片圖片akm28資訊網——每日最新資訊28at.com

現在數字直接從0變到了100,沒有中間的過程。akm28資訊網——每日最新資訊28at.com

這是因為--scroll-position是一個自定義變量,無法直接過渡。為了使這個變量也能像普通的過渡屬性自動過渡,需要用到CSS @property,也就是需要注冊這個變量,讓瀏覽器認為這是一個合法的 CSS 變量。akm28資訊網——每日最新資訊28at.com

@property --scroll-position {  syntax: "<number>";  inherits: true;  initial-value: 0;}

這段代碼表示--scroll-position是一個number類型的數據,是一個合法的,可以過渡的類型,自然也就有動畫了,效果如下:akm28資訊網——每日最新資訊28at.com

圖片圖片akm28資訊網——每日最新資訊28at.com

然后我們加上滾動驅動動畫,讓這個動畫跟隨頁面滾動。akm28資訊網——每日最新資訊28at.com

:root {  animation: adjust-pos 3s linear both;  animation-timeline: scroll();}

效果如下,這樣就能檢測到滾動的具體位置了。akm28資訊網——每日最新資訊28at.com

圖片圖片akm28資訊網——每日最新資訊28at.com

當然,僅僅這樣還是不夠的,我們只知道了滾動的進度,并不知道滾動的狀態。akm28資訊網——每日最新資訊28at.com

為了知道滾動的速度,我們還需要另一個變量,假設是--scroll-position-delayed。akm28資訊網——每日最新資訊28at.com

@property --scroll-position-delayed {  syntax: "<number>";  inherits: true;  initial-value: 0;}@keyframes adjust-pos {  form {     --scroll-position: 0;    --scroll-position-delayed: 0;  }  to {    --scroll-position: 100;    --scroll-position-delayed: 100;  }}

這樣就有了兩個變量在同時變化,效果如下:akm28資訊網——每日最新資訊28at.com

圖片圖片akm28資訊網——每日最新資訊28at.com

同時變化沒有什么意義,我們需要加一點延時,就像 JS的定時器一樣,這里我們可以直接通過transition來實現。akm28資訊網——每日最新資訊28at.com

body{  margin: 0;  transition: --scroll-position-delayed 0.15s linear;}

這里的0.15s表示--scroll-position-delayed在變化時需要0.15s的時間,而--scroll-position是瞬時完成的,所以就相當于--scroll-position-delayed始終比--scroll-position慢了0.15秒,也就相當于延時了0.15s,實際效果如下:akm28資訊網——每日最新資訊28at.com

圖片圖片akm28資訊網——每日最新資訊28at.com

是不是可以很清楚的看到下面的數值要比上面的慢一點?akm28資訊網——每日最新資訊28at.com

有了這個時間差,我們就可以判斷當前的滾動狀態了。akm28資訊網——每日最新資訊28at.com

比如我們可以用一個變量--scroll-velocity來表示兩者的差值。akm28資訊網——每日最新資訊28at.com

body{  --scroll-velocity: calc(var(--scroll-position) - var(--scroll-position-delayed));}

效果如下:akm28資訊網——每日最新資訊28at.com

圖片圖片akm28資訊網——每日最新資訊28at.com

通過這個差值,我們是不是就能發現一些規律?akm28資訊網——每日最新資訊28at.com

  1. 當--scroll-velocity為0時,表示滾動停止,否則表示正在滾動中。
  2. 當--scroll-velocity大于0時,表示滾動方向為下。
  3. 當--scroll-velocity小于0時,表示滾動方向為上。
  4. 還可以從--scroll-velocity的絕對值上考慮,絕對值越大,表示滾動速度越快,反之則越慢。

這就是CSS檢測的原理了,是不是還算簡單呢?不過這還沒完,還需要具體實現,比如怎么根據這個變量來匹配對應的樣式。akm28資訊網——每日最新資訊28at.com

二、CSS 樣式查詢

回到文章開頭,我們如何檢測是否正在滾動呢,并且在滾動的時候隱藏右下角懸浮按鈕呢?下面就來實現這樣一個功能。akm28資訊網——每日最新資訊28at.com

既然當--scroll-velocity為0時,就表示滾動停止,那我們是不是可以直接用樣式查詢來匹配呢?akm28資訊網——每日最新資訊28at.com

@container - CSS: Cascading Style Sheets | MDN (mozilla.org)[1]akm28資訊網——每日最新資訊28at.com

akm28資訊網——每日最新資訊28at.com

CSS 樣式查詢是容器查詢的一部分,從名稱也可以看出,它可以查詢元素的樣式,進而設置額外的樣式。比如默認是隱藏的。akm28資訊網——每日最新資訊28at.com

.back{  transform: translateX(100%);  transition: .2s;}

當匹配到--scroll-velocity:0時,顯示這個懸浮按鈕,就可以這樣來實現。akm28資訊網——每日最新資訊28at.com

@container style(--scroll-velocity: 0) {  .back{    transform: translateX(0);  }}

效果如下:akm28資訊網——每日最新資訊28at.com

圖片圖片akm28資訊網——每日最新資訊28at.com

好像并沒有起效果?其實和前面的動畫原理差不多,這是一個CSS自定義變量,無法直接檢測到變化的值。這里有一個解決方案,為了保證能夠樣式查詢到,需要用@property注冊一下:akm28資訊網——每日最新資訊28at.com

@property --scroll-velocity {  syntax: "<number>";  inherits: true;  initial-value: 0;}

這樣就能完美檢測了。akm28資訊網——每日最新資訊28at.com

akm28資訊網——每日最新資訊28at.com

你也可以訪問線上鏈接來查看實際效果。akm28資訊網——每日最新資訊28at.com

  • CSS scroll-speed (juejin.cn)[2]

是不是非常簡單?akm28資訊網——每日最新資訊28at.com

三、CSS 變量計算

除了使用樣式查詢外,我們還可以用CSS變量的計算方式來實現。akm28資訊網——每日最新資訊28at.com

什么意思呢?比如我們想知道是否在滾動,其實就是兩個狀態,那能不能用0和1來表示是否在滾動呢?那就需要做一點點變換了。akm28資訊網——每日最新資訊28at.com

現在--scroll-velocity表示差值,范圍可能是-50~50,那如何轉換成1~0呢,很簡單,直接除以自身就行了, 比如-50/-50和50/50結果都是1,有人會奇怪0/0會不會無限大,沒關系,這里CSS計算的結果還是0,實現如下:akm28資訊網——每日最新資訊28at.com

body{  --scroll-velocity: calc(var(--scroll-position) - var(--scroll-position-delayed));  --scroll-dynamic: calc(var(--scroll-velocity) / var(--scroll-velocity));}

這樣的話,我們就無需樣式查詢來改變右下角懸浮按鈕的狀態了,直接用--scroll-dynamic來控制transformakm28資訊網——每日最新資訊28at.com

.back{  transform: translateX(calc(var(--scroll-dynamic) * 100%));}

看看效果:akm28資訊網——每日最新資訊28at.com

圖片圖片akm28資訊網——每日最新資訊28at.com

不一樣的實現也能得到相同的效果,你也可以訪問線上鏈接來查看實際效果。akm28資訊網——每日最新資訊28at.com

  • CSS scroll-dynamic - (juejin.cn)[3]

除了可以得到是否在滾動,還能計算得到滾動方向,比如1表示向下,-1表示向上,我們可以這樣來計算。akm28資訊網——每日最新資訊28at.com

body{  --scroll-velocity: calc(var(--scroll-position) - var(--scroll-position-delayed));  --scroll-speed: max(var(--scroll-velocity), -1 * var(--scroll-velocity));	--scroll-direction: calc(var(--scroll-velocity) / var(--scroll-speed));}

看似有點復雜,其實也不難理解。比如當前差值是-30,那么,我們可以通過乘以-1,然后取兩者較大值,這樣就能得到絕對值了。akm28資訊網——每日最新資訊28at.com

圖片圖片akm28資訊網——每日最新資訊28at.com

上面其實是個“偏方”,關于絕對值,其實已經有CSS abs()了,只是現在還沒有支持,相信以后就能用上了。akm28資訊網——每日最新資訊28at.com

akm28資訊網——每日最新資訊28at.com

然后用原值除以這個絕對值,就能得到1或者-1了。akm28資訊網——每日最新資訊28at.com

利用這個特性,我們可以在不同的方向改變箭頭的指向。akm28資訊網——每日最新資訊28at.com

.back{  transform: scaleY(var(--scroll-direction));}

效果如下:akm28資訊網——每日最新資訊28at.com

圖片圖片akm28資訊網——每日最新資訊28at.com

你也可以訪問線上鏈接來查看實際效果:akm28資訊網——每日最新資訊28at.com

  • CSS scroll-dynamic (juejin.cn)[4]

四、更多有趣的案例

除了上面幾個應用,我還找了幾個有趣的案例。akm28資訊網——每日最新資訊28at.com

比如下面這種蟲洞效果,在水平或者垂直方向滾動時,會有明顯的透視效果https://codepen.io/bramus/pen/wvRqVBmakm28資訊網——每日最新資訊28at.com

akm28資訊網——每日最新資訊28at.com

圖片圖片akm28資訊網——每日最新資訊28at.com

再比如這種上下滾動,可以看到不同方向上內容的傾斜角度不一樣,而且滾動越快,傾斜越大:https://codepen.io/bramus/pen/OJrxBaLakm28資訊網——每日最新資訊28at.com

akm28資訊網——每日最新資訊28at.com

圖片akm28資訊網——每日最新資訊28at.com

還有一個比較簡單實用的運動模糊滾動,也就是在滾動時,頁面會有模糊的效果:https://codepen.io/bramus/pen/XWoREjvakm28資訊網——每日最新資訊28at.com

akm28資訊網——每日最新資訊28at.com

akm28資訊網——每日最新資訊28at.com

五、最后總結一下

說了這么多,核心原理其實就這么幾行,如下:akm28資訊網——每日最新資訊28at.com

@property --scroll-position {  syntax: "<number>";  inherits: true;  initial-value: 0;}@property --scroll-position-delayed {  syntax: "<number>";  inherits: true;  initial-value: 0;}@keyframes adjust-pos {  to {    --scroll-position: 100;    --scroll-position-delayed: 100;  }}:root {  animation: adjust-pos 3s linear both;  animation-timeline: scroll();}body{  transition: --scroll-position-delayed 0.15s linear;  --scroll-velocity: calc(var(--scroll-position) - var(--scroll-position-delayed));  --scroll-speed: max(var(--scroll-velocity), -1 * var(--scroll-velocity));  --scroll-direction: calc(var(--scroll-velocity) / var(--scroll-speed));  --scroll-dynamic: calc(var(--scroll-velocity) / var(--scroll-velocity));}

其實原理還是比較好理解的,下面總結一下:akm28資訊網——每日最新資訊28at.com

  1. 首先用CSS自定義變量--scroll-position實現一個從0到100的動畫,注意需要用@property注冊。
  2. 然后用CSS滾動驅動動畫將其關聯,實現在滾動的時候變量自動變化。
  3. 接著再定義一個相同動畫的變量--scroll-position-delayed,并設置過渡時間,這樣就會比--scroll-position變化的慢一點。
  4. 將這兩個變量相減可以得到差值--scroll-velocity。
  5. 通過這個差值--scroll-velocity就能獲得各種狀態了。
  6. 當--scroll-velocity為0時,表示滾動停止,否則表示正在滾動中。
  7. 當--scroll-velocity大于0時,表示滾動方向為下。
  8. 當--scroll-velocity小于0時,表示滾動方向為上。
  9. 還可以從--scroll-velocity的絕對值上考慮,絕對值越大,表示滾動速度越快,反之則越慢。
  10. 可以通過樣式查詢來匹配各種條件,不過需要用@property注冊。
  11. 通過 CSS calc 和 max計算可以得到更多狀態,比如滾動方向。
  12. 然后就是實際的運用了。

本文鏈接:http://www.www897cc.com/showinfo-26-96976-0.html純 CSS 檢測滾動的速度和方向

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 我們一起聊聊如何通過流式渲染提升用戶體驗?

下一篇: 精選:15款頂尖Python知識圖譜(關系網絡)繪制工具,數據分析的強力助手

標簽:
  • 熱門焦點
  • 7月安卓手機好評榜:三星S23Ultra好評率第一

    性能榜和性價比榜之后,我們來看最后的安卓手機好評榜,數據來源安兔兔評測,收集時間2023年7月1日至7月31日,僅限國內市場。第一名:三星Galaxy S23 Ultra好評率:95.71%在即將迎來新
  • 6月iOS設備好評榜:第一蟬聯榜首近一年

    作為安兔兔各種榜單里變化最小的那個,2023年6月的iOS好評榜和上個月相比沒有任何排名上的變化,僅僅是部分設備好評率的下降,長年累月的用戶評價和逐漸退出市場的老款機器讓這
  • JavaScript 混淆及反混淆代碼工具

    介紹在我們開始學習反混淆之前,我們首先要了解一下代碼混淆。如果不了解代碼是如何混淆的,我們可能無法成功對代碼進行反混淆,尤其是使用自定義混淆器對其進行混淆時。什么是混
  • 摸魚心法第一章——和配置文件說拜拜

    為了能摸魚我們團隊做了容器化,但是帶來的問題是服務配置文件很麻煩,然后大家在群里進行了“親切友好”的溝通圖片圖片圖片圖片對比就對比,簡單對比下獨立配置中心和k8s作為配
  • 掘力計劃第 20 期:Flutter 混合開發的混亂之治

    在掘力計劃系列活動第20場,《Flutter 開發實戰詳解》作者,掘金優秀作者,Github GSY 系列目負責人戀貓的小郭分享了Flutter 混合開發的混亂之治。Flutter 基于自研的 Skia 引擎
  • 把LangChain跑起來的三個方法

    使用LangChain開發LLM應用時,需要機器進行GLM部署,好多同學第一步就被勸退了,那么如何繞過這個步驟先學習LLM模型的應用,對Langchain進行快速上手?本片講解3個把LangChain跑起來
  • “又被陳思誠騙了”

    作者|張思齊 出品|眾面(ID:ZhongMian_ZM)如今的國產懸疑電影,成了陳思誠的天下。最近大爆電影《消失的她》票房突破30億斷層奪魁暑期檔,陳思誠再度風頭無兩。你可以說陳思誠的
  • “買真退假” 這種“羊毛”不能薅

    □ 法治日報 記者 王春   □ 本報通訊員 胡佳麗  2020年初,還在上大學的小東加入了一個大學生兼職QQ群。群主&ldquo;七王&rdquo;在群里介紹一些刷單賺
  • 親歷馬斯克血洗Twitter,硅谷的苦日子在后頭

    文/劉哲銘  編輯/李薇  馬斯克再次揮下裁員大刀。  美國時間11月14日,Twitter約4400名外包員工遭解雇,此次被解雇的員工的主要工作為內容審核等。此前,T
Top 主站蜘蛛池模板: 上饶县| 福安市| 武夷山市| 德清县| 舒兰市| 黄平县| 富锦市| 永仁县| 峨山| 西宁市| 莎车县| 泰来县| 义马市| 化州市| 岱山县| 三河市| 吉隆县| 奇台县| 察雅县| 香格里拉县| 泸水县| 新疆| 铁岭县| 巴南区| 上高县| 武邑县| 阿瓦提县| 韩城市| 峨边| 拉萨市| 平果县| 建宁县| 沅江市| 新宾| 民丰县| 博白县| 潮州市| 满城县| 合肥市| 宿州市| 高雄县|