js 模拟今日头条导航栏(触屏)

本文介绍两种实现顶部导航点击后居中显示的方法:一种使用jQuery,通过计算元素位置实现平滑滚动;另一种使用Swiper轮播库,适用于不同版本,提供流畅的用户体验。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.jq 方式

1.1 代码 

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />
		<title></title>
		<style type="text/css"> header { width: 100%; overflow: hidden; white-space: nowrap; overflow-x: scroll; }  header::-webkit-scrollbar { display: none; }  .nav { display: inline-block; margin-left: 15px; margin-right: 10px; height: 50px; line-height: 50px; } </style>
		<script src="http://libs.baidu.com/jquery/2.0.0/jquery.min.js"></script>
	</head>
	<body>
		<header>
			<div class="nav"> 推荐 推荐 推荐 推荐 推荐 推荐 推荐 </div>
			<div class="nav"> 视频 </div>
			<div class="nav"> 新闻 </div>
			<div class="nav"> 体育 </div>
			<div class="nav"> 社会 </div>
			<div class="nav"> 娱乐 </div>
			<div class="nav"> 军事 推荐 推荐 推荐 推荐 推荐 </div>
			<div class="nav"> 人文 </div>
			<div class="nav"> 地理 </div>
			<div class="nav"> 历史 </div>
		</header>
		<script type="text/javascript">
			$(function() {
				$(".nav").on("click", function(ev) {
					var moveX = $(this).position().left + $(this).parent().scrollLeft();
					var pageX = document.documentElement.clientWidth;
					var blockWidth = $(this).width();
					console.log(moveX)
					console.log(pageX);
					console.log(blockWidth);
					var left = moveX - (pageX / 2) + (blockWidth / 2);
					console.log(left);
					$(this).css("color", "red").siblings().css("color", "#000000");
					$("header").scrollLeft(left);
				});
			});
		</script>
	</body>
</html>

1.2 效果 

2. swiper 方式

2.1  代码 (swiper为3.x的版本的方式)

<!DOCTYPE html>
<html>
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
		<title>今日头条APP顶部点击可居中导航</title>
		<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no" />
		<link href="https://cdn.bootcss.com/Swiper/3.4.2/css/swiper.css" rel="stylesheet">
		<script src="https://cdn.bootcss.com/Swiper/3.4.2/js/swiper.js"></script>
		<script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.js"></script>
		<style> * { margin: 0; padding: 0; }  #topNav { width: 100%; overflow: hidden; font: 16px/32px hiragino sans gb, microsoft yahei, simsun; border-bottom: 1px solid #f8f8f8; }  #topNav .swiper-slide { padding: 0 5px; letter-spacing: 2px; text-align: center; width: auto !important; }  #topNav .swiper-slide span { transition: all .3s ease; display: block; }  #topNav .active span { transform: scale(1.1); color: #FF2D2D; }  img { width: 100%; line-height: 0; } </style>
	</head>
	<body>
		<div id="topNav" class="swiper-container">
			<div class="swiper-wrapper">
				<span class="swiper-slide active"><span>推荐</span></span>
				<span class="swiper-slide"><span>热点热点热点热点</span></span>
				<span class="swiper-slide"><span>深圳</span></span>
				<span class="swiper-slide"><span>视频</span></span>
				<span class="swiper-slide"><span>社会</span></span>
				<span class="swiper-slide"><span>娱乐</span></span>
				<span class="swiper-slide"><span>科技</span></span>
				<span class="swiper-slide"><span>问答</span></span>
				<span class="swiper-slide"><span>汽车</span></span>
				<span class="swiper-slide"><span>财经</span></span>
				<span class="swiper-slide"><span>军事</span></span>
				<span class="swiper-slide"><span>体育</span></span>
				<span class="swiper-slide"><span>段子</span></span>
				<span class="swiper-slide"><span>美女</span></span>
				<span class="swiper-slide"><span>国际</span></span>
				<span class="swiper-slide"><span>趣图</span></span>
				<span class="swiper-slide"><span>健康</span></span>
				<span class="swiper-slide"><span>特产</span></span>
				<span class="swiper-slide"><span>房产</span></span>
			</div>
		</div>
		<script type="text/javascript">
			initSwiper();

			function initSwiper() {
				var mySwiper = new Swiper('#topNav', {
					freeMode: true,
					freeModeMomentumRatio: 0.5,
					slidesPerView: 'auto',
				});

				var swiperWidth = mySwiper.container[0].clientWidth,
					maxTranslate = mySwiper.maxTranslate(),
					maxWidth = -maxTranslate + swiperWidth / 2;

				$(".swiper-container").on('touchstart', function(e) {
					e.preventDefault()
				});

				mySwiper.on('tap', function(swiper, e) {

					//	e.preventDefault()

					var slide = swiper.slides[swiper.clickedIndex],
						slideLeft = slide.offsetLeft,
						slideWidth = slide.clientWidth,
						slideCenter = slideLeft + slideWidth / 2;
					// 被点击slide的中心点
					mySwiper.setWrapperTransition(300)
					if(slideCenter < swiperWidth / 2) {
						mySwiper.setWrapperTranslate(0)
					} else if(slideCenter > maxWidth) {
						mySwiper.setWrapperTranslate(maxTranslate)
					} else {
						nowTlanslate = slideCenter - swiperWidth / 2
						mySwiper.setWrapperTranslate(-nowTlanslate)
					}
					$("#topNav  .active").removeClass('active')
					$("#topNav .swiper-slide").eq(swiper.clickedIndex).addClass('active')
				});
			}
		</script>
	</body>
