js实现水平滚动菜单导航


Posted in Javascript onJuly 21, 2017

项目中用到了滚动导航,但是默认的滚动条太丑了,只好用js自己模拟了一个。凑合用可以,不算完美。希望以后有机会再来修饰一下。

先来看下最终效果:

js实现水平滚动菜单导航

最终效果

先看html结构:

<div id='root' class="root">
 <ul class="list" id="list">
 <li>全单1</li>
 <li>全部菜2单</li>
 <li>全部3单</li>
 <li>菜单4</li>
 <li>全菜单</li>
 <li>全部5菜单</li>
 <li>全6单</li>
 <li>全6部菜单</li>
 <li>全菜7单</li>
 <li>全8单</li>
 <li>全部5菜单</li>
 <li>全6单</li>
 <li>全6部菜单</li>
 <li>全菜7单</li>
 <li>全8单</li>
 <li>全9部菜单</li>
 <li>全10单</li>
 <li>全11部单</li>
 <li>菜2单</li>
 <li>全菜12单</li>
 <li>全32部菜单</li>
 </ul>
</div>

说一下,末尾我给加了阴影的效果:

.root:before{
 display: block;
 content: '';
 width: 20px;
 height:100%;
 background: rgba(111,111,111,0);
 box-shadow: 2px 2px 32px 2px #999;
 position: absolute;
 right:-20px;
 top:0;
 }

其它的样式代码:

*{
 margin: 0;
 padding:0;
 font-family: "Microsoft YaHei UI";
 }
 #root{
 height:60px;
 width: 800px;
 white-space: nowrap;
 overflow: hidden;
 -webkit-overflow-scrolling: touch;
 white-space: nowrap;
 position: relative;
 border-bottom: 1px solid #eee;
 padding-right: 20px;
 background-color: #f5f5f5;
 margin-left: 100px;
 margin-top: 50px;
 }
 .root:before{
 display: block;
 content: '';
 width: 20px;
 height:100%;
 background: rgba(111,111,111,0);
 box-shadow: 2px 2px 32px 2px #999;
 position: absolute;
 right:-20px;
 top:0;
 }
 .list{
 position: absolute;
 left:0;
 top:0;
 /*width: 100%;*/ /*不能为100%,不然宽度只有父容器的宽度,我掉进这个坑了。*/
 transition: all 1s;
 height:100%;
 line-height: 2.5;
 }
 .on{
 color:red;
 font-weight: bold;
 }
 .off{
 color: #000;
 font-weight:normal;
 }
 .list li{
 display: inline-block;
 padding:10px 20px;
 cursor: pointer;
 }

下面是js的逻辑部分:

var box = document.getElementById('root'); //外面的容器。
 var listBox = document.getElementById('list'); //ul列表。主要是移动它的left值
 var list = document.getElementsByTagName('li');//所有列表元素
 var width = box.clientWidth /2; //为了判断是左滑还是右滑
 var totalWidth = 0; 
 for(let i=0;i<list.length;i++){
  totalWidth = totalWidth + list[i].offsetWidth; //所有列表元素的总宽度
 }
 for(let i=0;i<list.length;i++){
  var _offset = totalWidth - box.clientWidth; //右边的偏移量
  list[i].addEventListener('click', function (e) {
   for(let j=0;j<list.length;j++){
    list[j].className = 'off'; //移除所有元素的样式
   }
   list[i].className = 'on';  //给点击的元素添加样式
   var offset =totalWidth - (Math.abs(listBox.offsetLeft) + box.clientWidth) + 100; //右边的偏移量 = 所有元素宽度之和 - (ul容器的左偏移量 + 父容器的宽度)
   if(e.pageX > width && offset > 0){ //点击右侧并且右侧的偏移量大于0,左滑。
    listBox.style.left = (listBox.offsetLeft-200) + 'px';
   }else if(e.pageX > width && offset > 200){ //临界位置,,右侧滚动到末尾
    listBox.style.left = -_offset + 'px';
   }
   if(e.pageX < width && listBox.offsetLeft < -200) { //点击左侧并且左侧的偏移量小于0,左滑。
    listBox.style.left = (listBox.offsetLeft + 200) + 'px';

   }else if(e.pageX < width && listBox.offsetLeft < 0){ //临界位置,左侧滚到开始的位置
    listBox.style.left = 0
   }

  });

 }

