HTML中滾動加載的實現

設置div的overflow屬性,可以使得該div具有滾動效果,下面以div中包含的是table來舉例。
當table的元素較多,以至于超出div的顯示范圍的話,觀察下該div元素的以下3個屬性:
clientHeight是div的顯示高度,scrollHeight是整個table的高度,scrollTop是上方溢出區高度,注意下,下方溢出高度沒有直接的屬性,需要計算得到,就是scrollHeight-clientHeight-scrollTop
在這里插入圖片描述
有時候,我們在界面上不提供上一頁、下一頁這樣的按鈕,而是通過滾動(PC上通過鼠標滾動來實現,觸摸屏通過手指在屏幕上滑動來實現)來加載前面或后面的數據,當向上滾動時如果上方溢出區高度小于某個閾值時加載前面的記錄,當向下滾動時如果下方溢出區高度小于某個閾值時加載后面的記錄。向后追加數據后,當前可視區域內容不會有變化,而向前插入數據的話,為了不影響可視區域內容,我們可以將scrollTop調整下高度,具體增大值為插入后的scrollHeight與插入前的scrollHeight之差。
從內存和性能方面考慮,html的table中元素應該有一個數量限制,不應該只允許添加而從不刪除,所以可以在添加數據后進行判斷,如果超限則執行刪除,向前插入則刪除最后的行,向后插入則刪除最先的行。
有scroll事件,但是沒有向上滾動或者向下滾動事件,滾動的方向是需要計算判斷的,比如保存上次滾動時的scrollTop,跟當前的scrollTop進行比較,當前的大,則是向下滾動,當前的小,則是向上滾動。
這樣基本完成了設計,但是仍有一些坑,一般數據的獲取是從后端http異步調用得到,會花一些時間,而scroll的事件是瀏覽器前端觸發,在數據獲取期間,不應該繼續向后端發起數據獲取請求,每次數據獲取完成時,再允許向后端發起數據獲取請求,可以設置一個變量來標識是否在進行數據獲取處理。還有一個可能遇到的坑,存在一定概率發生,當上次滾動事件完成時,可視區域正好停在滾動區域頂部或者底部,這時如果向上滾動或者向下滾動時,瀏覽器可能會屏蔽向上滾動事件發生或向下滾動事件發生。那么此時要不要采用其他方式來觸發呢?可以的,此時不能只監聽scoll事件了,對于鼠標滾動事件(wheel)要監聽下,從事件的deltaY屬性跟此前的值進行比較來判斷是向上滾動還是向下滾動,或者對觸屏的touchstart事件與touchmove事件進行監聽,以判斷是向上滑動還是向下滑動。參考代碼如下:

    <script>// 監聽 scroll 事件window.addEventListener('scroll', function() {console.log('Scroll event triggered, scrollTop:', document.documentElement.scrollTop);});// 監聽 wheel 事件(鼠標滾輪或觸摸板)window.addEventListener('wheel', function(event) {console.log('Wheel event triggered, deltaY:', event.deltaY);});// 監聽 touchstart 和 touchmove 事件(觸摸設備)let startY = 0;window.addEventListener('touchstart', function(event) {startY = event.touches[0].clientY; // 記錄觸摸起始位置});window.addEventListener('touchmove', function(event) {const currentY = event.touches[0].clientY; // 獲取當前觸摸位置const deltaY = currentY - startY; // 計算滑動距離console.log('Touchmove event triggered, deltaY:', deltaY);});</script>

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/898151.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/898151.shtml
英文地址,請注明出處:http://en.pswp.cn/news/898151.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Netty基礎—7.Netty實現消息推送服務二

大綱 1.Netty實現HTTP服務器 2.Netty實現WebSocket 3.Netty實現的消息推送系統 (1)基于WebSocket的消息推送系統說明 (2)消息推送系統的PushServer (3)消息推送系統的連接管理封裝 (4)消息推送系統的ping-pong探測 (5)消息推送系統的全連接推送 (6)消息推送系統的HTTP…

