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 相关文章推荐
js异步加载的三种解决方案
Mar 04 Javascript
window.navigate 与 window.location.href 的使用区别介绍
Sep 21 Javascript
jquery 删除字符串最后一个字符的方法解析
Feb 11 Javascript
jquery的ajax跨域请求原理和示例
May 08 Javascript
多个$(document).ready()的执行顺序实例分析
Jul 26 Javascript
JavaScript字符串对象split方法入门实例(用于把字符串分割成数组)
Oct 16 Javascript
javascript使用正则表达式检测IP地址
Dec 03 Javascript
JavaScript将一个数组插入到另一个数组的方法
Mar 19 Javascript
Jquery Easyui验证组件ValidateBox使用详解(20)
Dec 18 Javascript
小程序多图列表实现性能优化的方法步骤
May 28 Javascript
一个手写的vue放大镜效果
Aug 09 Javascript
vue+element 实现商城主题开发的示例代码
Mar 26 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中导出数据到excel时数字变为科学计数的解决方法
2013/02/03 PHP
用 Composer构建自己的 PHP 框架之基础准备
2014/10/30 PHP
php微信公众平台开发类实例
2015/04/01 PHP
PHP register_shutdown_function()函数的使用示例
2015/06/23 PHP
PHP实现简单的新闻发布系统实例
2015/07/28 PHP
php邮箱地址正则表达式验证
2015/11/13 PHP
php获取给定日期相差天数的方法分析
2017/02/20 PHP
thinkphp框架page类与bootstrap分页(美化)
2017/06/25 PHP
PHP封装类似thinkphp连贯操作数据库Db类与简单应用示例
2019/05/08 PHP
Yii框架的布局文件实例分析
2019/09/04 PHP
PHP数组与字符串互相转换实例
2020/05/05 PHP
通过修改referer下载文件的方法
2008/05/11 Javascript
js返回前一页刷新本页重载页面
2014/07/29 Javascript
Javascript对象字面量的理解
2016/06/22 Javascript
JS获取多维数组中相同键的值实现方法示例
2017/01/06 Javascript
JavaScript 事件对内存和性能的影响
2017/01/22 Javascript
JQuery form表单提交前验证单选框是否选中、删除记录时验证经验总结(整理)
2017/06/09 jQuery
vue.js多页面开发环境搭建过程
2019/04/24 Javascript
Vue 使用Props属性实现父子组件的动态传值详解
2019/11/13 Javascript
python中函数总结之装饰器闭包详解
2016/06/12 Python
python设定并获取socket超时时间的方法
2019/01/12 Python
django基于存储在前端的token用户认证解析
2019/08/06 Python
Pytorch抽取网络层的Feature Map(Vgg)实例
2019/08/20 Python
Python requests获取网页常用方法解析
2020/02/20 Python
Python带参数的装饰器运行原理解析
2020/06/09 Python
Python3爬虫中关于中文分词的详解
2020/07/29 Python
美国高端医师级美容产品电商:BeautifiedYou.com
2017/04/17 全球购物
一道SQL存储过程面试题
2016/10/07 面试题
寒假实习自荐信
2014/01/26 职场文书
优秀学生获奖感言
2014/02/15 职场文书
运动会报道稿300字
2014/10/02 职场文书
民警群众路线教育实践活动对照检查材料
2014/10/04 职场文书
法院干警四风问题个人对照检查材料思想汇报
2014/10/07 职场文书
教师聘用意向书
2015/05/11 职场文书
Python绘制分类图的方法
2021/04/20 Python
javascript实现计算器功能详解流程
2021/11/01 Javascript