JavaScript實(shí)現(xiàn)平滑滾動(dòng)效果
● 本次我們將實(shí)現(xiàn)點(diǎn)擊按鈕時(shí)候,可以平滑得滾動(dòng)到指定位置

● 首先我們獲取到按鈕信息和想要滾動(dòng)到得章節(jié)
const btnScrollTo = document.querySelector('.btn--scroll-to');
const section1 = document.querySelector('#section--1');● 下一步就是添加點(diǎn)擊事件了
btnScrollTo.addEventListener('click', function (e) {
const slcoords = section1.getBoundingClientRect();
});
getBoundingClientRect()是一個(gè)JavaScript方法,用于獲取一個(gè)元素相對(duì)于視口的位置和尺寸。它返回一個(gè)DOMRect對(duì)象,包含了元素的top、right、bottom、left、width、height等屬性。
btnScrollTo.addEventListener('click', function (e) {
const slcoords = section1.getBoundingClientRect();
console.log(slcoords);
});

btnScrollTo.addEventListener('click', function (e) {
const slcoords = section1.getBoundingClientRect();
console.log(slcoords);
console.log(e.target.getBoundingClientRect());
});
//通過調(diào)用e.target.getBoundingClientRect(),你可以獲取觸發(fā)點(diǎn)擊事件的元素相對(duì)于視口的位置和尺寸信息。
● 我們也可以獲得當(dāng)前滾動(dòng)位置的 X 軸和 Y 軸坐標(biāo)
const btnScrollTo = document.querySelector('.btn--scroll-to');
const section1 = document.querySelector('#section--1');
btnScrollTo.addEventListener('click', function (e) {
const slcoords = section1.getBoundingClientRect();
console.log(slcoords);
console.log(e.target.getBoundingClientRect());
console.log('Current scrll (X/Y)', window.scrollX, window.screenY);
});
● 我們也可以輸出輸出視口(viewport)的高度和寬度,也就是可見視口的高度
console.log(
'height/width viewport',
document.documentElement.clientHeight,
document.documentElement.clientWidth
);
● 現(xiàn)在就簡(jiǎn)單了,我們只需要點(diǎn)擊按鈕的時(shí)候更改一下我們想要的章節(jié)坐標(biāo)即可
const btnScrollTo = document.querySelector('.btn--scroll-to');
const section1 = document.querySelector('#section--1');
btnScrollTo.addEventListener('click', function (e) {
const slcoords = section1.getBoundingClientRect();
// console.log(slcoords);
// console.log(e.target.getBoundingClientRect());
// console.log('Current scrll (X/Y)', window.scrollX, window.screenY);
// console.log(
// 'height/width viewport',
// document.documentElement.clientHeight,
// document.documentElement.clientWidth
// );
window.scrollTo(slcoords.left, slcoords.top);
});
● 現(xiàn)在確實(shí)可以跳轉(zhuǎn)了,但是細(xì)心的小伙伴會(huì)發(fā)現(xiàn),這個(gè)必須在頂部才能正常跳轉(zhuǎn),往下面滑動(dòng)一點(diǎn)就不行了,因?yàn)轫撁婊瑒?dòng)就會(huì)章節(jié)的到頂部的X軸就會(huì)變動(dòng),我們必須加上滑動(dòng)的距離才可以
const btnScrollTo = document.querySelector('.btn--scroll-to');
const section1 = document.querySelector('#section--1');
btnScrollTo.addEventListener('click', function (e) {
const slcoords = section1.getBoundingClientRect();
// console.log(slcoords);
// console.log(e.target.getBoundingClientRect());
// console.log('Current scrll (X/Y)', window.scrollX, window.screenY);
// console.log(
// 'height/width viewport',
// document.documentElement.clientHeight,
// document.documentElement.clientWidth
// );
window.scrollTo(
slcoords.left + window.scrollX,
slcoords.top + window.scrollY
);
});
● 現(xiàn)在在任何視口都可以跳轉(zhuǎn)了,但是跳轉(zhuǎn)有點(diǎn)生硬,我們要給他這是平滑滾動(dòng)
const btnScrollTo = document.querySelector('.btn--scroll-to');
const section1 = document.querySelector('#section--1');
btnScrollTo.addEventListener('click', function (e) {
const slcoords = section1.getBoundingClientRect();
// console.log(slcoords);
// console.log(e.target.getBoundingClientRect());
// console.log('Current scrll (X/Y)', window.scrollX, window.screenY);
// console.log(
// 'height/width viewport',
// document.documentElement.clientHeight,
// document.documentElement.clientWidth
// );
// window.scrollTo(
// slcoords.left + window.scrollX,
// slcoords.top + window.scrollY
// );
window.scrollTo({
left: slcoords.left + window.scrollX,
top: slcoords.top + window.scrollY,
behavior: 'smooth',
});
});
現(xiàn)在可以實(shí)現(xiàn)平滑滾動(dòng)了,但是上述的操作都是比較老的操作方法了,對(duì)于現(xiàn)代瀏覽器,我們有更加現(xiàn)代的方法去實(shí)現(xiàn)平滑滾動(dòng);
const btnScrollTo = document.querySelector('.btn--scroll-to');
const section1 = document.querySelector('#section--1');
btnScrollTo.addEventListener('click', function (e) {
const slcoords = section1.getBoundingClientRect();
section1.scrollIntoView({ behavior: 'smooth' });
});
這樣就可以更加現(xiàn)代化的實(shí)現(xiàn)平滑滾動(dòng)了,但是可能會(huì)存在老的瀏覽器不兼容的問題,但是現(xiàn)代化的實(shí)現(xiàn)方法的邏輯也是按照我們上面的步驟來執(zhí)行的!
以上就是JavaScript實(shí)現(xiàn)平滑滾動(dòng)效果的詳細(xì)內(nèi)容,更多關(guān)于JavaScript平滑滾動(dòng)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
一文詳解JavaScript中如何阻止元素的默認(rèn)行為
在網(wǎng)頁開發(fā)中,許多用戶操作會(huì)觸發(fā)瀏覽器的默認(rèn)行為,例如,當(dāng)用戶點(diǎn)擊一個(gè)超鏈接時(shí),瀏覽器會(huì)導(dǎo)航到鏈接的目標(biāo)頁面,為了提升用戶體驗(yàn)或控制頁面行為,我們通常需要阻止這些默認(rèn)行為,所以本文我們將探討如何在JavaScript中阻止元素的默認(rèn)行為,需要的朋友可以參考下2025-06-06
Chart.js與ECharts.js圖表使用過程組件對(duì)比
chartjs只能基于canvas,雖然只有英文文檔,但定制化程度更高,社區(qū)成熟,功能就更加穩(wěn)定,ECharts.js可以基于svg或者canvas去渲染,有融合主流前端框架的社區(qū)庫(kù),另外ECharts.js還支持3d效果的圖表,相當(dāng)炫酷,國(guó)內(nèi)開發(fā)者大多數(shù)使用這個(gè),有中文文檔2023-10-10
webpack實(shí)踐之DLLPlugin 和 DLLReferencePlugin的使用教程
這篇文章主要介紹了webpack實(shí)踐之DLLPlugin 和 DLLReferencePlugin的使用教程,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值 ,需要的朋友可以參考下2019-06-06
javascript中call apply 的應(yīng)用場(chǎng)景
call, apply都屬于Function.prototype的一個(gè)方法,它是JavaScript引擎內(nèi)在實(shí)現(xiàn)的,因?yàn)閷儆贔unction.prototype,所以每個(gè)Function對(duì)象實(shí)例,也就是每個(gè)方法都有call, apply屬性.2015-04-04
javascript設(shè)置連續(xù)兩次點(diǎn)擊按鈕時(shí)間間隔的方法
這篇文章主要介紹了javascript設(shè)置連續(xù)兩次點(diǎn)擊按鈕時(shí)間間隔的方法,是非常實(shí)用的技巧,需要的朋友可以參考下2014-10-10

