使用jq实现一个移动端锚点效果
页面布局
导航栏布局
<div class="tabs">
<ul class="list-item">
<li class="active">首页</li>
<li>详情</li>
<li>新闻资讯</li>
<li>专题</li>
<li>图文列表</li>
<li>直播列表</li>
<li>短视频</li>
</ul>
</div>
内容展示
每一个容器用content-wrap类名包括起来
<div class="content-wrap">
<div class="item-titele">首页</div>
<div class="item-wrap">
<p>这是首页内容</p>
</div>
<div class="item-wrap">
<img src="https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1584188832771&di=da1b10a1eaef8f3434b7c6e60112eb5e&imgtype=0&src=http%3A%2F%2Fa3.att.hudong.com%2F14%2F75%2F01300000164186121366756803686.jpg"
alt="">
</div>
</div>
实现导航吸顶效果
通过jq的scroll
滚动的距离判断,这里出导航之前一些内容的高度
var bannerH = $('.banner').height() //导航之前高度
$(window).scroll(function () {
var scrollT = $(window).scrollTop()
if (scrollT >= bannerH) {
$('.list-item').addClass('fixed')
} else {
$('.list-item').removeClass('fixed')
}
})
楼层跳跃
点击导航,相当于锚点,内容显示当前位置
// 点击楼层跳跃
var flag = true //设置标识。防止出现跑马灯
$(".list-item li").click(function () {
flag = false
$(this).addClass("active").siblings().removeClass("active")
var index = $(this).index() //获取当前点击元素的索引
var top = $(".content-wrap").eq(index).offset().top - $('.list-item')
.height(); //获取每个内容到顶部的距离
$("html,body").stop(true).animate({
"scrollTop": top
}, function () {
flag = true
})
})
联动
循环遍历每一块内容,并计算高度,
if (flag) {
$(window).scroll(function () {
var scrollT = $(window).scrollTop()
var len = $(".content-wrap").size()
for (let i = 0; i < len; i++) {
var bannerGap = $(".content-wrap")[i].offsetTop - $('.list-item').height();
if (scrollT > bannerGap) {
$(".list-item li").eq(i).addClass("active").siblings().removeClass("active")
var listW = $('.list-item').height();
$('.list-item').css({
"left": -listW * i
})
}
}
})
}
最终所有的代码
<!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;
box-sizing: border-box;
}
.container {
width: 100%;
height: 100%;
}
.container .banner {
width: 100%;
}
.container .banner img {
width: 100%;
}
.tabs {
width: 100%;
}
.tabs .list-item {
display: -webkit-box;
list-style: none;
overflow: auto;
height: 40px;
line-height: 40px;
}
.tabs .list-item li {
padding: 0 20px;
}
.tabs .list-item li.active {
font-weight: bold;
color: blue;
}
.content-wrap {
width: 100%;
overflow: hidden;
}
.content-wrap .item-titele {
font-size: 16px;
color: blue;
}
.content-wrap .item-wrap {
padding: 10px 0;
}
.content-wrap .item-wrap img {
width: 100%;
}
.fixed {
position: fixed;
top: 0;
left: 0;
right: 0;
background: red;
}
</style>
</head>
<body>
<div class="container">
<div class="banner">
<img src="https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1584188832771&di=a53623de23653236964f146f9e409668&imgtype=0&src=http%3A%2F%2Fa0.att.hudong.com%2F27%2F10%2F01300000324235124757108108752.jpg"
alt="">
</div>
<div class="tabs">
<ul class="list-item">
<li class="active">首页</li>
<li>详情</li>
<li>新闻资讯</li>
<li>专题</li>
<li>图文列表</li>
<li>直播列表</li>
<li>短视频</li>
</ul>
</div>
<div class="content-wrap">
<div class="item-titele">首页</div>
<div class="item-wrap">
<p>这是首页内容</p>
</div>
<div class="item-wrap">
<img src="https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1584188832771&di=da1b10a1eaef8f3434b7c6e60112eb5e&imgtype=0&src=http%3A%2F%2Fa3.att.hudong.com%2F14%2F75%2F01300000164186121366756803686.jpg"
alt="">
</div>
</div>
<div class="content-wrap">
<div class="item-titele">详情</div>
<div class="item-wrap">
<p>在许多电影大片当中,我们常常会看到一种特殊的通讯设备,那就是卫星电话。</p>
<p>顾名思义,卫星电话的信号传输主要依靠卫星,而我们日常使用的手机则是通过地面基站通讯。</p>
<img src="http://image.thepaper.cn/www/image/45/229/937.jpg" alt="">
</div>
<div class="item-wrap">
<img src="http://image.thepaper.cn/www/image/45/229/944.jpg" alt="">
</div>
</div>
<div class="content-wrap">
<div class="item-titele">新闻资讯</div>
<div class="item-wrap">
<p>这是首页内容</p>
</div>
<div class="item-wrap">
<img src="http://image.thepaper.cn/www/image/45/229/944.jpg" alt="">
</div>
<div class="item-wrap">
<img src="http://image.thepaper.cn/www/image/45/229/937.jpg" alt="">
</div>
<div class="item-wrap">
<img src="http://image.thepaper.cn/www/image/45/229/944.jpg" alt="">
</div>
</div>
<div class="content-wrap">
<div class="item-titele">专题</div>
<div class="item-wrap">
<p>2020年春节期间,由于武汉突发疫情,全民上下都在为武汉加油,为中国加油。为了表达一名文艺工作者对前方将士们的敬仰和感激之情,于添琪与作家们连续录制了四首防疫公益歌曲。尤其是由玉镯儿作词,赵琳、傅滔作曲的《平安归来》得到了许多关注和好评。
</p>
</div>
<div class="item-wrap">
<img src="http://image.thepaper.cn/www/image/45/229/944.jpg" alt="">
</div>
</div>
<div class="content-wrap">
<div class="item-titele">图文列表</div>
<div class="item-wrap">
<p>这是首页内容这是首页内容这是首页内容这是首页内容这是首页内容这是首页内容这是首页内容这是首页内容这是首页内容这是首页内容这是首页内容这是首页内容这是首页内容这是首页内容这是首页内容</p>
</div>
<div class="item-wrap">
<img src="http://image.thepaper.cn/www/image/45/229/944.jpg" alt="">
</div>
</div>
<div class="content-wrap">
<div class="item-titele">直播列表</div>
<div class="item-wrap">
<p>这是首页内容</p>
</div>
<div class="item-wrap">
<img src="http://image.thepaper.cn/www/image/45/229/944.jpg" alt="">
<img src="http://image.thepaper.cn/www/image/45/229/943.jpg" alt="">
<img src="http://image.thepaper.cn/www/image/45/229/944.jpg" alt="">
</div>
</div>
<div class="content-wrap">
<div class="item-titele">短视频</div>
<div class="item-wrap">
<p>这是首页内容</p>
</div>
<div class="item-wrap">
<img src="https://cmsres.dianzhenkeji.com/anonymous/2020/2/11/1227228732289323008.jpg" alt="">
</div>
</div>
</div>
</body>
<script src="./jquery.js"></script>
<script>
$(function () {
var bannerH = $('.banner').height() //导航之前高度
$(window).scroll(function () {
var scrollT = $(window).scrollTop()
if (scrollT >= bannerH) {
$('.list-item').addClass('fixed')
} else {
$('.list-item').removeClass('fixed')
}
})
// 点击楼层跳跃
var flag = true //设置标识。防止出现跑马灯
$(".list-item li").click(function () {
flag = false
$(this).addClass("active").siblings().removeClass("active")
var index = $(this).index() //获取当前点击元素的索引
var top = $(".content-wrap").eq(index).offset().top - $('.list-item')
.height(); //获取每个内容到顶部的距离
$("html,body").stop(true).animate({
"scrollTop": top
}, function () {
flag = true
})
})
if (flag) {
$(window).scroll(function () {
var scrollT = $(window).scrollTop()
var len = $(".content-wrap").size()
for (let i = 0; i < len; i++) {
var bannerGap = $(".content-wrap")[i].offsetTop - $('.list-item').height();
if (scrollT > bannerGap) {
$(".list-item li").eq(i).addClass("active").siblings().removeClass("active")
var listW = $('.list-item').height();
$('.list-item').css({
"left": -listW * i
})
}
}
})
}
})
</script>
</html>