人工智能助力家庭機器人:從清潔到陪伴的智能轉型

引言&#xff1a;家庭機器人進入智能時代 過去&#xff0c;家庭機器人只是簡單的“工具”&#xff0c;主要用于掃地、拖地、擦窗等單一任務。然而&#xff0c;隨著人工智能&#xff08;AI&#xff09;技術的迅猛發展&#xff0c;家庭機器人正經歷從“機械助手”向“智能管家”甚…

ssh轉發筆記

工作中又學到了&#xff0c;大腦轉不過來 現有主機A&#xff0c;主機B&#xff0c;主機C A能訪問B&#xff0c;B能訪問C&#xff0c;A不能訪問C C上80端口有個服務&#xff0c;現在A想訪問這個服務&#xff0c;領導讓用ssh轉發&#xff0c;研究半天沒找到理想的語句&#xf…

清晰易懂的Miniconda安裝教程

小白也能看懂的 Miniconda 安裝教程 Miniconda 是一個輕量級的 Python 環境管理工具&#xff0c;適合初學者快速搭建 Python 開發環境。本教程將手把手教你如何在 Windows 系統上安裝 Miniconda&#xff0c;并配置基礎環境&#xff0c;確保你能夠順利使用 Python 進行開發。即…

Flume詳解——介紹、部署與使用

1. Flume 簡介 Apache Flume 是一個專門用于高效地 收集、聚合、傳輸 大量日志數據的 分布式、可靠 的系統。它特別擅長將數據從各種數據源&#xff08;如日志文件、消息隊列等&#xff09;傳輸到 HDFS、HBase、Kafka 等大數據存儲系統。 特點&#xff1a; 可擴展&#xff1…

破解企業內部盜版軟件管理難題的技術方案

引言&#xff1a;盜版軟件——企業數字化轉型的“隱形地雷” 據BSA《全球軟件調查報告》顯示&#xff0c;37%的企業存在員工私自安裝盜版軟件的行為&#xff0c;由此引發的法律訴訟、數據泄露及罰款風險年均增長28%。LMT基于“預防-檢測-治理”三位一體技術框架&#xff0c;為…

Spring源碼解析

第一講 容器接口 BeanFactory和ApplicationContext接口的具體繼承關系&#xff1a; ApplicationContext 間接繼承了BeanFactory BeanFactory是父接口ApplicationContext是子接口&#xff0c;里面一些功能調用了BeanFactory BeanFactory的功能 表面上只有 getBean&#xff0…

Django Rest Framework 創建純凈版Django項目部署DRF

描述創建純凈版的Django項目和 Django Rest Framework 環境的部署 一、創建Django項目 1. 環境說明 操作系統 Windows11python版本 3.9.13Django版本 V4.2.202. 操作步驟(在Pycharm中操作) 創建Python項目drfStudy、虛擬環境 ?虛擬環境中安裝 jdangopip install django==4.…

圖解AUTOSAR_CP_NetworkManagementInterface

AUTOSAR 網絡管理接口(Nm)詳解 AUTOSAR 網絡管理接口規范與實現指南 目錄 1. 概述 1.1. 網絡管理接口的作用1.2. 網絡管理接口的特點 2. 網絡管理接口架構 2.1. 架構概覽2.2. 模塊交互關系 3. 網絡管理狀態機 3.1. 狀態定義3.2. 狀態轉換 4. 協調算法 4.1. 協調關閉流程4.2. 同…

java學習總結(八):Spring boot

一、SpringBoot簡介 傳統Spring開發缺點&#xff1a; 1、導入依賴繁瑣 2、項目配置繁瑣 Spring Boot是全新框架(更像是一個工具&#xff0c; 腳手架)&#xff0c;是Spring提供的一個子項目&#xff0c; 用于快速構建Spring應用程序。 隨著Spring 3.0的發布&#xff0c;Spring 團…

vue-router實現

