JavaScript练手小技巧:我破解了原神官网全屏滚动的秘密

这个标题有点夺人眼球,哈啊哈~骗点击率的。

“原神”官网当真的做的很漂亮,虽然我没玩过这个游戏,但是禁不住喜欢这个网站啊。

https://ys.mihoyo.com/

最近居家教学上网课。除了上课,实在不想做学校安排的其它任务,太烦了。果然在家没的工作动力啊~ 但是学习、coding、追番的动力还是有的。

今天来做一个模仿原神官网的全屏滚动效果页面。 以前这种页面用的是 fullpage 插件,网上的文章很多,就不再提它了。今天用原生的JS来写一个,结合了CSS3动画。

一、HTML结构

本demo页面制作设计了5个板块。读者大大可以根据自己的需要任意增加板块。

<!-- 内容板块 -->
<div class="wrap"  id="wrap"><div class="section"><span>01</span></div><div class="section"><span>02</span></div><div class="section"><span>03</span></div><div class="section"><span>04</span></div><div class="section"><span>05</span></div>
</div>
<!-- 内容板块 end-->
<!-- 控制块,方便用户切换板块 -->
<div class="ctrlBtns"  id="ctrlBtns"></div>
<!-- 控制块 end -->

二、CSS样式

给 span 标签写了个小动画,这么做的目的是扩展后期更复杂的动画需要。

注意.section.show 是给 section 类设定了一个动画显示类 show让有这个类的时候,其下的span标签执行一个过渡动画。

以下CSS可以屏蔽掉浏览器的滚动条:

body{overflow: hidden;
}

为了让 wrap 能丝滑运动,我让它绝对定位了。

完整CSS代码。 

body{overflow: hidden;
}
.wrap{position: absolute;width: 100%;
}
.section{width: 100%;height: 100vh;font-size: 60px;
}
.section:nth-child(1){background: #ffdddd;
}
.section:nth-child(2){background: #ddffe4;
}
.section:nth-child(3){background: #d7dcfd;
}
.section:nth-child(4){background: #ffddf1;
}
.section:nth-child(5){background: #ddf8ff;
}.ctrlBtns{position: fixed;right:20px;top:50%;width: 20px;
}
.ctrlBtns a{display: block;width: 20px;height: 20px;background: #fff;opacity: 0.8;margin-top: 10px;margin-bottom: 10px;
}
.ctrlBtns a.current{background: #f90;opacity: 1;
}/* 做一个小动画作为示例。可以根据项目需要设计更复杂的动画 */
.section span{transition: all 0.5s;display: inline-block; /* 因为 inline 标签变形 transform 无效*/
}
.section.show  span{transform: translateX(300px);
}

 三、JavaScript代码

这次代码有几个关键点:

1. 防止浏览器刷新后,停留在当前位置

如果浏览器不是强制刷新(Ctrl + F5),而是普通刷新(点击刷新按钮,或者按下 F5 刷新),则页面重新载入完毕后会调到之前访问的位置。

这对全屏页面简直就是个灾难。因为,刷新后一些数据都初始化了。必须让页面回到初始的位置,初始的样子。借用以下代码可以实现 。在页面的任意位置执行下面几行 JS 代码就可以了:

// 防止浏览器刷新后,停留在当前位置。
if (history.scrollRestoration) {history.scrollRestoration = 'manual';
}

history.scrollRestoration 有两个属性值:

  • auto:默认值,表示滚动位置会被存储。
  • manual:单词的意思就是手动。表示,滚动的位置不会被存储。

2. 鼠标滚轮事件

可以参考我这篇文章:鼠标滚轮事件_stones4zd的博客-CSDN博客

3. 获取兄弟标签

 可以参考我这篇文章:https://blog.csdn.net/weixin_42703239/article/details/88764774

4. 获取窗口高度

let wh = window.innerHeight ;

 5. 过渡动画结束事件

之前我写过一篇文章,写了帧动画的结束事件,JavaScript 练手小技巧:animationend 事件及其应用小案例_stones4zd的博客-CSDN博客

其实过渡动画也有类似事件:transitionend

 6. 思路

  • 整个效果重点是切换板块

切换板块其实就是移动 wrap 标签。移动它,更改的就是它的 top 属性值。

定义一个全局的索引变量 index,top 值就是 index * 窗口高度

  • 整个效果是通过滚动鼠标滚轮驱动

要借用鼠标滚轮事件 wheel 。当滚动鼠标的时候,让 index 加1 或者 减 1 ,进而更改 wrap 的top属性。

