導航:首頁 > 編程語言 > js慣性滾動計算

js慣性滾動計算

發布時間:2023-05-13 05:17:00

js無限滾動中,iOS慣性滾動停止的位置怎麼確定

可以給你的webView的scrollView屬性指氏碰敗定delegate然後吵旦實現scrollViewDidEndDecelerating方法來監聽慣性滾動停止殲顫事件,這個時候獲取scrollView的滾動位置,然後通過js傳到網頁中

② JS實現滾動條觸底載入更多

原理

1.通過監聽滾動睜悔區域DOM的scroll事件, 計算出觸底

// 滾動可視區域高度 + 當前滾動位置 === 整個滾動高度
scrollDom.clientHeight + scrollDom.scrollTop === scrollDom.scrollHeight

2.觸底後觸發列表添加, 列表添加使用createDocumentFragment, 將多次插入的DOM先存入內存, 最後爛廳一次填充進去, 提高性能, 也方便後面的MutationObserver監聽

3.使用MutationObserver監聽列表的DOM添加, 添加完畢後, 隱藏載入中飢早隱提示

示例

https://codepen.io/klren0312/full/dybgayL

參考資料

https://developer.mozilla.org/zh-CN/docs/Web/API/Element/clientHeight
https://developer.mozilla.org/zh-CN/docs/Web/API/Element/scrollHeight
https://developer.mozilla.org/zh-CN/docs/Web/API/Element/scrollTop
https://developer.mozilla.org/zh-CN/docs/Web/API/GlobalEventHandlers/onscroll
https://developer.mozilla.org/zh-CN/docs/Web/API/Document/createDocumentFragment
https://developer.mozilla.org/zh-CN/docs/Web/API/MutationObserver

③ 物理學的 H5 應用:模擬慣性滑動

在移動端 H5 中,時間選擇器( date-picker )、省市區選擇器( area-picker )等組件經常會使用這樣的交互效果:

這個 gif 是在【微信錢包 - 賬單】中錄制的 ios 原生時間選擇器。可見, 當用戶手指在選擇器上先是滑動再從屏幕上移開,內容會繼續保持一段時間的滾動效果,並且滾動的速度和持續的時間是與滑動手勢的強烈程度成正比。 這種交互思路源於 ios 系統原生元素的滾動回彈( momentum-based scrolling ),來看 H5 的一個普通列表在 ios 上的滾動表現:

社區上大部分的移動端組件庫的選擇器組件都採取了這種交互方式,看看效果:

weui 的選擇器實現了慣性滑動,但滑動動畫結束得有稿掘點突兀,效果一般。

vant 的選擇器壓根沒有做慣性滑動,當手指從屏幕上移開後,選擇器的滑動會立刻停止。可見這樣的交互體驗是比較差的。

接下來我會從設計層面剖析和模擬慣性滑動的交互效果。

不難想像,慣性滑動非常貼合現實生活中的一些場景,如汽車剎車等。除此之外,與物理力學中的滑塊模型也十分相似,由此我會參考滑塊模型來剖析慣性滑動的全過程。

慣性 來源於物理學中的慣性定律(即 牛頓第一定律 ):一切物體在沒有受到力的作用的時候,運動狀態不會發生改變,物體所擁有的這種性質就被稱為慣性。我們不妨把慣性滑動模擬成滑動滑塊然後釋放的過程(以下討論中用戶滑動的目標皆模擬成 滑塊 ),主要劃分為兩個階段:

描述滑塊的慣性滑動,首先需要求出滑動的距離。在上述二階段中,滑塊受摩擦力 作 勻減速直線運動 。假設滑動距離為 ,初速度為 ,末速度為 。根據位移公式

加速度公式

可以仔昌算出慣性滑動距離

由於勻減速運動的加速度為負,不妨設一個加速度常量 ,使其滿足 ,那麼

這里 為正數。也就是說,我們只需要求出初始速度即可。

關注第一個階段,假設用戶滑動滑塊的距離為 ,滑動的持續時間是 ,那麼二階段的初速度 可以根據位移公式求得

