原生js实现平滑滚动

原生js实现平滑滚动

今天上班遇到一个问题,点击某个按钮,将某个div里面含有id的某个元素滚动到视野中央,大概距离视口顶部100px位置。思索良久,没搞出来,今晚回来好生研究,思路如下。

首先了解下关于元素以及浏览器窗口各种尺寸含义

一张图搞清楚 html 定位:ClientHeight,scrollWidth

本教程只需要用到一下几个尺寸

名称含义
offsetTop当前元素距离文档顶部的偏移距离
scrollTop文档在视口中滚动的距离
clientHeight视口的高度

再列出一张草图

[外链图片转存失败(img-Gxdy4aOl-1563378643916)(C:\Users\Administrator\Desktop\无标题.png)]

从图中分析我们可以得知:

元素临界点(元素上边界贴在视口上边界):offsetTop = scrollTop

元素临界点(元素上边界贴在视口下边界):offsetTop = scrollTop + clientHeight

由此可见只要 offsetTop - scrollTop > 0 && offsetTop - scrollTop < clientHeight ,就可以保证元素在视口区域内。

// html
    <button id="btn">点击出现</button>
    <div id="d1">
        <div id="d2">
            <p id="d3">前端开发精髓</p>
        </div>
    </div>
  
// js
    let d1 = document.getElementById('d1')
    let d2 = document.getElementById('d2')
    let d3 = document.getElementById('d3')

    let clientHeight = d1.clientHeight
    console.log('clientHeight', clientHeight)
    console.log('offsetTop', d3.offsetTop)

    d1.onscroll = () => {
        let clientHeight = d1.clientHeight
        let scrollTop = d1.scrollTop
        let offsetTop = d3.offsetTop

        let into = offsetTop - scrollTop > 0 && offsetTop - scrollTop < clientHeight
        if (into) {
        	console.log('我在可视区域内')
        }
    }

我们要实现的功能是点击按钮将带id的元素滚动到视野中央距离顶部100px

// 这种可以平滑滚动到视野中央,但是不是距离顶部100px
let btn = document.getElementById('btn')
btn.onclick = () => {
    // 方法一: 使用 scrollIntoView()
        d3.scrollIntoView({
        behavior: 'smooth',
        block: 'center'
    })
}
// 原生JS, 说实话实现
let btn = document.getElementById('btn')
    btn.onclick = () => {
      let scroll = 100
      let offsetTop = d3.offsetTop
      let clientHeight = d1.clientHeight
      // 总长度
      let scrollLength = offsetTop - 100
      // 总花费200ms
      let time = 200
      let step = scrollLength / time
      let interval = setInterval(() => {
        if (d1.scrollTop >= scrollLength) {
          clearInterval(interval)
        }
        d1.scrollTop += step
      }, 1);
    }
// 很显然,滑动过程很慢,总话费市场并不只有200ms,我知道总时长,但是我无法用定时器实现200ms滑动了scrollLength,所以我又采用了jquery的animate函数

// 使用了jquery
$('#btn').click(function(){
    let scroll = 100
    let offsetTop = $('#d3').offsetTop
    let clientHeight = $('#d1').clientHeight
	// 总长度
    let scrollLength = offsetTop - 100
    // 总花费200ms
    let time = 200
    let step = scrollLength / time
	$('#d1').animate({scrollTop: scrollLength },200)
})
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用原生 JavaScript 和 CSS 实现页面底部图片不间断向左滚动展示。具体实现步骤如下: 1. 首先,在 HTML 中添加一个容器元素,用于包含需要滚动的图片。例如: ```html <div id="scroll-container"> <img src="image1.jpg"> <img src="image2.jpg"> <img src="image3.jpg"> <!-- 添加更多图片... --> </div> ``` 2. 使用 CSS 将容器元素设置为横向滚动,并隐藏滚动条。例如: ```css #scroll-container { overflow-x: scroll; overflow-y: hidden; white-space: nowrap; /* 让所有图片在一行上 */ -webkit-overflow-scrolling: touch; /* 支持触摸屏的平滑滚动 */ } ``` 3. 使用 JavaScript 自动滚动图片。首先,获取容器元素和所有图片元素: ```javascript var container = document.getElementById('scroll-container'); var images = container.getElementsByTagName('img'); ``` 然后,设置一个计时器,每隔一定时间滚动一定距离(图片的宽度加上一定的间距),直到滚动到最后一张图片时,重新开始滚动。 ```javascript var scrollDistance = images[0].offsetWidth + 10; // 每次滚动距离(图片宽度 + 10 像素间距) var currentPosition = 0; // 当前滚动位置 setInterval(function() { currentPosition += scrollDistance; if (currentPosition >= container.scrollWidth) { // 到达最后一张图片时,重新开始滚动 currentPosition = 0; } container.scrollLeft = currentPosition; }, 3000); // 每隔 3 秒滚动一次 ``` 完整的代码示例如下: ```html <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>图片滚动展示</title> <style> #scroll-container { overflow-x: scroll; overflow-y: hidden; white-space: nowrap; -webkit-overflow-scrolling: touch; } img { margin-right: 10px; } </style> </head> <body> <div id="scroll-container"> <img src="image1.jpg"> <img src="image2.jpg"> <img src="image3.jpg"> <!-- 添加更多图片... --> </div> <script> var container = document.getElementById('scroll-container'); var images = container.getElementsByTagName('img'); var scrollDistance = images[0].offsetWidth + 10; var currentPosition = 0; setInterval(function() { currentPosition += scrollDistance; if (currentPosition >= container.scrollWidth) { currentPosition = 0; } container.scrollLeft = currentPosition; }, 3000); </script> </body> </html> ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值