使用scrollTo/scrollTop让页面元素滚动到指定位置, 并设置滚动动画

文章介绍了滚动距离的概念,特别是在存在滚动条的容器中如何读取和设置滚动位置。通过示例代码展示了如何使用scrollTop属性直接设置滚动位置,以及使用scrollTo方法实现平滑滚动,强调了scrollTo方法在需要过渡动画时的优势。同时,提到了scrollTo方法的两种用法及其兼容性问题。


前言

当容器有滚动条时,有时需要点击 试图节点 将页面滚动到指定元素位置


什么是滚动距离

比如父元素设置了overflow: hidden; ,当元素里的内容超过元素本身的高度时, 就会出现滚动条, 那么鼠标滑动的距离就是其滚动距离.

在这里插入图片描述

读取滚动距离

<head>
    <title>test</title>
    <style>
        ul {
            width: 200px;
            height: 200px;
            background-color: #eee;
            overflow: auto;
            transition: all 1s linear;
            margin-top: 200px;
        }
        li {
            height: 300px; 
            background-color: skyblue;
            list-style-type:none;
        }
    </style>
</head>
-------------------------------------↓ 结构 ↓-------------------------------------------------------
<ul id="outer">
    <li id="insider">
		1111111111111111
		2222222222222222
		3333333333333333
		4444444444444444
		5555555555555555
		6666666666666666
    </li>
</ul>

<button onclick="set()">set</button>
--------------------------------------↓ js ↓-----------------------------------------------------
const outEle = document.getElementById('outer');
const insideEle = document.getElementById('insider');

//onscroll事件的处理函数
 outEle.onscroll = function readScrollTop() {
     console.log('scrollTop:', outEle.scrollTop); // 可以清楚的看到滚动的距离
 }

如何设置滚动

scrollTop属性

scrollTop就是指 “元素中的内容” 超出 “元素上边界” 的那部分的高度。
直接给父元素的scrollTop赋值:

function set() {
    outEle.scrollTop = 100;
}

这种方法比较直接, 但是因为是直接设置的dom元素的js属性 而不是css属性, 所以想通过这种方法设置过渡动画是没有效果的(transition: all 1s linear; 无效)

补充: 有时会出现设置scrollTop无效 一直为0的情况, 出现这种现象的原因之一就是内容已经到底了, 在滑滑不上去了…


scrollTo方法

scrollTo()方法可以使界面滚动到给定元素的指定坐标位置。
有两种用法:

方法一: element.scrollTo(x-coord, y-coord)

  • x-coord 是期望滚动到位置水平轴上距元素左上角的像素。
  • y-coord 是期望滚动到位置竖直轴上距元素左上角的像素。

方法二: element.scrollTo(options)

  • options是一个对象:
  • left (number类型)
  • top(number类型)
  • behavior: ‘smooth’ (平滑过渡效果)

    参数如下:
    "auto"默认
    "instant"直接滚动
    "smooth"; 平滑滚动

scrollTo()的两种方式我们都试试:

function set() {
	// 方式一:
    outEle.scrollTo(0, 100)

	// 方式二:
	outEle.scrollTo({top: 100, behavior: 'smooth'})
}

总结

最后, 大家会发现 都产生了效果, 但是方式一没有过度效果, 方式二产生了过度效果, 所以如果对过渡动画有要求的话, 推荐使用第二种方式~!

当然, 需要注意的是: options这种对象的写法 有兼容性方便的限制:
在这里插入图片描述

