用 Intersection Observer API 實現更簡單、性能更好的無限滾動
介紹
當我們的列表頁面有很多數據,比如200條,但是因為請求速度很慢,我們不能一次請求所有的數據,就會導致體驗很差。一般我們會對數據進行分頁,每個分頁可能包含10個條目。我們只會加載前 10 個項目,當需要瀏覽更多項目時,將加載接下來的 10 個項目。
在移動頁面上,無限滾動是一種非常常見的分頁方式。因為傳統的分頁模式,更多的數據只有在用戶點擊之后才會加載。無限滾動允許用戶在滾動到頁面底部時自動加載更多內容,無需任何額外操作,體驗更好。
如何實施
我們將分兩步實現無限滾動:
使用 JavaScript 生成列表
首先,我們生成一個空白列表頁面,然后通過 JavaScript 的 setTimeout 模擬請求來加載數據,最后將數據渲染到頁面中。
<!DOCTYPE html>
<html lang="en">
<head>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>List</title>
</head>
<body>
<ol class="list"></ol>
<style>
li {
background-color: rgba(70,87,255,.08);
width: 100%;
margin-bottom: 20px;
padding: 20px 0;
cursor: pointer;
}
li:hover {
background-color: rgba(70,87,255,.2);
}
</style>
<script>
const $list=document.querySelector('.list');
// Simulate a request to load data and render it to the list element;
function loadItems(number) {
new Promise((resolve)=> {
setTimeout(()=> {
resolve(Array(number).fill('A List Item'));
}, 1000);
}).then(data=> {
const html=data.map(item=> `<li>${item}</li>`);
$list.innerHTML +=html.join('');
})
}
loadItems(10);
</script>
</body>
</html>
使用 Intersection Observer API 加載更多
Intersection Observer API 可以觀察一個元素是否可見,所以在使用它完成無限滾動時,需要在列表底部添加一個元素。 當元素可見時,加載更多內容。
在 ol 旁邊添加一個 div 元素:
<ol class="list"></ol>
<div class="more">loading</div>
然后使用 Intersection Observer API 觀察元素,當元素可見時加載 next10 項:
const intersectionObserver=new IntersectionObserver(entries=> {
if (entries[0].intersectionRatio <=0) return;
// load more content;
loadItems(10);
});
// start observing
intersectionObserver.observe(document.querySelector(".more"));
使用 Intersection Observer API 進行無限滾動就是這么簡單。 但是,在這個實現中會有一個小的經驗問題。 只有當用戶看到 loading... 元素時,才會加載數據。 如果在用戶從頁面底部滾動一點時加載數據,那將是完美的。
我們可以通過添加一個占位符元素來優化它,使觀察者提前執行。
<ol class="list"></ol>
<div class="more">
<p class="virtual"></p> // and a placeholder element
loading ...
</div>
添加一些樣式,保證占位符元素不影響列表的顯示:
.virtual {
position: absolute;
height: 200px;
top: -200px;
width: 100%;
pointer-event:none;
}
結論
無限滾動也可以通過監聽滾動事件來完成,但我們必須不斷計算滾動位置。 使用 Intersection Observer API 時,只需要提供一個回調函數,當目標元素進入視口時,會自動執行,不僅簡單,而且性能更好。
關注七爪網,獲取更多APP/小程序/網站源碼資源!
大網站常用的頁面加載動畫
一、使用場景
經常見到某些網站的動畫是在屏幕顯示到當前元素的時候,會有個過渡動畫。
頁面在向下滾動的時候,有些元素會產生細小的動畫效果。雖然動畫比較小,但卻能吸引你的注意
使用wow.js和Animate.css,實現各大網站常用的頁面加載動畫
1.wow.js
實現了在網頁滾動時的動畫效果,有漂亮的動畫效果,依賴于Animate.css。
2.Animate.css
非常優秀的CSS3動畫庫,不依賴于jQuery,純CSS動畫
二、使用方法
1,下載文件
animate.css 下載地址: 網址前綴+daneden.github.io/animate.css/
wow.min.js 下載地址: 網址前綴+www.downyi.com/downinfo/37040.html#address
2,引入文件
<link rel="stylesheet" href="css/animate.css" rel="external nofollow" >
<script src="js/wow.min.js"></script>
3、HTML
<div class="wow slideInLeft"></div>
<div class="wow slideInRight"></div>
可以加入 data-wow-duration(動畫持續時間)和 data-wow-delay(動畫延遲時間)
屬性,如:
<div class="wow slideInLeft" data-wow-duration="2s" data-wow-delay="5s"></div>
<div class="wow slideInRight" data-wow-offset="10" data-wow-iteration="10"></div>
4、JavaScript
new WOW().init();
要自定義配置,可如下使用:
var wow=new WOW({
boxClass: 'wow',
animateClass: 'animated',
offset: 0,
mobile: true,
live: true
});
wow.init();
三、兼容性
四、配置屬性
Selenium提供了多種方法來實現瀏覽器滾動效果,下面介紹幾種常見的方法:
from selenium import webdriver
driver=webdriver.Chrome()
# 滾動到頁面底部
driver.execute_script("window.scrollTo(0, document.body.scrollHeight)")
# 滾動到指定位置
driver.execute_script("window.scrollTo(0, 100)")
from selenium import webdriver
driver=webdriver.Chrome()
# 向下滾動100像素
driver.scrollBy(0, 100)
# 向上滾動100像素
driver.scrollBy(0, -100)
from selenium import webdriver
driver=webdriver.Chrome()
# 滾動到元素可見
element=driver.find_element_by_id("my_element")
driver.scrollTo(element)
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
driver=webdriver.Chrome()
# 滾動到頁面底部
actions=ActionChains(driver)
actions.move_to_element(driver.find_element_by_tag_name("body")).perform()
注意事項:
其他方法:
相關鏈接:
*請認真填寫需求信息,我們會在24小時內與您取得聯系。