綜上,求慣性滑動的距離我們需要記錄用戶滑動滑塊的 距離 持續時間 ,並設置一個合理的 加速度常量 。念敬扒

注意,這里的距離和持續時間並不是用戶滑動滑塊的總距離和時長,而是觸發慣性滑動范圍內的距離和時長,詳見【慣性滑動的啟動條件】。

針對二階段的勻減速直線運動,時間段 產生的位移差 ,其中 。也就是說時間越往後,同等時間間距下通過的位移越來越小,也就是動畫的推進速度越來越慢。

這與 CSS3 transition-timing-function 中的 ease-out 速度曲線相吻合, ease-out (即 cubic-bezier(0, 0, .58, 1) )的貝塞爾曲線為

上圖來自 在線繪制貝塞爾曲線網站 。圖表中的縱坐標是指 動畫推進的進程 ;橫坐標是指 時間 ;原點坐標為 (0, 0) ,終點坐標為 (1, 1) ,假設動畫持續時間為2秒, (1, 1) 坐標點則代表離動畫開始2秒時動畫執行完畢(100%)。根據圖表可以得出,時間越往後動畫進程的推進速度越慢,符合勻減速直線運動的特性。

然而這樣的速度曲線過於線性平滑,減速效果不明顯。我們基於 ios 滾動回彈的效果,調整貝塞爾曲線的參數為 cubic-bezier(.17, .89, .45, 1) 。

滑塊滑動不是無邊界的,我們來考慮這樣的場景:當滑塊向下滑動,其頂部正要接觸容器上邊界時速度還沒有降到 ,此時如果讓滑塊瞬間停止運動,這樣的交互效果是不理想的。

我們可以把上邊界想像成一條與滑塊緊密貼合的固定彈簧, 當滑塊到達臨界點而速度還沒有降到 時,滑塊會繼續滑動並拉動彈簧使其往下形變,同時會受到彈簧的反拉力作減速運動(動能轉化為內能);當滑塊速度降為 ,此時彈簧的形變數最大,由於彈性特質彈簧會恢復原狀(內能轉化成動能),從而拉動滑塊反向運動

回彈過程也可以分為兩個階段:

根據上述分析,回彈的第一階段作加速度越來越大的變減速直線運動,設此階段的初速度為 ,可以與 建立以下關系

那麼回彈距離為

微積分都來了,簡直沒法算好吧…

我們可以根據運動模型來簡化 的計算,由於該階段的加速度大於 非回彈慣性滑動 的加速度,設 非回彈慣性滑動 的總距離為 ,那麼

所以可以設置一個合理的常量 ,使其滿足

整個觸發回彈的慣性滑動模型包括三個運動階段:

然而把 階段a 和 階段b 描繪成 CSS 動畫是有一定復雜度和風險的:

出於簡化的考慮,可以將 階段a、b 合並為一個運動階段:

對於合並後的 階段a 末段,由於反向加速度越來越大,因此滑塊減速的效率會比 非回彈慣性滑動 同期更大,對應的貝塞爾曲線末段也會更陡,參數調整為 cubic-bezier(.25, .46, .45, .94) 。

在 階段b 中,滑塊先變加速後變減速,嘗試 ease-in-out 的動畫曲線:

可以看出,由於 階段b 初始的 ease-in 曲線使 階段a、b 的銜接段稍有停留,效果體驗一般。所以我們選擇只描繪變減速運動這一段,調整貝塞爾曲線為 cubic-bezier(.165, .84, .44, 1) 。

一次慣性滑動可能會出現兩種情況:

慣性滑動的啟動需要有足夠的動量。我們可以簡單地認為,當用戶滑動的距離足夠大(大於 15px )和持續時間足夠短(小於 300ms )時,即可產生慣性滑動。也就是說,最後一次 touchmove 事件觸發的時間和 touchend 事件觸發的時間間隔小於 300ms ,且兩者產生的距離差大於 15px 時認為啟動慣性滑動。

