js全屏滚动

前两天看到全屏滚动的效果,感觉挺好玩就研究了一下,话不多说,直接放代码

html:

<div class="content" style="background: #f00;"></div>
<div class="content" style="background: #FFA500;"></div>
<div class="content" style="background: #00f;"></div>

css:

.content{width: 100%;height: 100%;}

js:

document.addEventListener('mousewheel',wheel,false);

//判断一次滚动是是否完成
var isComplete = true;
//隐藏滚动条
document.body.style.overflow='hidden';

//获取滚动的元素
var fullList = document.getElementsByClassName("content");

//因为是类数组对象,不是数组对象,所以只能使用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;
//根据四舍五入判断滚动位置
let tmp = Math.round(document.body.scrollTop / window.innerHeight)* window.innerHeight;
//使用运动框架
move(document.body,{'scrollTop':tmp},function(){
isComplete = true;
});
}

//滚动函数
function wheel(e){
//等待上一个滚动完成
if(isComplete){

//滚动进行时
isComplete = false;

//判断是往上滚动还是往下滚动
if(e.wheelDelta < 0){
//要滚动到的点
let arrivePoint = document.body.scrollTop + window.innerHeight;
var x=arrivePoint/window.innerHeight
//最大的滚动点
let maxBottom = document.body.offsetHeight - window.innerHeight;

//如果超出了最大的滚动点,则赋值为最大滚动点
arrivePoint = arrivePoint > maxBottom ? maxBottom : arrivePoint;

move(document.body,{'scrollTop':arrivePoint},function(){
isComplete = true;
});
}else{
let arrivePoint = document.body.scrollTop - window.innerHeight;
var x=arrivePoint/window.innerHeight
//最小滚动点为0
arrivePoint = arrivePoint < 0 ? 0 :arrivePoint;
move(document.body,{'scrollTop':arrivePoint},function(){
isComplete = true;
});
}
var li=document.getElementById('nums').getElementsByTagName('li')
if(x>=li.length){
x=li.length-1
}
if(x<0){
x=0
}
for(var i=0;i<li.length;i++){
li[i].className=""
}
li[x].className="active"
}
}
}

//运动框架

function move(obj,json,fn){

clearInterval(obj.times);
var fl=true;
obj.times=setInterval(function(){
for(var attr in json){
var le=0;
if(attr=="opacity"){
le=Math.round(parseFloat(getStyle(obj,attr))*100);
}else if(attr=="scrollTop" || attr=="scrollLeft"){
le=obj[attr];
}else{
le=parseInt(getStyle(obj,attr))/*||obj[attr]*/;
}
var speed=(json[attr]-le)/10;
speed>0 ? speed=Math.ceil(speed) : speed=Math.floor(speed);
if(le!=json[attr]){
fl=false;
}else{
fl=true;
}
if(attr=="opacity"){
obj.style.filter='alpha(opacity:'+(le+speed)+')';
obj.style.opacity=(le+speed)/100;
}else if(obj[attr]||obj[attr] == 0){
obj[attr] = le + speed;
}
else{
obj.style[attr]=le+speed+"px";
}
if(fl){
clearInterval(obj.times);
if(fn){
fn();
}
}
}
},20)
}

//获取样式

function getStyle(obj, attr)
{
if(obj.currentStyle)
{
return obj.currentStyle[attr];
}
else
{
return getComputedStyle(obj,false)[attr];
}
}

转载于:https://www.cnblogs.com/chenoin/p/6772768.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值