使用JS方法使页面滚动到指定元素+优化+API介绍(动画)
前言
当页面最上部有顶部菜单是,使用锚点跳转的方法很容易挡住想要呈现的内容(如下图技能两个字被挡住了一半),为避免出现这样的问题,故滚动到指定元素使用用JS的方法来实现。
目录
- 使用的API简介
- 初版(第一版)
- 优化(第二版)
- 继续优化(第三版 引入tween.js库)
正文
1 使用的API简介
document.querySelectorAll
preventDefault
currentTarget
getAttribute
document.querySelector
- offsetTop
- window.scrollTo
window.scrollY
setInterval
window.clearInterval
2 初版(第一版)
- 代码及思路如下:
//1 获取所有的a标签
let aTags=document.querySelectorAll("nav.menu ul li a")
//console.log(aTags)
//2 遍历a标签并点击标签滚动到指定元素位置
for(let i=;i<=aTags.length;i++){
aTags[i].onclick=function(x){
x.preventDefault(); //阻止a标签默认的跳转
//console.log(x.currentTarget);
let a=x.currentTarget;
let href=a.getAttribute("href"); //找到href中的内容,如果href中时一个锚点则返回#siteSkill
//console.log(href);
let element=document.querySelector(href); //找到内容中的锚点对应ID的标签,如对应的锚点名为#siteSkill,则返回<section class="skills" id="siteWorks">…</section>
//console.log(element);
let top=element.offsetTop; //获取元素到页面最顶点的高度(不会随着页面滚动变化的高度)
//console.log(top);
window.scrollTo(,top-);
}
} - 效果图如下

