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 相关文章推荐
你需要知道的JavsScript可以做什么?
Jun 29 Javascript
关于this和self的使用说明
Aug 01 Javascript
jQuery判断复选框是否勾选的原理及示例
May 21 Javascript
JavaScript中的fontsize()方法使用详解
Jun 08 Javascript
JS组件Bootstrap实现弹出框和提示框效果代码
Dec 08 Javascript
HTML5 JS压缩图片并获取图片BASE64编码上传
Nov 16 Javascript
vue学习笔记之指令v-text &amp;&amp; v-html &amp;&amp; v-bind详解
May 12 Javascript
jQuery插件select2利用ajax高效查询大数据列表(可搜索、可分页)
May 19 jQuery
微信小程序中setInterval的使用方法
Sep 29 Javascript
vue实现个人信息查看和密码修改功能
May 06 Javascript
vue-router路由模式详解(小结)
Aug 26 Javascript
如何理解Vue简单状态管理之store模式
May 15 Vue.js
修改 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
复杂检索数据并分页显示的处理方法
2006/10/09 PHP
使用php伪造referer的方法 利用referer防止图片盗链
2014/01/20 PHP
thinkphp验证码显示不出来的解决方法
2014/03/29 PHP
Linux系统下使用XHProf和XHGui分析PHP运行性能
2015/12/08 PHP
CodeIgniter扩展核心类实例详解
2016/01/20 PHP
基于jquery 的一个progressbar widge
2010/10/29 Javascript
js Html结构转字符串形式显示代码
2011/11/15 Javascript
javascript 兼容所有浏览器的DOM扩展功能
2012/08/01 Javascript
js 一个关于图片onload加载的事
2013/11/10 Javascript
用jQuery实现的智能隐藏、滑动效果的返回顶部代码
2014/03/18 Javascript
JavaScript获取按钮所在form表单id的方法
2015/04/02 Javascript
jQuery 全选 全不选 事件绑定的实现代码
2017/01/23 Javascript
JS常用倒计时代码实例总结
2017/02/07 Javascript
jQuery实现链接的title快速出现的方法
2017/02/20 Javascript
js实现鼠标拖动功能
2017/03/20 Javascript
JS闭包用法实例分析
2017/03/27 Javascript
json对象及数组键值的深度大小写转换问题详解
2018/03/30 Javascript
解决Vue项目中tff报错的问题
2020/10/21 Javascript
Python 拷贝对象(深拷贝deepcopy与浅拷贝copy)
2008/09/06 Python
Flask入门之上传文件到服务器的方法示例
2018/07/18 Python
python requests post多层字典的方法
2018/12/27 Python
实时获取Python的print输出流方法
2019/01/07 Python
python3中calendar返回某一时间点实例讲解
2020/11/18 Python
Python3+Flask安装使用教程详解
2021/02/16 Python
巧用CSS3 border实现图片遮罩效果代码
2012/04/09 HTML / CSS
英国领先的豪华时尚家居网上商店:Amara
2019/08/12 全球购物
一套软件开发工程师笔试题
2015/05/18 面试题
生产经理的自我评价分享
2013/11/07 职场文书
安全教育实施方案
2014/03/02 职场文书
初中毕业生的自我评价
2014/03/03 职场文书
学生保证书范文
2014/04/28 职场文书
收款授权委托书
2014/10/02 职场文书
技术支持岗位职责
2015/02/13 职场文书
道歉情书大全
2015/05/12 职场文书
2015年幼儿园学前班工作总结
2015/05/18 职场文书
python爬虫之爬取笔趣阁小说
2021/04/22 Python