原生js写头部tab栏左右滑动支持移动端

本文介绍如何使用纯原生JavaScript实现一个响应式的导航栏,包括CSS样式设置、HTML结构搭建及通过触摸事件实现导航栏平滑滚动的完整代码。

前面有一篇功能较完善的,但是是jq和原生混搭的,有朋友只需要原生的,就做了个简单的;

1.css

*{margin: 0; padding: 0; box-sizing: border-box; text-decoration: none;list-style:none}
			html,body{width: 100%; overflow: hidden;} 
			#contentNav{width: 100%;margin-left:20px;height: 67px;overflow: hidden;}
			#contentNavul {height: 100%;transition: all ease 0s;}
			#contentNavul li{float: left;height: 65px;width: 105px; border: 1px solid #CCCCCC; text-align: center;
				color: #CCCCCC;line-height: 65px; margin-right: 10px;border-radius: 5px;font-size: 14px;}
			#contentNavul li.selected{background: blue;color: #FFFFFF}	

2.html

<div id="contentNav">
			<ul id="contentNavul">
				<li class="selected">演讲者模式</li>
				<li>声控模式</li>
				<li>固定画面模式</li>
				<li>轮播图模式</li>
				<li>模式1</li>
				<li>模式2</li>
				<li>模式3</li>
			</ul>
		</div>
3.原生js

var hg = window.screen.width;
			var contentNav = document.getElementById("contentNav");
			contentNav.style.width = (hg-40) +'px';
			
			var contentNavul = contentNav.getElementsByTagName('ul')[0];
			var ali = contentNavul.getElementsByTagName('li');
			contentNavul.style.width = ali.length*(ali[0].offsetWidth+10)+'px';
			
			for (var i=0;i<ali.length;i++) {
				ali[i].index=i;
				ali[i].onclick=function(){
					for (var j=0;j<ali.length;j++) {
						ali[j].className="";
					}
					ali[this.index].className="selected";
                                        tocenter(this.index); 
			};
			
                        function tocenter(index){
                var disX = ali[index].offsetLeft;//当前div距离屏幕左边距离
                var divWidth = ali[index].offsetWidth;
                var resPlaceX = (hg - divWidth) / 2;
                var moveDistance = disX - resPlaceX; 
                var a=getmarginleft(contentNavul.style.marginLeft);
                  var translateX = a + -moveDistance;
                  console.log(translateX)
                var maxleft=getmarginleft(contentNavul.style.width)-getmarginleft(contentNav.style.width);
                if(translateX > 0){
                    translateX = 0;
                }
                if(translateX < 0){
                    if(-translateX > maxleft){
                        translateX = -maxleft;
                    }else{
                        translateX = translateX;
                    }
                }
                contentNavul.style.marginLeft = translateX  +"px";
                
               }

			function getmarginleft(a){
				a=a.slice(a.indexOf('(') + 1,a.indexOf('px'));
		  		if (a == '') {a = 0};
		  		a= parseFloat(a); 
		  		return a;
			}
			var startX=0;
			var a=0;
			contentNavul.ontouchstart=function(e){
				var touchestartEv = e || event; 
				startX = touchestartEv.touches[0].clientX;
				a=getmarginleft(contentNavul.style.marginLeft);
			}
			
			contentNavul.ontouchmove=function(ev){
				var touchmoveEv = ev || event;
				var moveX = touchmoveEv.touches[0].clientX;;
				var translateX =startX - moveX - a;
				var maxleft=getmarginleft(contentNavul.style.width)-getmarginleft(contentNav.style.width);
				if(translateX > maxleft){
					translateX = maxleft;
				}
				if(translateX < 0){
					translateX = 0;
				}
				console.log(translateX);
				contentNavul.style.marginLeft = "-" + translateX  +"px";
			}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值