Javascript 实现全屏滚动实例代码
JS全屏滚动
参照fullPage.js的效果,用自己的想法实现的。
实现的效果:1、全屏滚动,滚动一下齿轮就会滚动全屏。
2、自适应缩放,无论怎么改变窗口的大小,都会保证用一个元素占满全屏。
下一步计划:
1、改成react组件
2、实现更多的效果
注释写的很清楚,基本上知道函数怎么用就可以了。有想法这东西就很简单。
这里偷懒使用了我之前写过的一个运动框架(其实就是一个函数),稍加修改就可以在这上面使用。框架相关:点击这里
注释非常详细了,就不说其他的了。直接上代码:
<!DOCTYPEhtml>
<htmllang="en">
<head>
<metacharset="UTF-8">
<title>index</title>
</head>
<style>
*{
margin:0;
padding:0;
}
div{
width:100%;
height:100%;
}
.one{
background-color:#1bbc9b;
}
.sec{
background-color:#4bbfc3;
}
.thr{
background-color:#7baabe;
}
</style>
<body>
<divclass="fullone">1</div>
<divclass="fullsec">2</div>
<divclass="fullthr">3</div>
</body>
<script>
//添加滚动监听
document.addEventListener('mousewheel',wheel,false);
//判断一次滚动是是否完成
varisComplete=true;
//隐藏滚动条
document.body.style.overflow='hidden';
//获取滚动的元素
varfullList=document.getElementsByClassName("full");
//因为是类数组对象,不是数组对象,所以只能使用call的方式来调用
Array.prototype.forEach.call(fullList,function(value){
//获取一个网页满屏的高
value.style.height=window.innerHeight+'px';
})
//如果窗口大小改变执行的函数
window.onresize=function(){
Array.prototype.forEach.call(fullList,function(value){
value.style.height=window.innerHeight+'px';
});
//改变窗口大小后,应该仍是一个元素占满全屏
if(document.body.scrollTop%window.innerHeight)
{
isComplete=false;
//根据四舍五入判断滚动位置
lettmp=Math.round(document.body.scrollTop/window.innerHeight)*window.innerHeight;
//使用运动框架
showAnimate(document.body,{'scrollTop':tmp},function(){
isComplete=true;
});
}
};
//滚动函数
functionwheel(e){
//等待上一个滚动完成
if(isComplete){
//滚动进行时
isComplete=false;
//判断是往上滚动还是往下滚动
if(e.wheelDelta<0){
//要滚动到的点
letarrivePoint=document.body.scrollTop+window.innerHeight;
//最大的滚动点
letmaxBottom=document.body.offsetHeight-window.innerHeight;
//如果超出了最大的滚动点,则赋值为最大滚动点
arrivePoint=arrivePoint>maxBottom?maxBottom:arrivePoint;
showAnimate(document.body,{'scrollTop':arrivePoint},function(){
isComplete=true;
});
}else{
letarrivePoint=document.body.scrollTop-window.innerHeight;
//最小滚动点为0
arrivePoint=arrivePoint<0?0:arrivePoint;
showAnimate(document.body,{'scrollTop':arrivePoint},function(){
isComplete=true;
});
}
}
}
/**
*函数作用:执行动画
*接受参数:obj(需要运动的DOM元素)
*json(需要改变的属性集合,json格式)
*fn(回调函数)
*/
functionshowAnimate(obj,json,fn){
clearInterval(obj.timer);
//表示运动是否都已经停止
varflag=true;
obj.timer=setInterval(function(){
//循环json
for(variinjson){
if(i=='opacity'){
//获取透明度值,round四舍五入去除小数点
varicur=Math.round(parseFloat(getStyle(obj,i))*100);
}
else{
//获取属性值
varicur=parseInt(getStyle(obj,i))||obj[i];
}
//缓冲运动,speed随时变换
varspeed=(json[i]-icur)/10;//千万要写在定时器里面,写在外面会有意想不到的后果
speed=speed>0?Math.ceil(speed):Math.floor(speed);//速度向上或者下取整,防止到不了over位置
//如果有一个没到达终点就是false
if(json[i]!==icur){
flag=false;
}else{
flag=true;
}
if(i=='opacity'){
obj.style.filter='alpha(opacity:'+(icur+speed)+')';//IE兼容
obj.style.opacity=(icur+speed)/100;
}elseif(obj[i]||obj[i]==0){
obj[i]=icur+speed;
}
else{
obj.style[i]=icur+speed+'px';
}
console.log(icur+''+json[i]);
}
//检查是否所有的运动都已经停止
if(flag){
clearInterval(obj.timer);
if(fn){
fn();
}
}
},13);
}
/**
*函数作用:返回样式属性值
*接受参数:obj(需要获取属性的DOM元素)
*attr(需要获取的属性名称)
*/
functiongetStyle(obj,attr)
{
if(obj.currentStyle)
{
returnobj.currentStyle[attr];//IE兼容
}
else
{
returngetComputedStyle(obj,false)[attr];
}
}
</script>
</html>
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!