想必大家都用过JD,在它的首页里面有个很常见的特性:就是 楼梯特效 。
对于程序员的我们,可以说是万物皆可盘。那么,我们就来盘一下它。
先上要实现的效果图:
效果功能描述:当点击右侧悬浮的按钮时,点击相应模块,左侧内容区域会自动跳转到该模块区域。
下面,上代码:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
*{
margin:0;
padding:0;
}
li{
list-style-type: none;
}
.top{
height:900px;
background : #ddd;
}
.footer{
height : 600px;
background : #ddd;
}
.content{
height:800px;
}
.content h1{
text-align:center;
line-height: 80px;
}
.stairs-list{
width : 60px;
position: fixed;
right:5%;
top:50%;
margin-top:-120px;
background : #fff;
}
.stairs-list li{
width:50px;
height:50px;
line-height: 25px;
text-align : center;
padding:5px;
border-bottom:1px solid #ddd;
}
.stairs-list li.active{
color : orangered;
}
.stairs li span{
display: block;
}
</style>
</head>
<body>
<div class="top">
</div>
<div class="content" style="background-color : yellowgreen ">
<h1>京东秒杀</h1>
</div>
<div class="content" style="background-color : skyblue ">
<h1>特色优选</h1>
</div>
<div class="content" style="background-color : #666 ">
<h1>频道广场</h1>
</div>
<div class="content" style="background-color : orangered ">
<h1>为您推荐</h1>
</div>
<div class="footer"></div>
<ul class="stairs-list">
<li>
<span>京东</span>
<span>秒杀</span>
</li>
<li>
<span>特色</span>
<span>优选</span>
</li>
<li>
<span>频道</span>
<span>广场</span>
</li>
<li>
<span>为您</span>
<span>推荐</span>
</li>
</ul>
<script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script>
<script>
// OOA :
// 1. 初始化数据;
// 2. 事件绑定;
// 3. 根据scrollTop值判定所在楼层;
// 4. 效果添加;
// 5. 根据点击事件切换下标;
function Stairs( options ){
this.options = options;
this.init();
}
Stairs.prototype = {
constructor : Stairs,
init : function(){
// 内容元素高度数组;
this.content_ele_offset_top_list = [];
// 获取元素的偏移高度;
$(this.options.content_selector).offset( function( index , coords) {
// 将每一个元素的高度值放入高度列表之中;
this.content_ele_offset_top_list.push(coords.top);
return coords;
}.bind(this))
// 获取最小高度值;
var _length = this.content_ele_offset_top_list.length ;
this.min_top = this.content_ele_offset_top_list[0];
this.max_top = this.content_ele_offset_top_list[_length - 1] + $(this.options.content_selector).last().height();
this.content_ele_offset_top_list.push(this.max_top);
this.bindEvent();
},
bindEvent:function(){
var $body_html = $("body,html");
// 保存实例对象的指针;
// var _this = this;
var instance = this;
// 高频执行的scroll事件;
// 优化 : 节流 ;
$(document).scroll( function(){
var scrollTop = $body_html.scrollTop();
this.calStairsIndex(scrollTop);
}.bind(this))
$(this.options.stairs_selector).click(function(){
// 知道当前发生事件的元素是谁; this; 因为这jQuery事件绑定处理没有办法,在外部传入当前发生事件的元素; 这个this不能变;
// 当前的实例对象是谁; this;
var index = $(this).index(instance.options.stairs_selector);
instance.changeScrollTop(index);
})
},
// 计算当前楼层;
calStairsIndex : function( st ){
// 没有到达楼梯区域进行隔离;
if(st < this.min_top || st > this.max_top){
// console.log(-1);
this.index = -1;
this.changeStairsBtn();
return false
};
// 如果还在范围之内不用继续判断;
var _list = this.content_ele_offset_top_list;
// 如果 st 还在当前index 范围之内则不继续进行查找;
if(st >= _list[this.index] && st < _list[this.index + 1]){
return false;
}
// 遍历 ;
for(var i = 0 ; i < _list.length ; i ++){
if(st >= _list[i] && st < _list[i + 1]){
this.index = i;
break;
}
}
this.changeStairsBtn();
},
changeStairsBtn : function(){
if(this.index === -1){
$(this.options.stairs_selector).removeClass("active");
return false;
}
$(this.options.stairs_selector).eq(this.index).addClass("active")
.siblings()
.removeClass("active");
},
changeScrollTop : function( index ){
$("body,html").scrollTop(this.content_ele_offset_top_list[index]);
// 事件触发器;
$(document).trigger("scroll");
}
}
var staris = new Stairs({
content_selector : ".content",
stairs_selector : ".stairs-list li"
});
console.log(staris);
</script>
</body>
</html>
现在,我们也能实现跟它一样的功能效果了。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程网。