當慣性滑動未結束(包括處於回彈過程),用戶再次觸碰滑塊時會暫停滑塊的運動。原理上是通過 getComputedStyle 和 getPropertyValue 方法獲取當前的 transform: matrix() 矩陣值,抽離出水平 y 軸偏移量後重新調整 translate 的位置。

demo 基於 vuejs 實現,預覽地址: https://codepen.io/JunreyCen/pen/arRYem

④ 怎樣用原生js獲取滾動條滾動的距離

使用js獲取的相關方法

//回到頁面頂部
$("#goTotop").click(function(){
$('body,html').animate({scrollTop:0},1500);//點擊按鈕讓其回到頁面頂部
});

$(window).scroll(function(){
varyheight1=window.pageYOffset;//滾動條距頂端的距離
varyheight=getScrollTop();//滾動條距頂端的距離
varheight=document.documentElement.clientHeight//瀏覽器可視化窗口的大小
vartop=parseInt(yheight)+parseInt(height)-217;
vardivobj=$(".kf");
divobj.attr('style','top:'+top+'px;');
})

/**
*獲取滾動條距離頂端的距離
*@return{}支持IE6
*/
functiongetScrollTop(){
varscrollPos;
if(window.pageYOffset){
scrollPos=window.pageYOffset;}
elseif(document.compatMode&&document.compatMode!='BackCompat')
{scrollPos=document.documentElement.scrollTop;}
elseif(document.body){scrollPos=document.body.scrollTop;}
returnscrollPos;
}

⑤ js實現圖片自動的滾動效果

把你的代碼放在「內容」中間就可以了 寬度600px,你自己可以改寬度
<DIV id=demoleft style="OVERFLOW: hidden; WIDTH:600px;">
<TABLE border="0" align="left" cellPadding="0" cellSpacing="0" cellspace="0">
<TBODY>
<TR>
<TD width="600" align=middle vAlign=top id=demo1left>
<!--內容-->
<table width="600" height="120" border="0" cellpadding="0" cellspacing="0">
<tr>
<%
set rs=server.CreateObject("adodb.recordset")
rs.open "select top 8 * from cp_aboutus where userid="&hid&" order by updatetime desc,articleid desc ",conn,1,1
if not rs.eof then
dim hang
hang = 0
do while not rs.eof
hang = hang + 1
%>
<td>
<table width="110" height="115" border="0" align="center" cellpadding="0" cellspacing="0" id="table12">
<tr>
<td width="110" height="87"><%if rs("headpic")<>"" then%><a href="huicpshow.asp?hid=<%=hid%>&id=<%=rs("articleid")%>" title="<%=rs("title")%>" target="_blank"><img src="<%=rs("headpic")%>" width="110" height="87" border="0" /></a><%else response.Write "<table width=110 height=87 border=0 cellpadding=0 cellspacing=0><tr><td height=23 bgcolor=#EBEBEB align=center>暫無圖片</td></tr></table>" end if%></td>
</tr>

<tr>
<td align="center"><a href="huicpshow.asp?hid=<%=hid%>&id=<%=rs("articleid")%>" title="<%=rs("title")%>" target="_blank"><%=rs("title")%></a></td>
</tr>
</table>
</td>
<%
rs.movenext
loop
end if
rs.close
set rs=nothing
%>
</tr>
</table>

<!--end 內容-->
</TD>
<TD width="102" vAlign=top id=demo2left></TD>
</TR>
</TBODY>
</TABLE>
</DIV>
<SCRIPT>
var speed=18//速度數值越大速度越慢,demo2.offsetWidth=demo1.offsetWidth=固定值
var demoleft = document.getElementById("demoleft");
var demo2left = document.getElementById("demo2left");
var demo1left = document.getElementById("demo1left");
demo2left.innerHTML=demo1left.innerHTML
function Marquee(){
if(demo2left.offsetWidth-demoleft.scrollLeft<=0)//其實demo.scrollLeft是有 最大值的,和demo0.width,引用的圖片的width有關系。demo過了一半(每半內容一樣的),重新開始循環
demoleft.scrollLeft-=demo1left.offsetWidth
else{
demoleft.scrollLeft++//不斷的增加,相當於父容器的滾動條不斷是縮小;但由於OVERFLOW: hidden; (滾動條不可見)
}
}
var MyMarleft=setInterval(Marquee,speed)
demoleft.onmouseover=function() {clearInterval(MyMarleft)}
demoleft.onmouseout=function() {MyMarleft=setInterval(Marquee,speed)}
</SCRIPT>