</html>

2.2 或者 用 swiper 为 4.x 的版本  (和3.x的版本的区别就是swiper的某些方法使用发生了变化而已,原理相同)

<!DOCTYPE html>
<html>

<head>
	<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
	<title>今日头条APP顶部点击可居中导航</title>
	<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no" />

	<link href="https://cdn.bootcss.com/Swiper/4.5.0/css/swiper.css" rel="stylesheet">
	<script src="https://cdn.bootcss.com/Swiper/4.5.0/js/swiper.js"></script>
	<script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.js"></script>
	<style> * { margin: 0; padding: 0; }  #topNav { width: 100%; overflow: hidden; font: 16px/32px hiragino sans gb, microsoft yahei, simsun; border-bottom: 1px solid #f8f8f8; }  #topNav .swiper-slide { padding: 0 5px; letter-spacing: 2px; text-align: center; width: auto !important; }  #topNav .swiper-slide span {  transition: all .3s ease; display: block; }  #topNav .active span { transform: scale(1.1); color: #FF2D2D; }  img { width: 100%; line-height: 0; } </style>
</head>
<body>
	<div id="topNav" class="swiper-container">
		<div class="swiper-wrapper">
			<span class="swiper-slide active"><span>推荐</span></span>
			<span class="swiper-slide"><span>热点热点热点热点</span></span>
			<span class="swiper-slide"><span>深圳</span></span>
			<span class="swiper-slide"><span>视频</span></span>
			<span class="swiper-slide"><span>社会</span></span>
			<span class="swiper-slide"><span>娱乐</span></span>
			<span class="swiper-slide"><span>科技</span></span>
			<span class="swiper-slide"><span>问答</span></span>
			<span class="swiper-slide"><span>汽车</span></span>
			<span class="swiper-slide"><span>财经</span></span>
			<span class="swiper-slide"><span>军事</span></span>
			<span class="swiper-slide"><span>体育</span></span>
			<span class="swiper-slide"><span>段子</span></span>
			<span class="swiper-slide"><span>美女</span></span>
			<span class="swiper-slide"><span>国际</span></span>
			<span class="swiper-slide"><span>趣图</span></span>
			<span class="swiper-slide"><span>健康</span></span>
			<span class="swiper-slide"><span>特产</span></span>
			<span class="swiper-slide"><span>房产</span></span>
		</div>
	</div>
	<script type="text/javascript">
			var mySwiper = new Swiper('#topNav', {
				freeMode: true,
				freeModeMomentumRatio: 0.5,
				slidesPerView: 'auto',
				touchStartPreventDefault : false,
				on:{
					click:function(event){
						var swiperWidth = mySwiper.width,
							maxTranslate = mySwiper.maxTranslate(),
							maxWidth = -maxTranslate + swiperWidth / 2;
						var slide = mySwiper.slides[mySwiper.clickedIndex],
							slideLeft = slide.offsetLeft,
							slideWidth = slide.clientWidth,
							slideCenter = slideLeft + slideWidth / 2;
						// 被点击slide的中心点
						mySwiper.setTransition(300)
						if (slideCenter < swiperWidth / 2) {
							mySwiper.setTranslate(0)
						} else if (slideCenter > maxWidth) {
							mySwiper.setTranslate(maxTranslate)
						} else {
							nowTlanslate = slideCenter - swiperWidth / 2
							mySwiper.setTranslate(-nowTlanslate)
						}
						$("#topNav  .active").removeClass('active')
						$("#topNav .swiper-slide").eq(mySwiper.clickedIndex).addClass('active')
					}
				}
			});
	</script>
</body>
</html>

2.3效果

3. 说明

3.1 地址:https://segmentfault.com/q/1010000009997299/

3.2 地址: https://www.sucaihuo.com/js/2249.html

3.3 小程序效果:https://blog.youkuaiyun.com/hangGe0111/article/details/101014033

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值