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 相关文章推荐
网页自动刷新,不产生嗒嗒声的一个解决方法
Mar 27 Javascript
javascript管中窥豹 形参与实参浅析
Dec 17 Javascript
将两个div左右并列显示并实现点击标题切换内容
Oct 22 Javascript
javascript中var的重要性分析
Feb 11 Javascript
JavaScript中的getTimezoneOffset()方法使用详解
Jun 10 Javascript
学习JavaScript设计模式之享元模式
Jan 18 Javascript
JS中使用apply方法通过不同数量的参数调用函数的方法
May 31 Javascript
BootStrap智能表单实战系列(十一)级联下拉的支持
Jun 13 Javascript
高效Web开发的10个jQuery代码片段
Jul 22 Javascript
深入理解Node中的buffer模块
Jun 03 Javascript
详解vue或uni-app的跨域问题解决方案
Feb 21 Javascript
简单了解常用的JavaScript 库
Jul 16 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边学边教》(02.Apache+PHP环境配置――上篇)
2006/12/13 PHP
PHP数组实例总结与说明
2011/08/23 PHP
浅析Yii2 GridView实现下拉搜索教程
2016/04/22 PHP
PHP实现的多维数组排序算法分析
2018/02/10 PHP
使用laravel和ECharts实现折线图效果的例子
2019/10/09 PHP
基于thinkphp6.0的success、error实现方法
2019/11/05 PHP
jquery实现漂浮在网页右侧的qq在线客服插件示例
2013/05/13 Javascript
JS正则表达式获取分组内容的方法详解
2013/11/15 Javascript
jquery实现导航固定顶部的效果仿蘑菇街
2014/10/22 Javascript
js实现模拟计算器退格键删除文字效果的方法
2015/05/07 Javascript
微信小程序开发之录音机 音频播放 动画实例 (真机可用)
2016/12/08 Javascript
Bootstrap 设置datetimepicker在屏幕上面弹出设置方法
2017/03/21 Javascript
解决AngualrJS页面刷新导致异常显示问题
2017/04/20 Javascript
JavaScript实现简单的星星评分效果
2017/05/18 Javascript
javascript面向对象三大特征之封装实例详解
2019/07/24 Javascript
vue-resourc发起异步请求的方法
2020/02/11 Javascript
原生JS实现萤火虫效果
2020/03/07 Javascript
[01:18:21]EG vs TNC Supermajor小组赛B组败者组第一轮 BO3 第一场 6.2
2018/06/03 DOTA
仅用50行Python代码实现一个简单的代理服务器
2015/04/08 Python
Python语言生成水仙花数代码示例
2017/12/18 Python
解决python 未发现数据源名称并且未指定默认驱动程序的问题
2018/12/07 Python
详解Python3 对象组合zip()和回退方式*zip
2019/05/15 Python
python交易记录链的实现过程详解
2019/07/03 Python
解决pycharm下os.system执行命令返回有中文乱码的问题
2019/07/07 Python
使用pandas读取文件的实现
2019/07/31 Python
Python使用jupyter notebook查看ipynb文件过程解析
2020/06/02 Python
Python爬虫headers处理及网络超时问题解决方案
2020/06/19 Python
美国最大的骑马用品零售商:HorseLoverZ
2017/01/12 全球购物
如何将字串String转换成整数int
2015/02/21 面试题
通信工程专业毕业生推荐信
2013/12/25 职场文书
最新结婚典礼主持词
2014/03/14 职场文书
2014年个人教学工作总结
2014/12/09 职场文书
浅谈JS的原型和原型链
2021/06/04 Javascript
Java 写一个简单的图书管理系统
2022/04/26 Java/Android
Win11 21h2可以升级22h2吗?看看你的电脑符不符合要求
2022/07/07 数码科技
SpringBoot详解自定义Stater的应用
2022/07/15 Java/Android