点击如下所示:

js实现水平滚动菜单导航

还有些不完善的地方,求各位大神指正。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jquery操作select详解(取值,设置选中)
Feb 07 Javascript
js实现DOM走马灯特效的方法
Jan 21 Javascript
JS+CSS实现下拉列表框美化效果(3款)
Aug 15 Javascript
基于Bootstrap的后台管理面板 Bootstrap Metro Dashboard
Jun 17 Javascript
AngularJS包括详解及示例代码
Aug 17 Javascript
基于easyui checkbox 的一些操作处理方法
Jul 10 Javascript
浅谈node模块与npm包管理工具
Jan 03 Javascript
vue-cli常用设置总结
Feb 24 Javascript
js设置鼠标悬停改变背景色实现详解
Jun 26 Javascript
JS数组方法slice()用法实例分析
Jan 18 Javascript
使用Vue-scroller页面input框不能触发滑动的问题及解决方法
Aug 08 Javascript
JavaScript中10个Reduce常用场景技巧
Jun 21 Javascript
修改 bootstrap table 默认detailRow样式的实例代码
Jul 21 #Javascript
JavaScript实现购物车基本功能
Jul 21 #Javascript
解决html input验证只能输入数字,不能输入其他的问题
Jul 21 #Javascript
js案例之鼠标跟随jquery版(实例讲解)
Jul 21 #jQuery
基于input框覆盖掉数字英文的实例讲解
Jul 21 #Javascript
浅谈通过JS拦截 pushState和replaceState事件
Jul 21 #Javascript
用Vue-cli搭建的项目中引入css报错的原因分析
Jul 20 #Javascript
You might like
自制短波长线天线频率预选器 - 成功消除B2K之流的镜像
2021/03/02 无线电
php+jquery编码方面的一些心得(utf-8 gb2312)
2010/10/12 PHP
Yii2 批量插入、更新数据实例
2017/03/15 PHP
Thinkphp5.0框架的Db操作实例分析【连接、增删改查、链式操作等】
2019/10/11 PHP
thinkphp框架表单数组实现图片批量上传功能示例
2020/04/04 PHP
javascript 建设银行登陆键盘
2008/06/10 Javascript
JavaScript中的Web worker多线程API研究
2014/12/06 Javascript
javascript中函数作为参数调用的方法
2015/02/09 Javascript
jquery中表单 多选框的一种巧妙写法
2015/09/06 Javascript
Node.js本地文件操作之文件拷贝与目录遍历的方法
2016/02/16 Javascript
JavaScript通过使用onerror设置默认图像显示代替alt
2016/03/01 Javascript
AngularJS基于ngInfiniteScroll实现下拉滚动加载的方法
2016/12/14 Javascript
BootStrap学习笔记之nav导航栏和面包屑导航
2017/01/03 Javascript
JS jQuery使用正则表达式去空字符的简单实现代码
2017/05/20 jQuery
JavaScript动态添加数据到表单并提交的几种方式
2019/06/26 Javascript
vue实现评价星星功能
2020/06/30 Javascript
如何通过JS实现日历简单算法
2020/10/14 Javascript
Python collections模块实例讲解
2014/04/07 Python
python抓取百度首页的方法
2015/05/19 Python
基于pandas数据样本行列选取的方法
2018/04/20 Python
对django中render()与render_to_response()的区别详解
2018/10/16 Python
使用django-guardian实现django-admin的行级权限控制的方法
2018/10/30 Python
python接口自动化(十六)--参数关联接口后传(详解)
2019/04/16 Python
Django 拆分model和view的实现方法
2019/08/16 Python
Lancer Skincare官方网站:抗衰老皮肤护理
2020/11/20 全球购物
C语言编程练习
2012/04/02 面试题
产品促销活动策划书
2014/01/15 职场文书
普通员工辞职信
2014/01/17 职场文书
不服从上级领导安排的检讨书
2014/09/14 职场文书
文明家庭事迹材料
2014/12/20 职场文书
费用申请报告范文
2015/05/15 职场文书
学校教学工作总结2015
2015/05/19 职场文书
神秘岛读书笔记
2015/07/01 职场文书
祝福语集锦:朋友新店开业祝福语
2019/12/10 职场文书
Java并发编程必备之Future机制
2021/06/30 Java/Android
JS class语法糖的深入剖析
2022/07/07 Javascript