⑥ js控制頁面滾動(實例)

目標描述:多個圖片排列下來,按右邊的小按鈕,抵達相應位置,滑鼠滑動,抵達下一圖,或者上一圖
知識點:onmousewheel,addEventListener,scrollTo,setTimeout

過程:
1.body 寬,高釘死,100vw,100vh,overflow:hidden 使得不出現滾動條,不然不好看
2.圖片放進去,排起來,(注意:默認空隙的處理,可以使用flex布局,空隙就不見了)
3.製作相對於視窗的按鈕,幾張圖片就幾個按鈕,(position: fixed;計算一下高度,可以利用calc計算top使得上下居中)
4.美化一下,css寫寫
5.先寫簡單的按鈕事件

6.寫監聽滑動事件(onmousewheel在火狐無效,DOMMouseScroll只在火狐有效)
react在componentDidMount的時候監聽

7.補充寫一下火狐的

9.測試檢查一下。
完成啦,啦啦啦~
我的截圖:

缺點:這里我是一直對頁面進行監聽,導致滑動過快對時候動畫效果開始執行對時間延後。體現為滑動對輕,整個就流暢一點。
ps:寫這種帶計算帶頁面,我覺得是考驗思維的,你可以對這里的知識點不熟練,但是你必須得能理解每一步的加加減減。

⑦ js或jquery 怎麼監聽由於屏幕慣性滾動而產生的距離

慣性滾動?手機端么?PC端沒有慣性滾動的吧。

那麼你數派手機判弊端用的什薯沖賀么?iscroll?.,不然也不會產生慣性滾動啊

⑧ js如何實現慣性滑動效果

主要思路是:滑鼠當前點到下一點直接間隔計算出速度。這樣就實現了慣性滑動效果。
下面是簡單的js代碼實現:僅供參考:
<style>
#div1{width:100px;height:100px;background:red;position:absolute;left:0px;top:0;}
</style>
<script>
window.onload=function(){
varoDiv=document.getElementById('div1');
variSpeedX=0;
variSpeedY=0;
varlastX=0;
varlastY=0;
vartimer=null;
oDiv.onmousedown=function(ev){//div的滑鼠按下事件,主要計算滑鼠當前位置,和移動位置。這樣可以計算出滑鼠移動速度。
varoEvent=ev||event;
vardisX=oEvent.clientX-oDiv.offsetLeft;
vardisY=oEvent.clientY-oDiv.offsetTop;
clearInterval(timer);
document.onmousemove=function(ev){//滑鼠拖動事件。
varoEvent=ev||event;
oDiv.style.left=oEvent.clientX-disX+'px';
oDiv.style.top=oEvent.clientY-disY+'px';
iSpeedX=oEvent.clientX-lastX;
iSpeedY=oEvent.clientY-lastY;
lastX=oEvent.clientX;
lastY=oEvent.clientY;
}
document.onmouseup=function(){//當滑鼠抬起後,清掉移動事件。
document.onmousemove=null;
document.onmouseup=null;
oDiv.releaseCapture&&oDiv.releaseCapture();
startMove();
}
oDiv.setCapture&&oDiv.setCapture();
returnfalse;
}
functionstartMove(){//移動函數,主要操作是計算滑鼠移動速度和移動方向。
clearInterval(timer);
timer=setInterval(function(){
iSpeedY+=3;
vart=oDiv.offsetTop+iSpeedY;
varl=oDiv.offsetLeft+iSpeedX;
if(t>document.documentElement.clientHeight-oDiv.offsetHeight){
t=document.documentElement.clientHeight-oDiv.offsetHeight;
iSpeedY*=-0.8;
iSpeedX*=0.8;
}
if(t<0){
t=0;
iSpeedY*=-0.8;
iSpeedX*=0.8;
}
if(l>document.documentElement.clientWidth-oDiv.offsetWidth){
l=document.documentElement.clientWidth-oDiv.offsetWidth;

iSpeedX*=-0.8;
iSpeedY*=0.8;
}
if(l<0){
l=0;
iSpeedX*=-0.8;
iSpeedY*=0.8;

}

oDiv.style.left=l+'px';
oDiv.style.top=t+'px';

if(Math.abs(iSpeedX)<1)iSpeedX=0;
if(Math.abs(iSpeedY)<1)iSpeedY=0;
if(iSpeedX==0&&iSpeedY==0&&t==document.documentElement.clientHeight-oDiv.offsetHeight){
clearInterval(timer);
}
document.title=i++;
},30);
}
};
</script>
</head>
<body>
<divid="div1"></div>
</body>