重点:当正在滚动的时候,不能再次驱动滚动事件。防止一次性滚动过多。必须等这次滚动动画(本质执行transition过渡动画)执行完毕后,才能开始下一次滚动。

因此,使用了一个开关变量 isScrolling,默认值 true,默认允许滚动。当滚动开始的时候,就要让它为false。滚动结束,就要变为 true。

完整 JavaScript 代码,里面写好了注释:

let index = 0;
let wrap = document.getElementById("wrap");
let ctrlBtns = document.getElementById("ctrlBtns");
let sections = wrap.getElementsByClassName("section");
let secNum = sections.length ; // 页面板块个数
let isScrolling = true;    // 滚动开关。true,允许滚动;false,不允许滚动
/*
* 开关的目的是,当页面正在滚动的时候,让滚动事件不再执行代码。
* */
// 防止浏览器刷新后,停留在当前位置。
if (history.scrollRestoration) {history.scrollRestoration = 'manual';
}/*
* 工具方法:找兄弟标签
* 参数:目标标签
* 返回值:目标标签的兄弟标签数组
* */
function findSiblings(tag){let parent = tag.parentNode;let children = parent.children;let siblings = [];for(let i=0; i<=children.length-1; i++){if( children[i] !== tag ){siblings.push( children[i] );}}return siblings;
}/* 板块切换函数
* 参数:window.innerHeight 窗口高度
* index:当前显示的板块的索引值,全局变量
* */
function scrollWrap(wh,index){isScrolling = false;wrap.style.transition ="all 0.5s";// 板块切换wrap.style.top = `-${wh*index}px`;//  控制块切换let btnIndex = ctrlBtns.children[index]; // index 对应的控制块let sibilingsA = findSiblings(btnIndex);   // 它的兄弟们// btnIndex 要添加 current,用以突出显示btnIndex.classList.add("current");// 兄弟们要去掉类 currentsibilingsA.forEach(function (v,i) {v.classList.remove("current");})
}/*
* 初始化函数:
* 初始索引变量 index 为 0
* 初始 wrap 的 top 值为 0
* 生成控制块
* 默认第一个 section 执行动画。
* */
function init(){index = 0;wrap.style.top  = 0;// 生成控制块for(let i=0; i <= secNum-1; i++){let a = document.createElement("a");a.href = "javascript:void(0)";ctrlBtns.appendChild(a);}let ctrlHeight = ctrlBtns.offsetHeight ;// 调整控制块垂直方向的位置。ctrlBtns.style.marginTop = - ctrlHeight/2 + "px";// 默认控制块第一个 a 为突出显示。ctrlBtns.children[0].classList.add("current");// 点击控制块,实现板块切换for(let i=0; i <= secNum-1; i++){ctrlBtns.children[i].addEventListener("click",function(){index = i ;// 切换板块scrollWrap(window.innerHeight,index);});}// 默认第一个标签执行动画sections[index].classList.add("show");
}
function doScroll(e){// 开关为 true:才执行滚动处理函数if(isScrolling ){let evt = e || window.event;let wh = window.innerHeight ;evt.preventDefault();   // 阻止浏览器默认事件if( evt.deltaY>0 ){console.info("页面向上滚动");index++;if( index >= secNum ){  // 当在最后一页的时候,还要滚动鼠标index = secNum-1 ;isScrolling = true ;wrap.style.transition ="none"; // 去掉过渡效果,防止用户拖拉窗口,画面异常}else{scrollWrap(wh,index);}}else{console.info("页面向下滚动");index--;if(index<0){   // 当在第一页的时候,用户还要滚动鼠标index = 0; // 保持 index 为 0isScrolling = true ;  // 允许滚动wrap.style.transition ="none"; // 去掉过渡效果,防止用户拖拉窗口,画面异常}else{scrollWrap(wh,index);}}console.info( evt.type,evt.deltaY, index);}}window.addEventListener("wheel",doScroll,{ passive: false });
// 让过渡动画执行完毕的时候,就开启开关,允许滚动。
wrap.addEventListener("transitionend",function(){isScrolling = true;   // 允许滚动wrap.style.transition ="none"; // 去掉过渡效果,防止用户拖拉窗口,画面异常// 对应板块显示动画let secIndex = sections[index];  // 对应板块let secSiblings = findSiblings(secIndex); // 它的兄弟们secIndex.classList.add("show");// 其它版权要去掉动画效果for(let i = 0 ; i<=secSiblings.length-1; i++){secSiblings[i].classList.remove("show");}
});window.addEventListener("resize",function(){wrap.style.top = `-${index*window.innerHeight}px`;
})init();  // 初始化

哦对了,长安汽车的官网也是全屏滚动的页面。https://www.changan.com.cn/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/58164.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

热血江湖2023年官服查线器源码

热血江湖官服查线器源码&#xff0c;方法就是向服务器发送封包&#xff0c;获取返回的服务器大区和线路数据。 等线太难了&#xff0c;主要是想做一个自动查线自动登录游戏的工具&#xff0c;能力有限&#xff0c;先分享查线的源码&#xff01; 有同样想法的同学可以拿着做有参…

在线答题助手c语言源码,很早之前发的逆水寒答题助手,开源!!自己可以修改成任何答题器源码!~~...

本帖最后由 chenbo1991 于 2020-4-16 11:03 编辑 这个是很早之前玩逆水寒为了科举弄出来的!!~~自己修改几处api就行!~~自己抓包修改就可以了.! QQ截图20200416105826.jpg (56.77 KB, 下载次数: 2) 2020-4-16 10:58 上传 .版本 2 .支持库 iext .判断开始 (组合框1.现行选中项 &a…

我是怎么抓取逆水寒大宋佳人漂亮的小姐姐的呢?70行代码解决问题

一年一度的大宋佳人活动又开始了&#xff0c;小姐姐们又开始了踊跃的报名&#xff0c;都有哪些漂亮的小姐姐呢&#xff1f;不放我们来爬一下看看 注&#xff1a;本文仅用于python爬虫学习&#xff0c;请勿滥用数据&#xff0c;严禁侵犯个人隐私 基础分析 大宋佳人活动主页面…

html制作《逆水寒》心得及部分代码

制作网页的心得和部分代码 布局 原图 首先&#xff0c;我们要明确网页的布局&#xff0c;以此来判断需要几个盒子&#xff0c;放在什么样的位置。从原网页中不难看出&#xff0c;我们可以把这张图分为这几个部分&#xff1a; 大的布局上&#xff0c;我们分为三个盒子。1号大…

chatgpt赋能python:Python分词,助力文本处理和搜索引擎优化

Python分词&#xff0c;助力文本处理和搜索引擎优化 作为一种广泛应用于文本处理的编程语言&#xff0c;Python在分词处理方面也有着得天独厚的优势。Python分词不仅可以帮助我们完成文本处理任务&#xff0c;还能够为搜索引擎优化提供便利。 什么是分词&#xff1f; 分词&a…

巴比特 | 元宇宙每日必读:百度冲刺ChatGPT,CTO王海峰任总指挥,三月份完成内测的目标能否达成?...

摘要&#xff1a;据财联社报道&#xff0c;2月7日百度官宣“文心一言”项目时&#xff0c;给自己掐上了“三月完成内测”的倒计时&#xff0c;多位百度员工表示&#xff0c;高层下了死命令&#xff0c;要在一个月时间内看到产品。为此&#xff0c;百度也集结了公司在深度学习、…

互联网高薪时代,彻底结束了?

作者| Mr.K 编辑| Emma 来源| 技术领导力(ID&#xff1a;jishulingdaoli) 两个月前&#xff0c;马斯克接受媒体采访时亲口承认&#xff0c;推特已裁员80%&#xff0c;从原来的近8000人&#xff0c;减少到了现在的1500名。这么大规模的裁员带来了什么“严重”后果呢&#xff1…

商业计划书范文3000_项目融资商业计划书模板范文PPT

商业计划书(Business Plane),简称为BP&#xff0c;大家可不要小看这一份BP&#xff0c;它是一个非常重要的存在&#xff0c;可以说是一块敲门砖&#xff0c;帮助创业者打开资本市场的大门。那么&#xff0c;如何打造一份项目融资商业计划书&#xff0c;这里为大家整理了一些模板…

项目融资计划书PPT模板

模板介绍 本套项目融资计划书PPT模板,模板编号&#xff1a;P26185&#xff0c;大小10MB,共27页,比例为16:9,由封面、目录、转场页、内容、结尾5个部分构成。 内含橙色,红色多种配色&#xff0c;精美简约风格设计&#xff0c;动态播放效果&#xff0c;精美实用。 一份设计精美…

上市融资计划书PPT模板

模板介绍 一份高质量的PPT模板&#xff0c;可以让你在日常的工作中展示自我、脱颖而出、去赢得更多机会&#xff0c;今天小编分享一份精美的上市融资计划书PPT模板 PPT模板名称&#xff1a;上市融资计划书PPT模板&#xff0c;模板编号&#xff1a;P11463&#xff0c;大小10MB&…

a轮融资计划书PPT模板

模板介绍 一份高质量的PPT模板&#xff0c;可以让你在日常的工作中展示自我、脱颖而出、去赢得更多机会&#xff0c;今天小编分享一份精美的a轮融资计划书PPT模板 PPT模板名称&#xff1a;a轮融资计划书PPT模板&#xff0c;模板编号&#xff1a;P56225&#xff0c;大小10MB&am…

如何写出一份完美的BP(商业计划书)?

来源&#xff1a;股权投资论坛&#xff08;PE821010&#xff09; 作者&#xff1a;吕顺辉 一、商业计划书是创业者找VC/PE的敲门砖 •据统计投资人平均每天收到50-100份BP&#xff0c;而只有5-8份会受到重视 •投资人阅读每份商业计划书平均时间为3分44秒 •商业计划书平均…

商业创业融资计划书PPT模板

模板介绍 本套商业创业融资计划书PPT模板,模板编号&#xff1a;P34634&#xff0c;大小10MB,共27页,比例为16:9,由封面、目录、转场页、内容、结尾5个部分构成。 内含灰色,黄色多种配色&#xff0c;精美微立体风格设计&#xff0c;动态播放效果&#xff0c;精美实用。 一份设…

贾跃亭融资计划书曝光:看他如何靠两份PPT融资150亿

贾跃亭融资计划书曝光&#xff1a;看他如何靠两份PPT融资150亿 手机搜狐网 12-28 08:25 虎嗅注&#xff1a;原本长袖善舞的贾跃亭能落魄到躲在美国不敢回来&#xff0c;也是一年前所有人都没想到的闹剧。想当初自言“融资能力差”的他还为乐视体育拿到了80亿元B轮融资。而今&am…

今日头条定位融资商业计划书

今日头条如今的江湖地位毋庸置疑&#xff0c;以其超高人气的今日头条和抖音为基础&#xff0c;与阿里腾讯并列为中国互联网流量界三巨头。 我们来看一看2013年字节跳动的商业计划书&#xff0c;从其管理层陈述书中可以见到当时头条是出于在了一个何其激荡正在急剧变化的时代。我…

经典商业融资计划书PPT模板

模板介绍 一份高质量的PPT模板&#xff0c;可以让你在日常的工作中展示自我、脱颖而出、去赢得更多机会&#xff0c;今天小编分享一份精美的经典商业融资计划书PPT模板 PPT模板名称&#xff1a;经典商业融资计划书PPT模板&#xff0c;模板编号&#xff1a;P98467&#xff0c;大…

史上最强的融资方案商业计划书

史上最强的融资方案商业计划书 资本时代&#xff1a;领先一步等于领先一路&#xff0c;领先一年等于领先一个时代&#xff01; 这个问题需要从企业发展过程中的融资谈起&#xff0c;企业要获得发展就一定要有大量资金的支持才行。一般来讲&#xff0c;企业获取资金支持的主要…

融资方案的商业计划书

融资方案的商业计划书 资本时代&#xff1a;领先一步等于领先一路&#xff0c;领先一年等于领先一个时代&#xff01; 这个问题需要从企业发展过程中的融资谈起&#xff0c;企业要获得发展就一定要有大量资金的支持才行。一般来讲&#xff0c;企业获取资金支持的主要方式&…

【解决方案】关于windows问题新的解决方案——智能AI,也许你可以让它做的更多

非常抱歉许久未更新关于Windows问题解决的文章。我一直在想如何提供更好的服务和解决方案&#xff0c;直到chatGPT的出现&#xff0c;算是目前能想到的完美方案&#xff0c;为您推广的智能聊天机器人&#xff0c;关注后快速体验吧&#xff0c;该公众号会持续更新更多AI作品&…

chatgpt赋能python:Python获取微信群聊天记录

Python获取微信群聊天记录 微信是目前中国最受欢迎的社交聊天应用程序之一。许多人都习惯在微信群中进行聊天和信息交流。然而&#xff0c;有时我们需要保存一些重要的聊天记录&#xff0c;以备日后查看和备份。Python可以帮助我们实现获取微信群聊天记录的目的。 为什么使用…