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 相关文章推荐
怎么让脚本或里面的函数在所有图片都载入完毕的时候执行
Oct 17 Javascript
prettify 代码高亮着色器google出品
Dec 28 Javascript
treepanel动态加载数据实现代码
Dec 15 Javascript
基于jQuery实现多层次的手风琴效果附源码
Sep 21 Javascript
浅谈JavaScript 执行环境、作用域及垃圾回收
May 31 Javascript
Ajax跨域实现代码(后台jsp)
Jan 21 Javascript
jQuery滚动插件scrollable.js用法分析
May 25 jQuery
EasyUI创建人员树的实例代码
Sep 15 Javascript
vue使用element-ui的el-input监听不了回车事件的解决方法
Jan 12 Javascript
koa-router路由参数和前端路由的结合详解
May 19 Javascript
Vue.extend 登录注册模态框的实现
Dec 29 Vue.js
JavaScript实现复选框全选功能
Apr 11 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
咖啡豆要不要放冰箱的原因
2021/03/04 冲泡冲煮
php 变量未定义等错误的解决方法
2011/01/12 PHP
浅谈PHP解析URL函数parse_url和parse_str
2014/11/11 PHP
php图片上传类 附调用方法
2016/05/15 PHP
IE6下focus与blur错乱的解决方案
2011/07/31 Javascript
toggle一个div显示或隐藏且可扩展成自定义下拉框
2013/09/12 Javascript
jQuery实现Email邮箱地址自动补全功能代码
2015/11/03 Javascript
javascript仿百度输入框提示自动下拉补全
2016/01/07 Javascript
javascript断点调试心得分享
2016/04/23 Javascript
如何在js代码中消灭for循环实例详解
2018/07/29 Javascript
浅谈微信小程序之官方UI框架we-ui使用教程
2018/08/20 Javascript
Vuejs开发环境搭建及热更新【推荐】
2018/09/07 Javascript
JS数组去重的6种方法完整实例
2018/12/08 Javascript
怎样使你的 JavaScript 代码简单易读(推荐)
2019/04/16 Javascript
纯异步nodejs文件夹(目录)复制功能
2019/09/03 NodeJs
记一次react前端项目打包优化的方法
2020/03/30 Javascript
Element Steps步骤条的使用方法
2020/07/26 Javascript
[01:11:21]DOTA2-DPC中国联赛 正赛 Phoenix vs CDEC BO3 第三场 3月7日
2021/03/11 DOTA
Django 表单模型选择框如何使用分组
2019/05/16 Python
Python GUI库PyQt5样式QSS子控件介绍
2020/02/25 Python
基于Python脚本实现邮件报警功能
2020/05/20 Python
Python 整行读取文本方法并去掉readlines换行\n操作
2020/09/03 Python
Python爬虫实现selenium处理iframe作用域问题
2021/01/27 Python
详解如何在css3打包后自动追加前缀插件:autoprefixer
2018/12/18 HTML / CSS
第一范式(1NF)、第二范式(2NF)和第三范式(3NF)之间的区别是什么?
2016/04/28 面试题
.NET笔试题(20个问题)
2016/02/02 面试题
高分子材料个人求职信范文
2013/09/25 职场文书
高中语文课后反思
2014/04/27 职场文书
爱岗敬业演讲稿
2014/05/05 职场文书
书法兴趣小组活动总结
2014/07/07 职场文书
软件测试专业推荐信
2014/09/18 职场文书
群众路线教育实践活动方案
2014/10/31 职场文书
郭明义观后感
2015/06/08 职场文书
Python中zipfile压缩包模块的使用
2021/05/14 Python
Python中for后接else的语法使用
2021/05/18 Python
Logback 使用TurboFilter实现日志级别等内容的动态修改操作
2021/08/30 Java/Android