<think> 根据用户需求,用户想要实现横向滚动指定位置,但引用的内容中主要讨论的是垂直滚动scrollTop)。实际上,横向滚动使用scrollLeft属性。不过,用户可能误将横向滚动说成了scrolltop,因为通常scrollTop用于垂直滚动。 在提供的引用中,引用[2]提到“scrollTop就是指 ‘元素中的内容’ 超出 ‘元素上边界’ 的那部分的高度”,这明确是垂直滚动。对于横向滚动,我们使用scrollLeft,它表示内容超出元素左边界的那部分宽度。 因此,我们需要纠正用户的术语:横向滚动使用scrollLeft。但用户的问题中明确提到“scrolltop()方法实现横向滚动”,这可能是因为用户对术语不熟悉。所以,在回答中需要解释清楚,给出横向滚动的正确方法。 实现横向滚动指定位置的方法与垂直滚动类似,只需将操作scrollTop改为操作scrollLeft即可。同样可以使用直接赋值或动画(animate)方式。 具体步骤: 1. 确定要滚动的容器(如div)。 2. 获取目标元素在容器内的水平位置(相对于容器左边界)。 3. 设置容器的scrollLeft为相应的值。 使用jQuery的animate方法实现平滑滚动的示例: 假设我们有一个水平滚动的容器,其id为`horizontal-container`,我们想让容器滚动到id为`target-element`的元素的位置。 ```javascript // 使用jQuery var container = $('#horizontal-container'); var target = $('#target-element'); // 计算目标元素相对于容器的水平偏移量 var position = target.position(); var targetLeft = position.left; // 使用动画滚动指定位置 container.animate({ scrollLeft: targetLeft }, 500); // 500毫秒的动画时间 ``` 如果使用原生JavaScript,可以这样: ```javascript var container = document.getElementById('horizontal-container'); var target = document.getElementById('target-element'); // 获取目标元素相对于容器的偏移量 var targetLeft = target.offsetLeft; // 直接设置scrollLeft container.scrollLeft = targetLeft; // 或者使用平滑滚动使用scrollTo方法,指定behavior为smooth) container.scrollTo({ left: targetLeft, behavior: 'smooth' }); ``` 注意:使用原生JavaScriptscrollTo方法可以实现平滑滚动,但需要注意浏览器兼容性(IE不支持behavior选项)。 另外,引用[5]中有一个使用animate方法进行滚动的例子,但它是垂直滚动的。我们只需将其中的scrollTop改为scrollLeft即可用于横向滚动。 总结回答: 1. 澄清scrollTop用于垂直滚动,横向滚动使用scrollLeft。 2. 提供jQuery和原生JavaScript两种实现方式。 3. 演示如何计算滚动位置。 4. 提供平滑滚动和直接设置两种方式。 最后,根据用户要求,生成相关问题。 </think>### 使用 scrollLeft 实现横向滚动指定位置的方法 根据您的需求,实现横向滚动使用 **scrollLeft** 属性而非 scrollTop(后者用于垂直滚动)。以下是具体实现方法: #### 1. 原生 JavaScript 实现(直接设置) ```javascript // 获取容器元素 const container = document.getElementById('horizontal-container'); // 设置横向滚动位置(单位:像素) container.scrollLeft = 300; // 滚动到300px位置 // 平滑滚动动画 container.scrollTo({ left: 300, // 目标位置 behavior: 'smooth' // 启用平滑滚动 }); ``` #### 2. jQuery 实现(带动画) ```javascript // 平滑滚动指定位置 $('#horizontal-container').animate({ scrollLeft: 300 // 目标位置 }, 500); // 500ms动画时长 ``` #### 3. 滚动到特定元素位置 ```javascript const target = document.getElementById('target-element'); const container = document.getElementById('horizontal-container'); // 计算目标元素相对容器的横向偏移 const scrollPosition = target.offsetLeft - container.offsetLeft; // 执行滚动 container.scrollTo({ left: scrollPosition, behavior: 'smooth' }); ``` #### 关键概念说明: 1. **scrollLeft** 表示元素内容向左滚动的像素数(横向滚动位置) 2. **scrollTo()** 原生方法,支持通过 `{ left: 位置, behavior: 'smooth' }` 实现平滑滚动 3. **offsetLeft** 获取元素相对于父元素的左侧偏移量 #### 注意事项: - 容器需设置 `overflow-x: auto` 或 `scroll` - 确保容器宽度小于内容宽度才会出现滚动条 - 移动端需添加 `-webkit-overflow-scrolling: touch` 增强滚动体验 > 示例:横向导航菜单滚动到激活项 > ```javascript > // 点击菜单项时滚动到居中位置 > $('.menu-item').click(function() { > const $container = $('.menu-container'); > const itemPos = $(this).position().left; > const scrollPos = itemPos - ($container.width()/2 - $(this).width()/2); > > $container.animate({ scrollLeft: scrollPos }, 300); > }); > ```[^2][^5] --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

笑看、人世间@

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值