国产99久久精品_欧美日本韩国一区二区_激情小说综合网_欧美一级二级视频_午夜av电影_日本久久精品视频

最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
當前位置: 首頁 - 科技 - 知識百科 - 正文

利用JS實現scroll自定義滾動效果詳解

來源:懂視網 責編:小采 時間:2020-11-27 22:27:36
文檔

利用JS實現scroll自定義滾動效果詳解

利用JS實現scroll自定義滾動效果詳解:前言 最近在公司開發項目的時候,原生滾動條中有些東西沒辦法自定義去精細的控制,于是開發一個類似于better-scroll一樣的瀏覽器滾動監聽的JS實現,下面我們就來探究一下自定義滾動需要考慮哪些東西,經過哪些過程。話不多說了,來一起看看詳細的介紹吧。 選
推薦度:
導讀利用JS實現scroll自定義滾動效果詳解:前言 最近在公司開發項目的時候,原生滾動條中有些東西沒辦法自定義去精細的控制,于是開發一個類似于better-scroll一樣的瀏覽器滾動監聽的JS實現,下面我們就來探究一下自定義滾動需要考慮哪些東西,經過哪些過程。話不多說了,來一起看看詳細的介紹吧。 選

前言

最近在公司開發項目的時候,原生滾動條中有些東西沒辦法自定義去精細的控制,于是開發一個類似于better-scroll一樣的瀏覽器滾動監聽的JS實現,下面我們就來探究一下自定義滾動需要考慮哪些東西,經過哪些過程。話不多說了,來一起看看詳細的介紹吧。

選擇滾動監聽的事件

因為是自定義手機端的滾動事件,那我選擇的是監聽手機端的三個touch事件來實現監聽,并實現了兩種滾動效果,一種是通過-webkit-transform,一種是通過top屬性。兩種實現對于滾動的基本效果夠能達到,可是top的不適合滾動中還存在滾動,可是能解決滾動中存在postion:fixed屬性的問題;而transform可以實現滾動中有滾動,可是又不能解決postion:fixed的問題,所以,最后選擇性考慮使用哪一種實現方式,用法一樣。

主要的實現業務邏輯

handleTouchMove(event){
 event.preventDefault();
 this.currentY = event.targetTouches[0].screenY;
 this.currentTime = new Date().getTime();
 // 二次及以上次數滾動(間歇性滾動)時間和路程重置計算,0.05是間歇性滾動的停頓位移和時間比
 if (Math.abs(this.currentY - this.lastY) / Math.abs(this.currentTime - this.lastTime) < 0.05) {
 this.startTime = new Date().getTime();
 this.resetY = this.currentY;
 }
 this.distance = this.currentY - this.startY;
 let temDis = this.distance + this.oldY;
 /*設置移動最小值*/
 temDis = temDis > this.minValue ? temDis * 1 / 3 : temDis;
 /*設置移動最大值*/
 temDis = temDis < -this.maxValue ? -this.maxValue + (temDis + this.maxValue) * 1 / 3 : temDis;
 this.$el.style["top"] = temDis + 'px';
 this.lastY = this.currentY;
 this.lastTime = this.currentTime;
 this.dispatchEvent();
 this.scrollFunc(event);
},

代碼解讀:這是監聽touchmove事件的回調,其中主要計算出目標節點this.$el的top或者-webkit-transform中translateY的值,而計算的參考主要以事件節點的screenY的垂直移動距離為參考,當然其中還要判斷一下最大值和最小值,為了保證移動可以的超出最大值小值一定的距離所以加了一個1/3的移動計算。這里可能主要到了有一個間歇性滾動的判斷和計算,主要是服務于慣性滾動的,目的是讓慣性滾動的值更加精確。

