Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537
類
按照我的個(gè)人理解,滾動(dòng)分全局滾動(dòng)(瀏覽器窗口)跟局部滾動(dòng)(自定義的盒子),以下內(nèi)容絕大部分都是指全局滾動(dòng),局部滾動(dòng)的話獲取指定的DOM再調(diào)用相應(yīng)的API即可?
如何設(shè)置全局滾動(dòng)條高度
window.scrollTo(0, 0); // or window.scrollTo({ left: 0, top: 100 }); 復(fù)制代碼
window.scrollBy(0, 0); // or window.scrollBy({ left: 0, top: 100 }); 復(fù)制代碼
document.scrollingElement.scrollTop=100; 復(fù)制代碼
注意:scrollTo跟scrollBy的參數(shù)是一樣的,區(qū)別就是scrollBy滾動(dòng)距離是相對(duì)與當(dāng)前滾動(dòng)條位置進(jìn)行滾動(dòng)?
效果對(duì)比如下:
很明顯,前者就是把滾動(dòng)高度設(shè)置成100,而后者是每次都增加100,這就是為什么稱之為相對(duì)滾動(dòng)了?
如何指定一個(gè)元素顯示在視窗
// 獲取元素的offsetTop(元素距離文檔頂部的距離) let offsetTop=document.querySelector(".box").offsetTop; // 設(shè)置滾動(dòng)條的高度 window.scrollTo(0, offsetTop); 復(fù)制代碼
效果如下:
<a href="#box">盒子出現(xiàn)在頂部</a> <div id="box"></div> 復(fù)制代碼
效果如下:
document.querySelector(".box").scrollIntoView(); 復(fù)制代碼
效果如下:
還可以指定元素的出現(xiàn)位置:
// start出現(xiàn)在視口頂部、center出現(xiàn)在視口中央、end出現(xiàn)在視口底部 document.querySelector(".box").scrollIntoView({ block: "start" || "center" || "end" }); 復(fù)制代碼
效果如下:
如何設(shè)置滾動(dòng)具有平滑的過(guò)渡效果
window.scrollTo({ behavior: "smooth" }); window.scrollBy({ behavior: "smooth" }); document.querySelector(".box").scrollIntoView({ behavior: "smooth" }); 復(fù)制代碼
效果如下:
html { scroll-behavior: smooth; // 全局滾動(dòng)具有平滑效果 } // 或者所有 * { scroll-behavior: smooth; } 復(fù)制代碼
效果如下:
注意:設(shè)置了該屬性之后,所有方法都可以不用設(shè)置behavior參數(shù)了,二選一即可,因?yàn)槎际强刂飘?dāng)前指定元素的滾動(dòng)行為,所以錨點(diǎn)跳轉(zhuǎn)、設(shè)置scrollTop也具有平滑(smooth)的滾動(dòng)行為?
一些有趣的東西
1. scrollingElement
該對(duì)象可以非常兼容地獲取scrollTop、scrollHeight等屬性,在移動(dòng)端跟PC端都屢試不爽
還記得當(dāng)初寫(xiě)這個(gè)兼容性方法:
let scrollHeight=document.documentElement.scrollHeight || document.body.scrollHeight; 復(fù)制代碼
現(xiàn)在你只需要:
let scrollHeight=document.scrollingElement.scrollHeight; 復(fù)制代碼
因?yàn)樵贛DN中是這樣介紹它的:
標(biāo)準(zhǔn)模式返回documentElement,怪異模式返回body;
2. 滾動(dòng)到底部
window.scrollTo({ left: 0, top: document.scrollingElement.scrollHeight }); // 如果你實(shí)在是懶的話... window.scrollTo(0, 999999); 復(fù)制代碼
注意:平滑滾動(dòng)到頂部或者底部自己加參數(shù)或者屬性即可?
3. 判斷瀏覽器已滾動(dòng)到底部
window.addEventListener("scroll", ()=> { let { scrollTop, scrollHeight, clientHeight }=document.scrollingElement; // 當(dāng)前滾動(dòng)高度 + 視口高度 >=文檔總高度 if (scrollTop + clientHeight >=scrollHeight) { console.log("已到達(dá)底部"); } }); 復(fù)制代碼
效果如下:
函數(shù)節(jié)流
當(dāng)你沒(méi)加函數(shù)節(jié)流:
window.addEventListener("scroll", ()=> console.log("我在滾我在滾!")); 復(fù)制代碼
效果如下:
當(dāng)你加了函數(shù)節(jié)流之后:
window.addEventListener("scroll", throttle(()=> console.log("我在滾我在滾!"))); 復(fù)制代碼
效果如下:
throttle源碼:
function throttle(fn, interval=500) { let run=true; return function () { if (!run) return; run=false; setTimeout(()=> { fn.apply(this, arguments); run=true; }, interval); }; } 復(fù)制代碼
用處:減少代碼執(zhí)行頻率?
函數(shù)防抖
當(dāng)你加了函數(shù)防抖之后:
window.addEventListener("scroll", debounce(()=> console.log("滾動(dòng)結(jié)束!"))); 復(fù)制代碼
效果如下:
debounce源碼:
function debounce(fn, interval=500) { let timeout=null; return function () { clearTimeout(timeout); timeout=setTimeout(()=> { fn.apply(this, arguments); }, interval); }; } 復(fù)制代碼
用處:判斷某個(gè)動(dòng)作結(jié)束,如剛剛的滾動(dòng)結(jié)束、input輸入結(jié)束等?
解決IOS設(shè)備局部滾動(dòng)不順暢(粘手)
除了瀏覽器原生滾動(dòng),自定義的滾動(dòng)條都會(huì)出現(xiàn)這種情況,加以下屬性就可以解決:
.box { -webkit-overflow-scrolling: touch; } 復(fù)制代碼
對(duì)比如下:
注意:要真機(jī)才能看到效果,這里指的局部滾動(dòng)是指自己定義的盒子,然后設(shè)置overflow: auto || scroll;后的滾動(dòng)行為;
滾動(dòng)傳播
指有多個(gè)滾動(dòng)區(qū)域,當(dāng)一個(gè)滾動(dòng)區(qū)域滾動(dòng)完之后,繼續(xù)滾動(dòng)會(huì)傳播到到父區(qū)域繼續(xù)滾動(dòng)的行為:
.box { overscroll-behavior: contain; // 阻止?jié)L動(dòng)傳播 } 復(fù)制代碼
對(duì)比效果圖如下:
橫向滾動(dòng)
移動(dòng)端遇到此需求比較多,常用于圖片展示:
<ul> <li> <img src=""> </li> // ... </ul> ul { white-space: nowrap; // 超出不換行 overflow-x: auto; li { display: inline-block; img { display: block; width: 200px; } } } 復(fù)制代碼
效果如下:
滾動(dòng)結(jié)束后,強(qiáng)制滾動(dòng)到指定元素
基于上面的例子,我們?cè)O(shè)置如下屬性:
ul { scroll-snap-type: x mandatory; li { scroll-snap-align: start; } } 復(fù)制代碼
效果如下:
仔細(xì)看會(huì)發(fā)現(xiàn),我們松手的時(shí)候,會(huì)將最近的元素滾動(dòng)到最右邊(初始位置,對(duì)于Y軸來(lái)講就是頂部,X軸則是右邊)
也可以設(shè)置出現(xiàn)在中間:
li { scroll-snap-align: center; } 復(fù)制代碼
效果如下:
這樣,一個(gè)簡(jiǎn)易的輪播圖效果就出來(lái)啦!
還可以實(shí)現(xiàn)全屏滾動(dòng):
注意:該屬性會(huì)在你滾動(dòng)完之后再做處理,也就是說(shuō)你可以一下子從圖片1跳到圖片9?
最后
以上涉及到的方法或?qū)傩晕臋n如下:
如果你覺(jué)得這篇文章不錯(cuò),請(qǐng)別忘記點(diǎn)個(gè)贊跟關(guān)注哦~
么是全屏布局
全屏布局就是指 HTML 頁(yè)面鋪滿整個(gè)瀏覽器窗口, 并且沒(méi)有滾動(dòng)條。而且還可以跟隨瀏覽器的大小變化而變化。
能是出于節(jié)省用戶流量,許多移動(dòng)端瀏覽器都不支持H5自動(dòng)播放視頻,必須在用戶主動(dòng)交互(點(diǎn)擊或者滑動(dòng)等)后才可以通過(guò)js播放視頻
PC端可以通過(guò)設(shè)置muted,自動(dòng)播放靜音視頻
安卓瀏覽器均不支持自動(dòng)播放,實(shí)測(cè)在微信內(nèi)置瀏覽器,滑動(dòng)視為交互行為,可以在這之后播放視頻,抖音內(nèi)置瀏覽器則需要點(diǎn)擊交互,鴻蒙系統(tǒng)瀏覽器可以自動(dòng)播放靜音視頻
進(jìn)入網(wǎng)站時(shí)彈窗,例如歡迎語(yǔ)等,用戶點(diǎn)擊關(guān)閉后執(zhí)行視頻播放
簡(jiǎn)單粗暴的方法,在某些場(chǎng)景時(shí)適用的,實(shí)測(cè)在安卓、鴻蒙、IOS、抖音瀏覽器等均可以用這個(gè)方法解決
close() {
const videos=document.querySelectorAll('video');
for (let i=0; i < videos.length; i++) {
const element=videos[i];
element.play();
}
}
【更多音視頻學(xué)習(xí)資料,點(diǎn)擊下方鏈接免費(fèi)領(lǐng)取↓↓,先碼住不迷路~】
點(diǎn)擊領(lǐng)取→音視頻開(kāi)發(fā)基礎(chǔ)知識(shí)和資料包
將視頻轉(zhuǎn)成ts格式,通過(guò)jsmpeg解碼器進(jìn)行加載播放,可以實(shí)現(xiàn)自動(dòng)播放,實(shí)測(cè)基本上可以解決所有移動(dòng)端無(wú)法播放視頻的問(wèn)題
轉(zhuǎn)ts
安裝ffmpeg,輸入命令將mp4轉(zhuǎn)成ts
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, // 循環(huán)播放
autoplay: true, // 自動(dòng)播放
audio: false, // 禁用音頻
});
player.play();
</script>
</body>
</html>
<video webkit-playsinline="webkit-playsinline" playsinline></video>
如果你對(duì)音視頻開(kāi)發(fā)感興趣,覺(jué)得文章對(duì)您有幫助,別忘了點(diǎn)贊、收藏哦!或者對(duì)本文的一些闡述有自己的看法,有任何問(wèn)題,歡迎在下方評(píng)論區(qū)討論!
*請(qǐng)認(rèn)真填寫(xiě)需求信息,我們會(huì)在24小時(shí)內(nèi)與您取得聯(lián)系。