分享一个关于楼梯效果的练习 :
实现功能的方法:
关键在于滑动时获取对应li索引 index() animate()的方法 获取索引时 需要用到scrollTop() outHeight(),offset()方法
和jq的动画效果fadeIn() ,fadeOut()的方法,完成楼梯效果的渲染。
最后的完善:此时楼梯效果点击li滑动到对应楼层是 会有页面会有动画滑动的效果,不够完善。
此时定一个变量flag来监听如果为true 执行侧边列表显示的代码,给侧边li加点击事件时,flag为FALSE
实现页面滚动代码时另其变为true。
- 首先获取鼠标滑动的距离,滑动之后获取目标li的对应的索引,给对应的li添加类名 使用animate()方法是页面滚动到对应的li。
- 给li添加点击事件,(出去最后一个li)使用animate()
- 给最后一个li添加事件 使用animate()页面回到顶部。
实例展示 :
css样式
<style type="text/css">
body,
ul,
li {
padding: 0;
margin: 0;
}
li {
list-style: none;
}
#floorNav {
/* display: none; */
position: fixed;
top: 100px;
left: 50px;
width: 32px;
border: 1px solid #CECECE;
}
#floorNav li {
position: relative;
width: 32px;
height: 32px;
border-bottom: 1px solid #CECECE;
text-align: center;
line-height: 32px;
font-size: 12px;
}
#floorNav span {
display: none;
position: absolute;
top: 0;
left: 0;
width: 32px;
height: 32px;
background: red;
color: white;
}
#floorNav li:hover span,
#floorNav li.hover span {
display: block;
}
#floorNav li:last-child {
background: red;
color: white;
border-bottom: none;
}
#header,
#footer {
width: 1000px;
height: 1000px;
background: darkgoldenrod;
margin: 0 auto;
}
#content {}
#content li {
width: 1000px;
height: 600px;
margin: 0 auto;
font-size: 40px;
text-align: center;
line-height: 600px;
}
</style>
<body>
<div id="floorNav">
<ul>
<li>1F<span>服饰</span></li>
<li>2F<span>美妆</span></li>
<li>3F<span>手机</span></li>
<li>4F<span>家电</span></li>
<li>5F<span>数码</span></li>
<li>6F<span>运动</span></li>
<li>7F<span>居家</span></li>
<li>8F<span>母婴</span></li>
<li>9F<span>食品</span></li>
<li>10F<span>图书</span></li>
<li>11F<span>服务</span></li>
<li>TOP</li>
</ul>
</div>
<div id="header"></div>
<div id="content">
<ul>
<li style="background: #8B0000;">服饰</li>
<li style="background: #123;">美妆</li>
<li style="background: #667;">手机</li>
<li style="background: #558;">家电</li>
<li style="background: #900;">数码</li>
<li style="background: #456;">运动</li>
<li style="background: #789;">居家</li>
<li style="background: #234;">母婴</li>
<li style="background: #567;">食品</li>
<li style="background: #887;">图书</li>
<li style="background: #980;">服务</li>
</ul>
</div>
<div id="footer"></div>
<script>
$(function () {
var flag = true;
$(window).scroll(function () {
if (flag) {
var st = $(this).scrollTop();//鼠标滑动距离
//滑动距离大于300 显示侧边列表
if (st > 300) {
$("#floorNav").fadeIn();
} else {
$("#floorNav").fadeOut();
}
//遍历li 滑动距离大于li 获取匹配元素在当前视口的相对偏移高度-获取第一个匹配元素外部高度(默认包括补白和 //边框)的一半。取得该元素的索引.
$("#content li").each(function () {
if (st >= $(this).offset().top - $(this).outerHeight() / 2) {
var index = $(this).index();
//获取该元素的索引并添加类名,其他兄弟元素移出类名
$("#floorNav li").eq(index).addClass("hover").siblings().removeClass("hover");
}
})
}
})
//排除最后一个li 添加点击事件 先获取索引 添加类名移出兄弟元素类名
$("#floorNav li:not(:last)").click(function () {
flag = false;
var index = $(this).index();
$(this).addClass("hover").siblings().removeClass("hover");
//页面滚动到对应li标签对应位置
$("body,html").animate({ "scrollTop": $("#content li").eq(index).offset().top }, 200, function () {
flag = true;
});
});
//给侧边列表最后一个li 添加点击事件 页面滚动到最上面
$("#floorNav li:last").click(function () {
$("body,html").animate({ "scrollTop": 0 }, 200);
})
})
</script>
</body>