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的插件教程(Plugin)
Sep 03 Javascript
解决jquery .ajax 在IE下卡死问题的解决方法
Oct 26 Javascript
来自国外的页面JavaScript文件优化
Dec 08 Javascript
JS事件Event元素(兼容IE,Firefox,Chorme)
Nov 01 Javascript
js比较和逻辑运算符的介绍
Mar 10 Javascript
AngularJS中的表单简单入门
Jul 28 Javascript
Bootstrap笔记—折叠实例代码
Mar 13 Javascript
在一般处理程序(ashx)中弹出js提示语
Aug 16 Javascript
详解vue移动端日期选择组件
Feb 22 Javascript
Vue自定义弹窗指令的实现代码
Aug 13 Javascript
jQuery设置下拉框显示与隐藏效果的方法分析
Sep 15 jQuery
Openlayers实现扩散的动态点(水纹效果)
Aug 17 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
PHP怎样调用MSSQL的存储过程
2006/10/09 PHP
php中自定义函数dump查看数组信息类似var_dump
2014/01/27 PHP
详解提高使用Java反射的效率方法
2019/04/29 PHP
实现JavaScript中继承的三种方式
2009/10/16 Javascript
网页图片延时加载的js代码
2010/04/22 Javascript
禁止空格提交表单的js代码
2013/11/17 Javascript
js函数模拟显示桌面.scf程序示例
2014/04/20 Javascript
jQuery中trigger()与bind()用法分析
2015/12/18 Javascript
尝试动手制作javascript放大镜效果
2015/12/25 Javascript
jQuery控制文本框只能输入数字和字母及使用方法
2016/05/26 Javascript
Jquery揭秘系列:ajax原生js实现详解(推荐)
2016/06/08 Javascript
AngularJS  $modal弹出框实例代码
2016/08/24 Javascript
jQuery实现仿京东防抖动菜单效果示例
2018/07/06 jQuery
Vue-cli3.X使用px2 rem遇到的问题及解决方法
2019/08/08 Javascript
Vue+iview+webpack ie浏览器兼容简单处理
2019/09/20 Javascript
JavaScript 常见的继承方式汇总
2020/09/17 Javascript
[03:40]DOTA2抗疫特别篇《英雄年代》
2020/02/28 DOTA
Python中捕捉详细异常信息的代码示例
2014/09/18 Python
Python使用Pycrypto库进行RSA加密的方法详解
2016/06/06 Python
基于python的selenium两种文件上传操作实现详解
2019/09/19 Python
TensorFlow实现保存训练模型为pd文件并恢复
2020/02/06 Python
完美解决pycharm导入自己写的py文件爆红问题
2020/02/12 Python
Python手动或自动协程操作方法解析
2020/06/22 Python
美国顶级品牌男士大码服装店:DXL
2017/08/30 全球购物
台湾时尚彩瞳专门店:imeime
2019/08/16 全球购物
墨西哥购物网站:Elektra
2020/01/21 全球购物
银行实习人员自我鉴定
2013/09/22 职场文书
优秀体育委员自荐书
2014/01/31 职场文书
婚礼司仪主持词
2014/03/14 职场文书
2014卖家双十一活动策划书
2014/09/29 职场文书
酒店仓管员岗位职责
2015/04/01 职场文书
《鲸》教学反思
2016/02/23 职场文书
员工工作心得体会
2019/05/07 职场文书
Pyhton模块和包相关知识总结
2021/05/12 Python
Python 用户输入和while循环的操作
2021/05/23 Python
css3属性选择器 “~”(波浪号) “,”(逗号) “+”(加号)和 “>”(大于号)
2022/04/19 HTML / CSS