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 相关文章推荐
写了一个layout,拖动条连贯,内容区可为iframe
Aug 19 Javascript
javascript高亮效果的二种实现方法
Sep 14 Javascript
jquery 提交值不为空的元素示例代码
May 10 Javascript
JavaScript中扩展Array contains方法实例
Aug 23 Javascript
javascript事件模型介绍
May 31 Javascript
Bootstrap 附加导航(Affix)插件实例详解
Jun 01 Javascript
AngularJS用户选择器指令实例分析
Nov 04 Javascript
详解PHP中pathinfo()函数导致的安全问题
Jan 05 Javascript
Bootstrap table使用方法总结
May 10 Javascript
基于angular2 的 http服务封装的实例代码
Jun 29 Javascript
vue-cli3+typescript初体验小结
Feb 28 Javascript
express中static中间件的具体使用方法
Oct 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生成唯一订单号
2015/07/05 PHP
深入解析Laravel5.5中的包自动发现Package Auto Discovery
2017/09/13 PHP
mac pecl 安装php7.1扩展教程
2019/10/17 PHP
PHP常见的序列化与反序列化操作实例分析
2019/10/28 PHP
php中try catch捕获异常实例详解
2020/08/06 PHP
ExtJS Grid使用SimpleStore、多选框的方法
2009/11/20 Javascript
Ajax提交与传统表单提交的区别说明
2014/02/07 Javascript
在Ubuntu系统上安装Node.JS的教程
2015/10/15 Javascript
JavaScript第一篇之实现按钮全选、功能
2016/08/21 Javascript
基于Layer+jQuery的自定义弹框
2020/05/26 Javascript
学习vue.js条件渲染
2016/12/03 Javascript
原生javascript实现图片放大镜效果
2017/01/18 Javascript
如何使用Bootstrap创建表单
2017/03/29 Javascript
Mac中安装nvm的教程分享
2017/12/11 Javascript
使用express搭建一个简单的查询服务器的方法
2018/02/09 Javascript
使用jquery DataTable和ajax向页面显示数据列表的方法
2018/08/09 jQuery
python添加模块搜索路径方法
2017/09/11 Python
浅谈使用Python变量时要避免的3个错误
2017/10/30 Python
解决安装pyqt5之后无法打开spyder的问题
2019/12/13 Python
Pytorch在NLP中的简单应用详解
2020/01/08 Python
Python实现自动访问网页的例子
2020/02/21 Python
利用CSS3制作简单的3d半透明立方体图片展示
2017/03/25 HTML / CSS
美国祛痘、抗衰老药妆品牌:Murad
2016/08/27 全球购物
德国宠物用品、宠物食品及水族馆网上商店:ZooRoyal
2017/07/09 全球购物
澳大利亚墨水站Ink Station:墨水和碳粉打印机墨盒
2019/03/24 全球购物
俄罗斯品牌服装和鞋子的在线商店:KUPIVIP
2019/10/27 全球购物
美国沙龙美发产品购物网站:Hair.com by L’Oreal
2020/11/09 全球购物
餐厅经理岗位职责和岗位目标
2014/02/13 职场文书
幼儿教师工作感言
2014/02/14 职场文书
优秀少先队工作者事迹材料
2014/05/13 职场文书
会计专业自荐信范文
2015/03/05 职场文书
导师鉴定意见
2015/06/05 职场文书
小学四年级班务总结该怎么写?
2019/08/16 职场文书
python爬取网页版QQ空间,生成各类图表
2021/06/02 Python
SpringBoot2 参数管理实践之入参出参与校验的方式
2021/06/16 Java/Android
SQL实现LeetCode(197.上升温度)
2021/08/07 MySQL