js 滚动/跳转页面到指定位置

要解决两个需求:
一个是从A页面跳到B页面,滚动到页面的任何地方;
第二个是在B页面内部点击某个元素,滚动到页面的任何地方;

怎么解决啊?很简单,当然是用锚点。

首先在A页面创建一个锚点

<body>

<a href="b.html#pos" target="_blank">点击跳转</a>
<body>
然后在B页面定义这个锚点

<body>

...
这里是很多文字,把页面撑开,撑出滚动条
...
<a name="pos">滚动到这里</a>
...
再加点文字
...
</body>
好,测试,OK!点过去之后是不是“滚动到这里”出现在了浏览器的最上方。
实际的情况经常是制作人员切好的页面,产品突然说要加个功能,需要滚动到某个地方,但是那个地方是个div,并没有a锚点,
创建一个锚点的话又会占据网页的空间,影响到网页的版式,这怎么办呢?我们创建一个隐藏的锚点试试,隐藏的锚点不占用空间。

继续:如果我让B页面里的 <a name="pos">滚动到这里</a>  不显示,就是设定display:none; 那么还能滚动到这里吗? 试试

<body>

...
这里是很多文字,把页面撑开,撑出滚动条
...
<a name = "pos" style = " display : none ; " > 滚动到这里 </a>
隐藏之后滚动到这里
...
再加点文字
...
</body>
不妙,IE可以工作,火狐有点不给面子。
只能换一种思路,给锚点指定一个id能滚动到这里吗? 试试

<body>

...
这里是很多文字,把页面撑开,撑出滚动条
...
<a id = "pos" > 滚动到这里 </a>
隐藏之后滚动到这里
...
再加点文字
...
</body>
OK,成功!看来换成id是个好办法,现在把锚点换成div试试

<body>

...
这里是很多文字,把页面撑开,撑出滚动条
...
<div id = "pos" > 滚动到这里 </div>
隐藏之后滚动到这里
...
再加点文字
...
</body>
OK,成功! 这样就解决了问题,不需要插入一个<a></a>锚点,只需要给div加一个id就行了。

接下来解决第二个需求,在B页面内部点击某个元素,滚动到指定位置。
首先,在B.html顶部创建一个锚点,指向要滚动的那个div

<body>

<a href = "#pos" > 点击这里本页跳转 </a>
...
这里是很多文字,把页面撑开,撑出滚动条
...
<div id = "pos" > 滚动到这里 </div>
隐藏之后滚动到这里
...
再加点文字
...
</body>
OK,成功!那如果要点击一个button按钮滚动到指定位置呢? button按钮不能添加href, 只能曲折解决。
先建立一个隐藏的锚点,然后点击button按钮的时候加一个onclick事件,然后通过js来调用锚点的click事件,曲线救国。

<body>

<script type = "text/javascript" >
function click_scroll () {
document . getElementById ( "anchor_scroll" ). click ();
}
</script>
<input type = "button" value = "点击button跳转" onclick = " click_scroll (); " />
<a id = "anchor_scroll" href = "#pos" style = " display : none " > 点击这里本页跳转 </a>
...
这里是很多文字,把页面撑开,撑出滚动条
...
<div id = "pos" > 滚动到这里 </div>
隐藏之后滚动到这里
...
再加点文字
...
</body>
OK,成功!既然button能够成功,那其他的也就好办了,img,div都可以这么做。

还有一个方法通过jQuery的aminate动画方法也可以做,我贴出代码

<body>

<script type = "text/javascript" >
function click_scroll () {
var scroll_offset = $ ( "#pos" ). offset (); //得到pos这个div层的offset,包含两个值,top和left
$("body,html").animate({
scrollTop:scroll_offset.top //让body的scrollTop等于pos的top,就实现了滚动
}, 0 );
}
</script>
<input type = "button" value = "点击button跳转" onclick = " click_scroll (); " /> ...
这里是很多文字,把页面撑开,撑出滚动条
...
<div id = "pos" > 滚动到这里 </div>
隐藏之后滚动到这里
...
再加点文字
...
</body>
OK,成功!这个方法有个好处,就是控制滚动的速度,上面的蓝色的0就是控制速度的,0是立即的意思,那设为1000试试,
可以看到是慢慢的滚动到了pos,如果设为5000呢,就会更慢了。
为什么会这样呢?因为jQuery的animate本来就是做动画用的,更多功能可以详细研究了。

辛苦码字,如能帮到你,不胜欣慰。欢迎给博主留言。
  • 6
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
1. 页面滚动切换导航栏 HTML结构: ``` <nav> <ul> <li><a href="#section1">Section 1</a></li> <li><a href="#section2">Section 2</a></li> <li><a href="#section3">Section 3</a></li> <li><a href="#section4">Section 4</a></li> </ul> </nav> <section id="section1">Section 1</section> <section id="section2">Section 2</section> <section id="section3">Section 3</section> <section id="section4">Section 4</section> ``` CSS样式: ``` nav { position: fixed; top: 0; left: 0; width: 100%; background-color: #fff; z-index: 999; } nav ul { display: flex; justify-content: center; align-items: center; height: 50px; } nav li { margin: 0 20px; } nav a { color: #333; text-decoration: none; font-size: 16px; } nav a.active { color: #009688; border-bottom: 2px solid #009688; } section { height: 100vh; display: flex; justify-content: center; align-items: center; font-size: 32px; } ``` JS代码: ``` // 获取所有导航链接和对应的section const navLinks = document.querySelectorAll('nav a'); const sections = document.querySelectorAll('section'); // 监听页面滚动事件 window.addEventListener('scroll', () => { let currentSection = ''; // 遍历每个section,判断当前滚动位置在哪个section内 sections.forEach(section => { const sectionTop = section.offsetTop; const sectionHeight = section.clientHeight; if (pageYOffset >= sectionTop - sectionHeight / 3) { currentSection = section.getAttribute('id'); } }); // 遍历所有导航链接,给当前所在的section对应的导航链接添加active类名,其他移除 navLinks.forEach(link => { link.classList.remove('active'); if (link.getAttribute('href').includes(currentSection)) { link.classList.add('active'); } }); }); ``` 2. 点击导航栏指定位置 HTML结构: ``` <nav> <ul> <li><a href="#section1">Section 1</a></li> <li><a href="#section2">Section 2</a></li> <li><a href="#section3">Section 3</a></li> <li><a href="#section4">Section 4</a></li> </ul> </nav> <section id="section1">Section 1</section> <section id="section2">Section 2</section> <section id="section3">Section 3</section> <section id="section4">Section 4</section> ``` CSS样式同上。 JS代码: ``` // 获取所有导航链接 const navLinks = document.querySelectorAll('nav a'); // 监听所有导航链接的点击事件 navLinks.forEach(link => { link.addEventListener('click', event => { event.preventDefault(); // 阻止默认行为 const targetId = link.getAttribute('href'); // 获取目标section的id const targetPosition = document.querySelector(targetId).offsetTop; // 获取目标section的相对页面顶部的距离 const startPosition = window.pageYOffset; // 获取当前滚动位置 const distance = targetPosition - startPosition; // 计算需要滚动的距离 const duration = 1000; // 滚动时间 let start = null; // 动画开始时间 // 动画函数,利用requestAnimationFrame实现平滑滚动效果 function step(timestamp) { if (!start) start = timestamp; const progress = timestamp - start; const percentage = Math.min(progress / duration, 1); window.scrollTo(0, startPosition + distance * percentage); if (progress < duration) { window.requestAnimationFrame(step); } } // 开始动画 window.requestAnimationFrame(step); }); }); ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值