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获得IE版本不准确webbrowser的解决方法
Feb 23 Javascript
JavaScript中使用typeof运算符需要注意的几个坑
Nov 08 Javascript
javascript实现根据身份证号读取相关信息
Dec 17 Javascript
jquery搜索框效果实现方法
Jan 16 Javascript
javascript中关于&amp;&amp; 和 || 表达式的小技巧分享
Apr 10 Javascript
使用jquery/js获取iframe父子级、同级获取元素的方法
Aug 05 Javascript
使用bootstrapValidator插件进行动态添加表单元素并校验
Sep 28 Javascript
JavaScript实现窗口抖动效果
Oct 19 Javascript
AngularJS入门教程之与服务器(Ajax)交互操作示例【附完整demo源码下载】
Nov 02 Javascript
关于Vue Webpack2单元测试示例详解
Aug 14 Javascript
解决vue项目获取dom元素宽高总是不准确问题
Jul 29 Javascript
vue 组件简介
Jul 31 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实现数组按指定KEY排序的方法
2015/03/30 PHP
PHP版QQ互联OAuth示例代码分享
2015/07/05 PHP
php数字每三位加逗号的功能函数
2015/10/22 PHP
PHP+AJAX 投票器功能
2017/11/11 PHP
PHP 模拟登陆功能实例详解
2019/09/10 PHP
laravel withCount 统计关联数量的方法
2019/10/10 PHP
PHP发送邮件确认验证注册功能示例【修改别人邮件类】
2019/11/09 PHP
PHP的图像处理实例小结【文字水印、图片水印、压缩图像等】
2019/12/20 PHP
jQuery学习笔记[1] jQuery中的DOM操作
2010/12/03 Javascript
推荐40个非常优秀的jQuery插件和教程【系列三】
2011/11/09 Javascript
jQuery CSS()方法改变现有的CSS样式表
2014/09/09 Javascript
jquery实现全选功能效果的实现代码
2016/05/05 Javascript
JavaScript实现相册弹窗功能(zepto.js)
2016/06/21 Javascript
bootstrap Table插件使用demo
2017/08/07 Javascript
在 vue-cli v3.0 中使用 SCSS/SASS的方法
2018/06/14 Javascript
Vue列表如何实现滚动到指定位置样式改变效果
2020/05/09 Javascript
详解Django框架中的视图级缓存
2015/07/23 Python
详解python eval函数的妙用
2017/11/16 Python
详解Python多线程下的list
2020/07/03 Python
python邮件中附加文字、html、图片、附件实现方法
2021/01/04 Python
CSS3之边框多颜色Border-color属性使用示例
2013/10/11 HTML / CSS
TripAdvisor德国:全球领先的旅游网站
2017/12/07 全球购物
英国家庭珠宝商:T. H. Baker
2018/02/08 全球购物
比利时的在线灯具店:Lampen24.be
2019/07/01 全球购物
娇韵诗俄罗斯官方网站:Clarins俄罗斯
2020/10/03 全球购物
外贸实习生自荐信范文
2013/11/24 职场文书
毕业生的自我评价范文
2013/12/31 职场文书
致800米运动员广播稿
2014/02/16 职场文书
小学生纪念九一八事变演讲稿
2014/09/14 职场文书
销售员未完成销售业绩的检讨书
2014/10/12 职场文书
群众路线专项整治工作情况报告
2014/10/28 职场文书
2014年项目经理工作总结
2014/11/24 职场文书
暑假安全保证书
2015/02/28 职场文书
离职证明范本
2015/06/12 职场文书
欠条范文
2015/07/03 职场文书
Redis 配置文件重要属性的具体使用
2021/05/20 Redis