整合營銷服務商

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

          免費咨詢熱線:

          瀏覽器的一些“滾動”行為鑒賞

          瀏覽器的一些“滾動”行為鑒賞

          按照我的個人理解,滾動分全局滾動(瀏覽器窗口)跟局部滾動(自定義的盒子),以下內容絕大部分都是指全局滾動,局部滾動的話獲取指定的DOM再調用相應的API即可?

          如何設置全局滾動條高度

          1. 最常用的方法:
          window.scrollTo(0, 0);
          // or
          window.scrollTo({
           left: 0,
           top: 100
          });
          復制代碼
          
          1. 也可以利用相對滾動設置:
          window.scrollBy(0, 0);
          // or
          window.scrollBy({
           left: 0,
           top: 100
          });
          復制代碼
          
          1. 或者利用scrollTop設置:
          document.scrollingElement.scrollTop=100;
          復制代碼
          

          注意:scrollTo跟scrollBy的參數是一樣的,區別就是scrollBy滾動距離是相對與當前滾動條位置進行滾動?

          效果對比如下:

          很明顯,前者就是把滾動高度設置成100,而后者是每次都增加100,這就是為什么稱之為相對滾動了?

          如何指定一個元素顯示在視窗

          1. 最常用的方法:
          // 獲取元素的offsetTop(元素距離文檔頂部的距離)
          let offsetTop=document.querySelector(".box").offsetTop;
          // 設置滾動條的高度
          window.scrollTo(0, offsetTop);
          復制代碼
          

          效果如下:

          1. 或者用錨點:
          <a href="#box">盒子出現在頂部</a>
          <div id="box"></div>
          復制代碼
          

          效果如下:

          1. 或者利用scrollIntoView進行展現:
          document.querySelector(".box").scrollIntoView();
          復制代碼
          

          效果如下:

          還可以指定元素的出現位置:

          // start出現在視口頂部、center出現在視口中央、end出現在視口底部
          document.querySelector(".box").scrollIntoView({
           block: "start" || "center" || "end"
          });
          復制代碼
          

          效果如下:

          如何設置滾動具有平滑的過渡效果

          1. 利用每個方法的參數設置:
          window.scrollTo({
           behavior: "smooth"
          });
          window.scrollBy({
           behavior: "smooth"
          });
          document.querySelector(".box").scrollIntoView({
           behavior: "smooth"
          });
          復制代碼
          

          效果如下:

          1. 或者用css屬性設置:
          html {
           scroll-behavior: smooth; // 全局滾動具有平滑效果
          }
          // 或者所有
          * {
           scroll-behavior: smooth;
          }
          復制代碼
          

          效果如下:

          注意:設置了該屬性之后,所有方法都可以不用設置behavior參數了,二選一即可,因為都是控制當前指定元素的滾動行為,所以錨點跳轉、設置scrollTop也具有平滑(smooth)的滾動行為?

          一些有趣的東西

          1. scrollingElement

          該對象可以非常兼容地獲取scrollTop、scrollHeight等屬性,在移動端跟PC端都屢試不爽

          還記得當初寫這個兼容性方法:

          let scrollHeight=document.documentElement.scrollHeight || document.body.scrollHeight;
          復制代碼
          

          現在你只需要:

          let scrollHeight=document.scrollingElement.scrollHeight;
          復制代碼
          

          因為在MDN中是這樣介紹它的:

          標準模式返回documentElement,怪異模式返回body;

          2. 滾動到底部

          window.scrollTo({
           left: 0,
           top: document.scrollingElement.scrollHeight
          });
          // 如果你實在是懶的話...
          window.scrollTo(0, 999999);
          復制代碼
          

          注意:平滑滾動到頂部或者底部自己加參數或者屬性即可?

          3. 判斷瀏覽器已滾動到底部

          window.addEventListener("scroll", ()=> {
           let {
           scrollTop,
           scrollHeight,
           clientHeight
           }=document.scrollingElement;
           
           // 當前滾動高度 + 視口高度 >=文檔總高度
           if (scrollTop + clientHeight >=scrollHeight) {
           console.log("已到達底部");
           }
          });
          復制代碼
          

          效果如下:

          函數節流

          當你沒加函數節流:

          window.addEventListener("scroll", ()=> console.log("我在滾我在滾!"));
          復制代碼
          

          效果如下:

          當你加了函數節流之后:

          window.addEventListener("scroll", throttle(()=> console.log("我在滾我在滾!")));
          復制代碼
          

          效果如下:

          throttle源碼:

          function throttle(fn, interval=500) {
           let run=true;
           return function () {
           if (!run) return;
           run=false;
           setTimeout(()=> {
           fn.apply(this, arguments);
           run=true;
           }, interval);
           };
          }
          復制代碼
          

          用處:減少代碼執行頻率?

          函數防抖

          當你加了函數防抖之后:

          window.addEventListener("scroll", debounce(()=> console.log("滾動結束!")));
          復制代碼
          

          效果如下:

          debounce源碼:

          function debounce(fn, interval=500) {
           let timeout=null;
           return function () {
           clearTimeout(timeout);
           timeout=setTimeout(()=> {
           fn.apply(this, arguments);
           }, interval);
           };
          }
          復制代碼
          

          用處:判斷某個動作結束,如剛剛的滾動結束、input輸入結束等?

          解決IOS設備局部滾動不順暢(粘手)

          除了瀏覽器原生滾動,自定義的滾動條都會出現這種情況,加以下屬性就可以解決:

          .box {
           -webkit-overflow-scrolling: touch;
          }
          復制代碼
          

          對比如下:

          注意:要真機才能看到效果,這里指的局部滾動是指自己定義的盒子,然后設置overflow: auto || scroll;后的滾動行為;

          滾動傳播

          指有多個滾動區域,當一個滾動區域滾動完之后,繼續滾動會傳播到到父區域繼續滾動的行為:

          .box {
           overscroll-behavior: contain; // 阻止滾動傳播
          }
          復制代碼
          

          對比效果圖如下:

          橫向滾動

          移動端遇到此需求比較多,常用于圖片展示:

          <ul>
           <li>
           <img src="">
           </li>
           // ...
          </ul>
          ul {
           white-space: nowrap; // 超出不換行
           overflow-x: auto;
           li {
           display: inline-block;
           img {
           display: block;
           width: 200px;
           }
           }
          }
          復制代碼
          

          效果如下:

          滾動結束后,強制滾動到指定元素

          基于上面的例子,我們設置如下屬性:

          ul {
           scroll-snap-type: x mandatory;
           
           li {
           scroll-snap-align: start;
           }
          }
          復制代碼
          

          效果如下:

          仔細看會發現,我們松手的時候,會將最近的元素滾動到最右邊(初始位置,對于Y軸來講就是頂部,X軸則是右邊)

          也可以設置出現在中間:

          li {
           scroll-snap-align: center;
          }
          復制代碼
          

          效果如下:

          這樣,一個簡易的輪播圖效果就出來啦!

          還可以實現全屏滾動:

          注意:該屬性會在你滾動完之后再做處理,也就是說你可以一下子從圖片1跳到圖片9?

          最后

          以上涉及到的方法或屬性文檔如下:

          1. scrollTo
          2. scrollBy
          3. scrollIntoView
          4. scrollingElement
          5. scroll-behavior
          6. -webkit-overflow-scrolling
          7. overscroll-behavior
          8. scroll-snap-type
          9. scroll-snap-align

          如果你覺得這篇文章不錯,請別忘記點個贊跟關注哦~

          么是全屏布局

          全屏布局就是指 HTML 頁面鋪滿整個瀏覽器窗口, 并且沒有滾動條。而且還可以跟隨瀏覽器的大小變化而變化。

          能是出于節省用戶流量,許多移動端瀏覽器都不支持H5自動播放視頻,必須在用戶主動交互(點擊或者滑動等)后才可以通過js播放視頻

          PC端可以通過設置muted,自動播放靜音視頻

          安卓瀏覽器均不支持自動播放,實測在微信內置瀏覽器,滑動視為交互行為,可以在這之后播放視頻,抖音內置瀏覽器則需要點擊交互,鴻蒙系統瀏覽器可以自動播放靜音視頻

          解決方案

          • 法一 引導用戶點擊或滑動

          進入網站時彈窗,例如歡迎語等,用戶點擊關閉后執行視頻播放
          簡單粗暴的方法,在某些場景時適用的,實測在安卓、鴻蒙、IOS、抖音瀏覽器等均可以用這個方法解決

          close() {

          const videos=document.querySelectorAll('video');

          for (let i=0; i < videos.length; i++) {

          const element=videos[i];

          element.play();

          }

          }

          【更多音視頻學習資料,點擊下方鏈接免費領取↓↓,先碼住不迷路~】

          點擊領取→音視頻開發基礎知識和資料包

          法二 jsmpeg

          將視頻轉成ts格式,通過jsmpeg解碼器進行加載播放,可以實現自動播放,實測基本上可以解決所有移動端無法播放視頻的問題

          轉ts

          安裝ffmpeg,輸入命令將mp4轉成ts

          • s - 分辨率
          • b - 碼率 b:v代表視頻碼率 b:a代表音頻碼率
          • r - 幀頻

          ffmpeg.exe -i in.mp4 -f mpegts -codec:v mpeg1video -s 680x1080 -b:v 2074k -r 29.97 out.ts

          <!DOCTYPE html>

          <html lang="en">

          <head>

          <meta charset="UTF-8" />

          <meta http-equiv="X-UA-Compatible" content="IE=edge" />

          <meta name="viewport" content="width=device-width, initial-scale=1.0" />

          <title>Document</title>

          // 引入jsmpeg

          <script src="./jsmpeg.min.js"></script>

          <style>

          #canvas {

          width: 100%;

          height: 100%;

          }

          </style>

          </head>

          <body>

          <canvas id="canvas" height="750" width="750"></canvas>

          <script>

          var canvas=document.querySelector("#canvas");

          // 加載ts文件

          var player=new JSMpeg.Player("./out.ts", {

          canvas: canvas,

          loop: true, // 循環播放

          autoplay: true, // 自動播放

          audio: false, // 禁用音頻

          });

          player.play();

          </script>

          </body>

          </html>

          其他問題

          • 移動端自動全屏播放視頻
          <video webkit-playsinline="webkit-playsinline" playsinline></video>

          如果你對音視頻開發感興趣,覺得文章對您有幫助,別忘了點贊、收藏哦!或者對本文的一些闡述有自己的看法,有任何問題,歡迎在下方評論區討論!


          主站蜘蛛池模板: 麻豆精品一区二区综合av| 中文字幕乱码人妻一区二区三区| 一区二区视频在线| 久久一区二区三区精品| 国产香蕉一区二区在线网站| 日韩av片无码一区二区不卡电影 | 国产精品成人国产乱一区| 精品国产日韩亚洲一区| 亚洲视频在线观看一区| 日韩精品中文字幕视频一区| 中文字幕在线观看一区二区三区| 一区二区三区观看免费中文视频在线播放 | 午夜DV内射一区二区| 中文精品一区二区三区四区 | 久久精品国产第一区二区三区| 亚洲av成人一区二区三区在线播放| 精品福利一区3d动漫| 国产精品毛片VA一区二区三区| 亚洲一区二区三区高清在线观看| av在线亚洲欧洲日产一区二区| 日韩精品一区二区亚洲AV观看 | 久久福利一区二区| 国产一区美女视频| 人妻体体内射精一区二区| 国产传媒一区二区三区呀| 亚洲国产精品一区二区成人片国内| 在线观看中文字幕一区| 骚片AV蜜桃精品一区| 亚洲av区一区二区三| 在线观看一区二区三区av| 成人免费av一区二区三区| 无码少妇一区二区浪潮免费| 国精产品一区二区三区糖心| 爱爱帝国亚洲一区二区三区| 一区二区三区四区精品视频| 一区二区三区四区无限乱码| 亚洲视频免费一区| 亚洲色精品aⅴ一区区三区| 精品视频在线观看一区二区| 大香伊人久久精品一区二区| 久久精品动漫一区二区三区|