一分钟单刷Scroll 基础篇

320 阅读2分钟

1.window.scroll()方法

<button onclick="scroll(0, 100);">点击以向下滚动到第 100 个像素</button>
window.scroll({
  top: 100,
  left: 100,
  behavior: "smooth", //一般应用在与滚动相关的 CSS 属性中,缓慢滑动的动画
});

2.元素滚动事件

  • 基本认识:滚动条在滚动的时候持续触发的事件,用来监听整个页面滚动 或者某个元素滚动
    1. 监控浏览器中整个页面的滚动行为,可以将scroll事件绑定到 window上
    1. 监控某个html元素的滚动行为,将scroll实践绑定到该元素上
// ✨✨推荐
window.addEventListener('scroll', function() {
    // xxxxx
  console.log(document.documentElement) // 得到网页根元素html
  console.log(document.documentElement.scrollTop) //浏览器垂直滚动时- 获取被卷去的头部距离
  console.log(document.documentElement.scrollLeft)//浏览器水平滚动时- 获取被卷去的左侧距离
})

DOM元素.addEventListener('scroll', function() {
    // xxxxx
  DOM元素.scrollTop   //元素垂直滚动时- 获取被卷去的头部距离
  DOM元素.scrollLeft //元素水平滚动时- 获取被卷去的左侧距离
})

image.png

3.窗口尺寸

  • 在窗口尺寸改变的时候触发事件resize(可以注册一个事件进行监听)
  • clientWidth和clientHeight,获取元素的可见部分宽高(不包含border,margin,滚动条等)
  1. 获取页面大小

document.documentElement.clientWidth

document.documentElement.clientHeight

  1. 获取元素大小

dom元素.clientWidth

dom元素.clientHeight

image.png

4.元素尺寸与位置

  • 获得元素自己的【尺寸大小】和元素在【页面中的位置】

大小: offsetWidth 和 offsetHeight 位置: offsetLeft 和 offsetTop

image.png

总结:

  • window.scroll()方法可以直接去精准的定位一个位置作为可视窗口。
  • 滚动事件中,通常用的事件源是window,就是窗口右边的滑轮相关的滚动事件,场景很多,比如:当滚动到一定位置时,显示按钮回到顶部,通常用document.documentElement.scrollTop数据进行判断就可以了。
  • 使用元素位置实现网站的导航栏,下横线效果:(下划线).style.transform = translateX(${e.target.offsetLeft}px)
  • 可以通过以下代码实现一个简单的页面滚动进度条:
window.addEventListener('scroll', function() { 
let winHeight = window.innerHeight; 
let docHeight = document.documentElement.scrollHeight; 
let scrollTop = document.documentElement.scrollTop; 
let scrollPercent = (scrollTop / (docHeight - winHeight)) * 100; // 假设进度条元素的id为progressBar
let progressBar = document.getElementById('progressBar'); 
progressBar.style.width = scrollPercent + '%'; });
  • scroll事件监听器中,首先获取window.innerHeight(窗口高度)、document.documentElement.scrollHeight(文档总高度)和document.documentElement.scrollTop(滚动距离)。然后通过计算(scrollTop / (docHeight - winHeight)) * 100得到滚动的百分比。最后,将这个百分比应用到进度条元素(idprogressBar)的宽度上,从而实现随着页面滚动,进度条逐渐填充的效果。
  • 当文本内容过多时,也可以使用滚动事件根据用户看到的窗口内容,进行内容加载