我最近在做我們公司官網的改版,產品中心就是每次滾一屏的,我覺得加上樓梯更方便用戶瀏覽,就隨便寫了個demo,
先來看看結構,都很簡單的
<!--樓梯--> <ul class="louti"> <li class="active">第1屏</li> <li>第2屏</li> <li>第3屏</li> <li>第4屏</li> <li>第5屏</li> </ul> <!--內容--> <div class="content"> <div style="background-color: #87CEFB" class="ping staircase"> <div>這是第1屏</div> </div> <div style="background-color: #FFC0CB" class="ping staircase"> <div>這是第2屏</div> /div> <div style="background-color:#BAD5FF" class="ping staircase"> <div>這是第3屏</div> </div> <div style="background-color: #3CB379" class="ping staircase"> <div>這是第4屏</div> </div> <div style="background-color: #AFEEEE" class="ping staircase"> <div>這是第5屏</div> </div> </div>
再來點簡單的CSS
html,body {
height: 100%;
}
body {
margin: 0;
}
.content{height: 100%;}
.content .ping {
height: 100%;
}
li{
list-style: none;
}
.louti{
position: fixed;
top: 25%;
right: 3%;
}
.louti li{
width: 100px;
text-align: center;
border: 1px solid #F5F5F5;
height: 80px;
line-height: 80px;
cursor: pointer;
}
.louti li:nth-child(n+2){
border-top: none;
}
.louti li.active{
background: burlywood;
color: white;
}
接下倆就是JS了,
//內容一屏一屏的滾動
document.addEventListener("DOMContentLoaded", function() {
var body = document.body;
var html = document.documentElement;
var itv, height = document.body.offsetHeight;
var page = scrollTop() / height | 0;
addEventListener("resize", onresize, false);
onresize();
//鼠標滾輪事件
document.body.addEventListener("onwheel" in document ? "wheel" : "mousewheel", function(e) {
clearTimeout(itv);
itv = setTimeout(function() {
//判斷滾輪滾的方向
var delta = e.wheelDelta / 120 || -e.deltaY / 3;
page -= delta;
var max = (document.body.scrollHeight / height | 0) - 1;
if(page < 0) {
return page = 0;
}
if(page > max) {
return page = max;
}
move();
}, 100);
e.preventDefault();
});
//當窗體發生變化時還是保證每次滾動滾一屏
function onresize() {
height = body.offsetHeight;
move();
};
function move() {
var value = height * page;
var diff = scrollTop() - value;
(function callee() {
diff = diff / 1.2 | 0;
scrollTop(value + diff);
if(diff) {
itv = setTimeout(callee, 16);
}
})();
};
function scrollTop(v) {
if(v == null) {
return Math.max(body.scrollTop, html.scrollTop);
} else {
body.scrollTop = html.scrollTop = v;
}
}
})
//點擊樓層按鈕跳到相應的樓層
var isMove=false;
//點擊右側導航條
$(".louti li").on("click",function(){
isMove=true;
//按鈕變化
$(this).removeClass().addClass("active").siblings("li").removeClass("active");
//樓梯移動
var index=$(this).index();
var _topp=$(".staircase").eq(index).offset().top;
$("html,body").stop().animate({scrollTop:_topp},200,function(){
isMove=false;
})
})
//樓梯滾動導航條相對移動
$(window).scroll(function(){
//判斷是否在滾動,如果沒有,則支執行這里的代碼
if(!isMove){
//獲取滾動距離
var _scrollTop=$(document).scrollTop();
//遍歷所有樓梯
$(".staircase").each(function(){
var _topp=$(this).offset().top;
//判斷滾動距離是否大於樓梯的top值
if(_scrollTop>=_topp){
var index=$(this).index();
$(".louti li").eq(index).removeClass().addClass("active")
.siblings("li").removeClass("active");
}
})
}
})
