整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          JavaScript實現頁面到滾動到指定位置執行某些操作

          用JavaScript實現頁面滑動到指定位置加載動畫。

          若頁面滾動到class名為group-pic的元素的位置時開始加載


          1. $(document).ready(function(){
          2. var a,b,c;
          3. a = $(window).height(); //瀏覽器窗口高度
          4. var group = $(".group-pic");
          5. $(window).scroll(function(){
          6. b = $(this).scrollTop(); //頁面滾動的高度
          7. c = group.offset().top; //元素距離文檔(document)頂部的高度
          8. if(a+b>c){
          9. ...
          10. }else{
          11. ...
          12. }
          13. });
          14. });

          原理: 1.獲取瀏覽器窗口的高度;

          2.獲取頁面滾動的高度;

          3.獲取頁面距離文檔(document)頂部的高度

          offset().top具體指的是距哪里的高度呢?

          一些獲寬高度的屬性:

          網頁可見區域寬: document.body.clientWidth;

          網頁可見區域高: document.body.clientHeight;

          網頁可見區域寬: document.body.offsetWidth (包括邊線的寬);

          網頁可見區域高: document.body.offsetHeight (包括邊線的寬);

          網頁正文全文寬: document.body.scrollWidth;

          網頁正文全文高: document.body.scrollHeight;

          網頁被卷去的高: document.body.scrollTop;

          網頁被卷去的左: document.body.scrollLeft;

          網頁正文部分上: window.screenTop;

          網頁正文部分左: window.screenLeft;

          屏幕分辨率的高: window.screen.height;

          屏幕分辨率的寬: window.screen.width;

          屏幕可用工作區高度: window.screen.availHeight;

          屏幕可用工作區寬度:window.screen.availWidth;

          obj.offsetTop 指 obj 距離上方或上層控件的位置,整型,單位像素。

          obj.offsetLeft 指 obj 距離左方或上層控件的位置,整型,單位像素。

          obj.offsetWidth 指 obj 控件自身的寬度,整型,單位像素。

          obj.offsetHeight 指 obj 控件自身的高度,整型,單位像素。

          1.offsetTop : 當前對象到其上級層頂部的距離.

          不能對其進行賦值.設置對象到頁面頂部的距離請用style.top屬性.

          2.offsetLeft : 當前對象到其上級層左邊的距離.

          不能對其進行賦值.設置對象到頁面左部的距離請用style.left屬性.

          3.offsetWidth : 當前對象的寬度.

          與style.width屬性的區別在于:如對象的寬度設定值為百分比寬度,則無論頁面變大還是變小,style.width都返回此百分比,而offsetWidth則返回在不同頁面中對象的寬度值而不是百分比值

          4.offsetHeight : 與style.height屬性的區別在于:如對象的寬度設定值為百分比高度,則無論頁面變大還是變小,style.height都返回此百分比,而offsetHeight則返回在不同頁面中對象的高度值而不是百分比值

          用JavaScript實現頁面滑動到指定位置加載動畫。

          若頁面滾動到class名為group-pic的元素的位置時開始加載


          1. $(document).ready(function(){
          2. var a,b,c;
          3. a = $(window).height(); //瀏覽器窗口高度
          4. var group = $(".group-pic");
          5. $(window).scroll(function(){
          6. b = $(this).scrollTop(); //頁面滾動的高度
          7. c = group.offset().top; //元素距離文檔(document)頂部的高度
          8. if(a+b>c){
          9. ...
          10. }else{
          11. ...
          12. }
          13. });
          14. });

          原理: 1.獲取瀏覽器窗口的高度;

          2.獲取頁面滾動的高度;

          3.獲取頁面距離文檔(document)頂部的高度

          offset().top具體指的是距哪里的高度呢?

          一些獲寬高度的屬性:

          網頁可見區域寬: document.body.clientWidth;

          網頁可見區域高: document.body.clientHeight;

          網頁可見區域寬: document.body.offsetWidth (包括邊線的寬);

          網頁可見區域高: document.body.offsetHeight (包括邊線的寬);

          網頁正文全文寬: document.body.scrollWidth;

          網頁正文全文高: document.body.scrollHeight;

          網頁被卷去的高: document.body.scrollTop;

          網頁被卷去的左: document.body.scrollLeft;

          網頁正文部分上: window.screenTop;

          網頁正文部分左: window.screenLeft;

          屏幕分辨率的高: window.screen.height;

          屏幕分辨率的寬: window.screen.width;

          屏幕可用工作區高度: window.screen.availHeight;

          屏幕可用工作區寬度:window.screen.availWidth;

          obj.offsetTop 指 obj 距離上方或上層控件的位置,整型,單位像素。

          obj.offsetLeft 指 obj 距離左方或上層控件的位置,整型,單位像素。

          obj.offsetWidth 指 obj 控件自身的寬度,整型,單位像素。

          obj.offsetHeight 指 obj 控件自身的高度,整型,單位像素。

          1.offsetTop : 當前對象到其上級層頂部的距離.

          不能對其進行賦值.設置對象到頁面頂部的距離請用style.top屬性.

          2.offsetLeft : 當前對象到其上級層左邊的距離.

          不能對其進行賦值.設置對象到頁面左部的距離請用style.left屬性.

          3.offsetWidth : 當前對象的寬度.

          與style.width屬性的區別在于:如對象的寬度設定值為百分比寬度,則無論頁面變大還是變小,style.width都返回此百分比,而offsetWidth則返回在不同頁面中對象的寬度值而不是百分比值

          4.offsetHeight : 與style.height屬性的區別在于:如對象的寬度設定值為百分比高度,則無論頁面變大還是變小,style.height都返回此百分比,而offsetHeight則返回在不同頁面中對象的高度值而不是百分比值

          看個錨點定位的例子

          發現頁面唰的一些就到頂部了,快到我們懵逼了。。。

          開始解決

          scroll-behavior

          CSS屬性 scroll-behavior 為一個滾動框指定滾動行為,其他任何的滾動,例如那些由于用戶行為而產生的滾動,不受這個屬性的影響。在根元素中指定這個屬性時,它反而適用于視窗。

          scroll-behavior:smooth 寫在滾動容器元素上,可以讓容器的滾動變得平滑。

          在網頁默認滾動是在<html>標簽上,移動端大多數在<body>標簽上。

          我們可以這樣加:

          html, 
          body { scroll-behavior:smooth; }
          

          加了以后的效果如下:

          這是錄制的GIF圖,效果沒那么好。 大家可以動手試一下,滑動體驗非常不錯。

          缺點

          兼容性不夠好

          當然我們可以通過js來做個類似

          Element.scrollIntoView() 方法

          DOM元素的scrollIntoView() 方法讓當前的元素滾動到瀏覽器窗口的可視區域內,通過觸發滾動容器的定位實現。

          DOM元素的scrollIntoView()方法 是原生JS 兼容到IE6,兼容性非常好。

          參數如下

          {
           behavior: "auto" | "instant" | "smooth", // 默認 auto
           block: "start" | "center" | "end" | "nearest", // 默認 center
           inline: "start" | "center" | "end" | "nearest", // 默認 nearest
          }
          

          解釋一下這三個參數:

          1. behavior 表示滾動方式。auto 表示使用當前元素的 scroll-behavior 樣式。instant 和 smooth 表示 直接滾到底 和 使用平滑滾動。
          2. block 表示塊級元素排列方向要滾動到的位置。對于默認的 writing-mode: horizontal-tb 來說,就是豎直方向。start 表示將視口的頂部和元素頂部對齊;center 表示將視口的中間和元素的中間對齊;end 表示將視口的底部和元素底部對齊;nearest 表示就近對齊。
          3. inline 表示行內元素排列方向要滾動到的位置。對于默認的 writing-mode: horizontal-tb 來說,就是水平方向。其值與 block 類似。

          用法:

          html:

          <div class="wrap">
           <div onClick="onScrollIntoView()">點擊讓黑色塊到頂部</div>
           <ul class="body">
           <li>1</li>
           <li>2</li>
           <li id="box">我是黑色</li>
           <li>3</li>
           <li>4</li>
           </ul>
          </div>
          

          js:

          function onScrollIntoView () {
           var element = document.getElementById("box");
           element.scrollIntoView({behavior: "smooth"});
          }
          

          效果:

          這回大家再也不用害怕做錨點定位啦。

          最后我們在說一個關于頁面滾動問題吧,那就是 返回頂部 功能實現

          返回頂部 功能實現

          我們常用定時器 setInterval 來不斷減去高度。

          如:當前距離頂部 1000, 我們每10毫秒減50,

          var timer = setInterval(function() { // 定時器 每10毫秒執行一次
           // 頂部距離 document.body.scrollTop = 1000 
           var speed = 50 // 返回頂部速度 
           document.body.scrollTop = document.body.scrollTop - speed
           if (document.body.scrollTop === 0) { // 返回到達頂部后, 銷毀定時器
           clearInterval(timer)
           }
          }, 10)
          

          效果:

          大家會發現,頁面返回是滾動起來很干。 沒10毫秒減50. 很平均,在交互上效果并不好。

          借鑒上面 scroll-behavior:smooth 的交互效果。 緩動的返回頂部。

          改一下計算方式:1000/2 = 500, 500/2 =250, 250/2 = ...... 這樣滑動起來是不是就平滑了呢?

          換算成公式:開始位置 = 開始位置 + (結束位置 - 開始位置) / 速度

          document.body.scrollTop = 1000 + (0 - 1000) / 2

          公式太煩了還是上代碼吧:

          var onTop = function (a, b, c, d) {
           if (a == b || typeof a != 'number') {
           return
           }
           b = b || 0
           c = c || 2
           
           var speed = function () {
           a = a + (b - b) / c
           
           if (a < 1) {
           d(b, true)
           return
           }
           d(a, false)
           requestAnimationFrame(speed)
           }
           speed()
          }
          
          • a 開始位置
          • b 結束位置
          • c 速度
          • d 位置回調,d(當前的位置值, 否動畫結束)


          調用:

          var target = document.body.scrollTop ? document.body : document.documentElement
          onTop(target.scrollTop, 0, 4, function (value) {
           target.scrollTop = value
          })
          

          效果:

          Ps: gif錄制效果不好,大家可以動手寫一下DEMO


          主站蜘蛛池模板: 精品国产一区二区三区久久影院 | 亚洲字幕AV一区二区三区四区 | 日韩av片无码一区二区三区不卡| 国产精品一区在线观看你懂的| 亚洲日韩一区二区一无码| 精品久久一区二区三区| 中文字幕日韩一区二区三区不| 国产日韩精品一区二区在线观看播放 | 秋霞午夜一区二区| 人妻无码一区二区视频| 国产福利在线观看一区二区| 韩国精品一区视频在线播放| 亚洲日韩国产一区二区三区在线| 亚洲天堂一区在线| 激情内射亚洲一区二区三区| 日韩一区二区在线观看视频| 久久精品道一区二区三区| 国产亚洲一区二区精品| 岛国精品一区免费视频在线观看| 国产91精品一区二区麻豆亚洲| 日韩精品电影一区亚洲| 一区二区在线视频观看| 国产高清精品一区| 亚洲AⅤ无码一区二区三区在线| а天堂中文最新一区二区三区| 无码日韩精品一区二区人妻| 国产激情一区二区三区| 久久国产三级无码一区二区| 丰满人妻一区二区三区视频53| 精品一区二区三区四区| 中文字幕一区视频| 日韩一区二区视频| 午夜视频在线观看一区| 色一情一乱一伦一区二区三区| 香蕉视频一区二区三区| 乱色精品无码一区二区国产盗| 亚洲色一区二区三区四区| 国产麻豆剧果冻传媒一区| 国产精品亚洲不卡一区二区三区| 亚洲爆乳无码一区二区三区| 亚洲一区免费视频|