實現一個簡化版的 vue-router 可以幫助我們更好地理解 Vue 路由是如何工作的。Vue Router 主要的功能是基于瀏覽器的 URL 來管理組件的顯示&#xff0c;能夠根據 URL 變化切換不同的視圖。下面是一個簡化版的實現&#xff0c;用于幫助你理解基本的路由機制。 創建一個簡單的 V…

Redis 服務器:核心功能與優化實踐

Redis 服務器:核心功能與優化實踐 引言 Redis(Remote Dictionary Server)是一款高性能的鍵值對存儲系統,廣泛用于緩存、消息隊列、實時排行榜等場景。本文將深入探討Redis服務器的核心功能,并提供一些優化實踐的技巧,以幫助讀者更好地理解和運用Redis。 Redis的核心功…

openEuler24.03 LTS下安裝MySQL8

前提條件 擁有openEuler24.03 LTS環境&#xff0c;可參考&#xff1a;Vmware下安裝openEuler24.03 LTS 步驟 卸載原有mysql及mariadb sudo systemctl stop mysql mysqld 2>/dev/null sudo rpm -qa | grep -i mysql\|mariadb | xargs -n1 sudo rpm -e --nodeps 2>/dev/…

GLOW-TTS

我首先需要理解用戶的指令&#xff0c;用戶希望我翻譯文章的3.1節“Training and Inference Procedures”部分。為了完成這個任務&#xff0c;我需要仔細閱讀文章的3.1節&#xff0c;理解其中的技術細節和概念&#xff0c;然后將這些內容準確地翻譯成中文。 在閱讀3.1節時&…

【算法思想】高精度

引入 首先了解&#xff1a; 1. int 范圍為10^9 2. long long 范圍數量級為10^18 如果超過該數量級&#xff0c;該怎么辦&#xff1f; ——這就是高精度、大數的算法問題 加法 輸入兩個整數a,b,輸出他們的和&#xff08;<10的500次方&#xff09; 核心是加法的核心——》每…

【失敗了】LazyGraphRAG利用本地ollama提供Embedding model服務和火山引擎的deepseek API構建本地知識庫

LazyGraphRAG測試結果如下 數據&#xff1a; curl https://www.gutenberg.org/cache/epub/24022/pg24022.txt -o ./ragtest/input/book.txt 失敗了 氣死我也&#xff01;&#xff01;&#xff01;對deepseek-V3也不是很友好啊&#xff0c;我沒錢prompt 微調啊&#xff0c;暈死…

ccfcsp3402矩陣重塑(其二)

//矩陣重塑&#xff08;其二&#xff09; #include<iostream> using namespace std; int main(){int n,m,t;cin>>n>>m>>t;int c[10000][10000];int s0,sum0;int d[10000],k[100000];for(int i0;i<n;i){for(int j0;j<m;j){cin>>c[i][j];d[s…

算法-除自身以外數組的乘積

力扣題目&#xff1a;238. 除自身以外數組的乘積 - 力扣&#xff08;LeetCode&#xff09; 題目描述&#xff1a; 給你一個整數數組 nums&#xff0c;返回 數組 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘積 。 題目數據 保證 數組 nums…

Unity Shader - UI Sprite Shader之簡單摳圖效果

Sprite摳圖效果&#xff1a; 前言 在PhotoShop中我們經常會用到摳圖操作&#xff0c;現在就用Shader實現一個簡單的摳圖效果。 實現原理&#xff1a; 使用當前像素顏色與需要摳掉的顏色相減作比較&#xff0c;然后與一個指定的閾值比較以決定是否將其顯示出來&#xff1b; U…

【Mac】安裝 Parallels Desktop、Windows、Rocky Linux

一、安裝PD 理論上&#xff0c;PD只支持試用15天&#xff01;當然&#xff0c;你懂的。 第一步&#xff0c;在 Parallels Desktop for Mac 官網 下載 Install Parallels Desktop.dmg第二步&#xff0c;雙擊 Install Parallels Desktop.dmg 第三步&#xff0c;雙擊安裝Paralle…