⑨ js實現圖片滾動效果

<SCRIPT language="JavaScript">
var speed=50; //設置滾動速度
demo2.innerHTML=demo1.innerHTML //復制dome1為dome2
function Marquee(){
if(demo2.offsetTop-demo.scrollTop<=0) //當滾動至dome1與dome2交界時
demo.scrollTop-=demo1.offsetHeight //dome跳到最頂端
else{
demo.scrollTop++
}
}
var MyMar=setInterval(Marquee,speed) //設置定時器
demo.onmouseover=function() {clearInterval(MyMar)}//滑鼠移上時清除定時器達到滾動停止的目的
demo.onmouseout=function() {MyMar=setInterval(Marquee,speed)}//滑鼠移開時重設定時器,繼續滾動
</SCRIPT>

<div id="demo" style="overflow: hidden; height: 600; width: 180; background: #214984; color: #ffffff">
<div id="demo1" align="center">
<!-- 定義圖片 -->
</div>
<div id="demo2" align="center"></div>
</div>

⑩ 在js中怎麼設置滾動條滾動的距離

如果使用jquery的話,可以這樣寫:

$(window).bind("scroll", function(){
var top = $(this).scrollTop(); // 當前窗口的滾動距離
});

如果使用原生js,可以這樣寫(摘自網上的):

/**
* 獲取滾動條距離頂端的距離
* @return {}支持IE6
*/
function getScrollTop() {
var scrollPos;
if (window.pageYOffset) {
scrollPos = window.pageYOffset; }
else if (document.compatMode && document.compatMode != 'BackCompat')
{ scrollPos = document.documentElement.scrollTop; }
else if (document.body) { scrollPos = document.body.scrollTop; }
return scrollPos;
}

閱讀全文

與js慣性滾動計算相關的資料

熱點內容
怎麼他么怎麼又網路了 瀏覽:649
java會出現內存泄露么 瀏覽:617
蘋果4s鎖屏後怎麼還顯示歌曲 瀏覽:207
鴻蒙系統文件管理哪些可以刪除 瀏覽:550
ubuntuqt創建工程沒有配置文件 瀏覽:126
網站登錄變成其他網站怎麼處理 瀏覽:202
ug數控編程學校有哪些 瀏覽:203
java圖片上傳顯示 瀏覽:402
ppt的文件名後綴 瀏覽:902
ug編程軟體下載到哪個盤 瀏覽:359
炫酷字體APP下載的文件在哪裡 瀏覽:668
廊坊哪裡有少兒編程機構 瀏覽:312
cad新文件能找回來嗎 瀏覽:951
導出手機qq文件到u盤 瀏覽:456
電腦如何打開ppt文件怎麼打開方式 瀏覽:782
魅族鎖定區文件夾 瀏覽:357
刻字cnc怎麼編程 瀏覽:182
學校的網路拓撲結構圖 瀏覽:784
收集100個pdf文件里關鍵詞 瀏覽:594
蘋果關閉4g網路設置 瀏覽:289

友情鏈接