- 这样能准确的达到想要的地方并且也不会内容也不会被挡住,但是,也存在一些缺点,比如跳转太生硬,中间没有过渡,影响用户体验。
3 优化(第二版)
- 优化后代码如下:
//1 获取所有的a标签
let aTags=document.querySelectorAll("nav.menu ul li a")
//console.log(aTags)
//2 遍历a标签并点击标签跳到指定元素位置
for(let i=;i<=aTags.length;i++){
aTags[i].onclick=function(x){
x.preventDefault(); //阻止a标签默认的跳
let a=x.currentTarget;
let href=a.getAttribute("href"); //找到href中的内容,如果href中时一个锚点则返回#siteSkill
let element=document.querySelector(href); //找到内容中的锚点对应ID的标签,如对应的锚点名为#siteSkill,则返回<section class="skills" id="siteWorks">…</section>
let top=element.offsetTop;
let n=; //动的次数
let t=/n; //多久动一次
let currentTop=window.scrollY; //所在的位置
let targetTop=top-; //目标位置
var s=(targetTop-currentTop)/n; //每次动的距离
let i=;
let id=setInterval(()=>{
if(i===n){
window.clearInterval(id);
return;
} //当i=n时停止动画
i=i+
window.scrollTo(,currentTop+s*i) },t)
}
} - 优化后有跳转动画,但是依然还有缺点,比如:定义的是时间一致,所以跳转到距离TOP不同位置的地方速度不一致。看起来依然生硬不自然
4 继续优化(第三版 引入tween.js库)
- 再次优化后的代码
//1 引入tween.js库
<script src='https://cdnjs.cloudflare.com/ajax/libs/tween.js/17.2.0/Tween.min.js'></script>
<script> //2 获取所有的a标签 let aTags=document.querySelectorAll("nav.menu ul li a");function animate(time){
requestAnimationFrame(animate);
TWEEN.update(time);
}
requestAnimationFrame(animate); //3 遍历a标签并在点击标签时滚动到指定元素的位置
for(let i=;i<=aTags.length;i++){
aTags[i].onclick=function(x){
x.preventDefault(); //阻止a标签默认的跳
let a=x.currentTarget;
let href=a.getAttribute("href"); //找到href中的内容,如果href中时一个锚点则返回#siteSkill
let element=document.querySelector(href); //找到内容中的锚点对应ID的标签,如对应的锚点名为#siteSkill,则返回<section class="skills" id="siteWorks">…</section>
let top=element.offsetTop;
let currentTop=window.scrollY; //所在的位置
let targetTop=top-; //目标位
let s=targetTop-currentTop; //所在到目标的高度差
let t=Math.abs((s/)*) //Math.abs方法保证时间为正值不为负数。ps:Math的首字母需要大写!!!
var coords={y:currentTop}; //y为所在位置
if(t>=){t=} //如果时间最大为500,不超过500
var tween=new TWEEN.Tween(coords)
.to({y:targetTop},t) //y为到达目标位置,时间
.easing(TWEEN.Easing.Quadratic.In)
.onUpdate(function(){
window.scroll(,coords.y)
})
.start();
}
} </script>
使用JS方法使页面滚动到指定元素+优化+API介绍(动画)的更多相关文章
- jquery页面滚动到指定id
//jquery页面滚动到指定id $body = (window.opera) ? (document.compatMode == "CSS1Compat" ? $('html ...
- 滚动到指定元素的id处+当元素出现在浏览器显示区域就会自动加载
//滚动到指定元素的id处 如:$("#Exam82") function Jump() { var scroll_offset = $("#Exam82"). ...
- js 页面滚动到指定位置
当页面的长度比较长时,如果进行刷新页面,我们希望能够在刷新完成页面之后,能够停留在当前位置,而不是从头再手动滚动到当前位置. 那么这样的效果如何实现呢?下面开始简单描写(由于博客园不支持效果展示,所以 ...
- aos.js超赞页面滚动元素动画jQuery动画库
插件描述:aos.js 是一款效果超赞的页面滚动元素动画jQuery动画库插件.该动画库可以在页面滚动时提供28种不同的元素动画效果,以及多种easing效果.在页面往回滚动时,元素会恢复到原来的状态 ...
- 页面滚动图片等元素动态加载插件jquery.scrollLoading.js
如果一个网页很长,那么该页面的加载时间也会相应的较长.而这里给大家介绍的这个jQuery插件scrollLoading的作用则是,对页面元素进行动态加载,通俗的说就是滚到哪就加载到哪,屏幕以下看不见的 ...
- 使用js方法将table表格中指定列指定行中相同内容的单元格进行合并操作。
前言 使用js方法对html中的table表格进行单元格的行列合并操作. 网上执行此操作的实例方法有很多,但根据实际业务的区别,大多不适用. 所以在网上各位大神写的方法的基础上进行了部分修改以适合自己 ...
- 每天一点点之 uni-app 框架开发 - 页面滚动到指定位置
项目需求:在页面中,不管位于何处,点击评论按钮页面滚动到对应到位置 实现思路如下: uni.createSelectorQuery().select(".comment").bou ...
- 微信小程序页面滚动到指定位置
页面上有一个元素或者组件,id 为 comment 则: var me = this; var query = wx.createSelectorQuery().in(me); query.selec ...
- js方法的命名不能使用表单元素的名称或ID
今天在写页面的时候,遇到一个关于js方法的命名问题,先看下代码: 表单元素如下: <select name="isCulture" onchange="isCult ...
随机推荐
- 为IT程序员量身定制的12个目标——很经典
对程序员们来说挑战自我非常重要,要么不断创新,要么技术停滞不前.新年伊始,我整理了12个月的目标,每个目标都是对技术或个人能力的挑战,而且可以年复一年循环使用. 01. 变得有耐心 02. 保持健康 ...
- 如何安装windows系统
前言:装系统有两种方式,一种是下载系统镜像文件后解压ios文件到除c盘以外其他盘都可(如原系统是win10系统,则可以直接右键加载,而不必解压),然后运行.exe文件就可以自动安装了.这种方法在新款电 ...
- 对MySQL交换分区的实践
前言 在介绍交换分区之前,我们先了解一下 mysql 分区. 数据库的分区有两种:水平分区和垂直分区.而MySQL暂时不支持垂直分区,因此接下来说的都是水平分区.水平分区即:以行为单位对表进行分区.比 ...
- .NET CORE MVC网站体验
安装SDK https://www.microsoft.com/net/download/core 运行命令行工具 mkdir coremvc cd coremvc dotnet new 文件建立成功 ...
- layer.js漂亮的弹出框
它的官方网站:http://layer.layui.com/ 消息.确认框.ifame.自定义文本.旋转木马,都有按钮,是一款强大的js 弹出框: 以下为本人的简单介绍: layer.open({ t ...
- 微信小程序引用阿里巴巴矢量图标iconfont
最近在写微信小程序,但是引用图片,导致项目文件太大,所以就想到引用阿里巴巴矢量图标的方法 第一步:下载阿里巴巴矢量图代码: 第二步:将下载下来的文件中iconfont.ttf转换即可.转换地址:htt ...
- React实现单例组件
问题背景 在工作中遇到了这样一个场景,写了个通用的弹窗组件,却在同一个页面中多次使用了该组件.当点击打开弹窗时,可想而知,一次性打开了多个弹窗,而业务需求只需要打开一个. 我个人在解决问题过程中的一些 ...
- Android ImageView 替换图片
网上找了半天,找到的都是错的,都不是我想要的效果.我想要的是点击一个图片后,图片被替换. 通过一下方法可以实现:“v”是ImageView对象,“image_name”是替换后的图片资源 ((Imag ...
- luoguP1002
p1002 题意: 从坐标A到坐标B的可能路线(有一些点不能走)情况,很明显可以看出用dp做 m[i][j]=m[i-1][j]+m[i][j-1](注意处理不能走的点) 自己在初始化时犯了错,第1行 ...
- BZOJ 4026 dC Loves Number Theory (主席树+数论+欧拉函数)
题目大意:给你一个序列,求出指定区间的(l<=i<=r) mod 1000777 的值 还复习了欧拉函数以及线性筛逆元 考虑欧拉函数的的性质,(l<=i<=r),等价于 (p[ ...