handleTouchEnd(event){
 /*點透事件允許通過*/
 if (!this.distance) return;
 event.preventDefault();
 let temDis = this.distance + this.oldY;
 /*計算緩動值*/
 temDis = this.computeSlowMotion(temDis);
 /*設置最小值*/
 temDis = temDis > this.minValue ? this.minValue : temDis;
 /*設置最大值*/
 temDis = temDis < -this.maxValue ? -this.maxValue : temDis;
 this.$el.style["transitionDuration"] = '500ms';
 this.$el.style["transitionTimingFunction"] = 'ease-out';
 /*確定最終的滾動位置*/
 setTimeout(()=> {
 this.$el.style["top"] = temDis + 'px';
 }, 0);
 // 判斷使用哪一種監聽事件
 if (this.slowMotionFlag) {
 this.dispatchEventLoop();
 } else {
 this.dispatchEvent();
 }
 this.$el.addEventListener('transitionend', ()=> {
 window.cancelAnimationFrame(this.timer);
 });
 this.scrollFunc(event);
}

代碼解讀:這是touchend事件監聽的回調,其中這里要判斷是否要攔截click和tap事件,并且這里還要計算慣性緩動值,設置最終的最大最小值,以及設置動畫效果和緩動效果。下面來談一下滾性滾動的計算:

// 計算慣性滾動值
computeSlowMotion(temDis){
 var duration = new Date().getTime() - this.startTime;
 // 300毫秒是判斷間隔的最佳時間
 var resetDistance = this.currentY - this.resetY;
 if (duration < 300 && Math.abs(resetDistance) > 10) {
 var speed = Math.abs(resetDistance) / duration,
 destination;
 // 末速度為0 距離等于初速度的平方除以2倍加速度
 destination = (speed * speed) / (2 * this.deceleration) * (resetDistance < 0 ? -1 : 1);
 this.slowMotionFlag = true;
 return temDis += destination;
 } else {
 this.slowMotionFlag = false;
 return temDis;
 }
},

代碼解讀:滾性滾動的算法主要是根據一個路程和時間計算出初速度,以及原生滾動的加速度的大于值0.006來計算滾動的總位移。這里主要還要判斷一下一個300ms的經驗值。

總結

大概的流程和思考就是這樣了,后續還會增加更多的功能進行擴展

附上git地址:https://github.com/yejiaming/scroll

本地下載:http://xiazai.jb51.net/201710/yuanma/js-scroll-custom(jb51.net).rar

好了,

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

文檔

利用JS實現scroll自定義滾動效果詳解

利用JS實現scroll自定義滾動效果詳解:前言 最近在公司開發項目的時候,原生滾動條中有些東西沒辦法自定義去精細的控制,于是開發一個類似于better-scroll一樣的瀏覽器滾動監聽的JS實現,下面我們就來探究一下自定義滾動需要考慮哪些東西,經過哪些過程。話不多說了,來一起看看詳細的介紹吧。 選
推薦度:
標簽: 效果 scroll js實現
  • 熱門焦點

最新推薦

猜你喜歡

熱門推薦

專題
Top
主站蜘蛛池模板: 国产国产成人精品久久 | 一区二区不卡久久精品 | 日韩直播 | 欧美日韩免费在线视频 | 日韩123| 在线免费观看一区二区三区 | 国产精品亚洲综合一区 | 国产精品高清一区二区 | 欧美在线综合视频 | 国产精品视频大全 | 亚洲伊人天堂 | 久久精品视频一区二区三区 | 亚洲国产精品婷婷久久久久 | 在线播放一区二区精品产 | 在线 | 一区二区三区 | 欧美极品视频 | 国产精品一区91 | 高清精品一区二区三区一区 | 亚洲免费一区 | 日韩欧美视频在线播放 | 亚洲欧美日韩国产色另类 | 在线观看日韩视频 | 中日韩美中文字幕 | 一级毛片一级毛片一级级毛片 | 久久久午夜 | 爽妇网s | 国产成人一区二区三区影院免费 | 国产成人精品.一二区 | 成人亚洲国产综合精品91 | 欧美 韩国 精品 另类 综合 | 国产成人久久一区二区三区 | 国产成人久久精品一区二区三区 | 日韩视频一区二区 | 成人毛片在线观看 | 欧美精品一区二区在线观看播放 | 亚洲欧洲视频在线 | 青青国产成人久久91网 | 欧美第五页 | 欧美xxxbbb | 黄色毛片视频 | 色综合91久久精品中文字幕 |