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 $.ajax入门应用二
Nov 19 Javascript
jquery获取iframe中的dom对象(两种方法)
Jul 02 Javascript
在js文件中如何获取basePath处理js路径问题
Jul 10 Javascript
弹出最简单的模式化遮罩层的js代码
Dec 04 Javascript
node.js中的fs.utimesSync方法使用说明
Dec 15 Javascript
AngularJS身份验证的方法
Feb 17 Javascript
AngularJS中的表单简单入门
Jul 28 Javascript
Node.js查找当前目录下文件夹实例代码
Mar 07 Javascript
js限制输入框只能输入数字(onkeyup触发)
Sep 28 Javascript
浅谈Vue.js中如何实现自定义下拉菜单指令
Jan 06 Javascript
学习node.js 断言的使用详解
Mar 18 Javascript
在vue中使用console.log无效的解决
Aug 09 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
德生PL330测评
2021/03/02 无线电
PHP 批量更新网页内容实现代码
2010/01/05 PHP
php连接mssql数据库的几种方法
2013/02/21 PHP
php使用ZipArchive提示Fatal error: Class ZipArchive not found in的解决方法
2014/11/04 PHP
lyhucSelect基于Jquery的Select数据联动插件
2011/03/29 Javascript
jQuery EasyUI API 中文文档 - Form表单
2011/10/06 Javascript
js二维数组排序的简单示例代码
2014/01/24 Javascript
Bootstrap教程JS插件滚动监听学习笔记分享
2016/05/18 Javascript
[Bootstrap-插件使用]Jcrop+fileinput组合实现头像上传功能实例代码
2016/12/20 Javascript
详解nodeJS中读写文件方法的区别
2017/03/06 NodeJs
微信小程序 获取二维码实例详解
2017/06/23 Javascript
vue按需加载组件webpack require.ensure的方法
2017/12/13 Javascript
详解滑动穿透(锁body)终极探索
2019/04/16 Javascript
使用 js 简单的实现 bind、call 、aplly代码实例
2019/09/07 Javascript
javascript数组的定义及操作实例
2019/11/10 Javascript
vue移动端弹起蒙层滑动禁止底部滑动操作
2020/07/22 Javascript
原生JavaScript实现购物车
2021/01/10 Javascript
[18:20]DOTA2 HEROS教学视频教你分分钟做大人-昆卡
2014/06/11 DOTA
python opencv检测目标颜色的实例讲解
2018/04/02 Python
Tensorflow模型实现预测或识别单张图片
2019/07/19 Python
python基于pdfminer库提取pdf文字代码实例
2019/08/15 Python
pytorch实现特殊的Module--Sqeuential三种写法
2020/01/15 Python
python中使用paramiko模块并实现远程连接服务器执行上传下载功能
2020/02/29 Python
解决Jupyter notebook中.py与.ipynb文件的import问题
2020/04/21 Python
keras 获取某层的输入/输出 tensor 尺寸操作
2020/06/10 Python
python递归函数用法详解
2020/10/26 Python
python time()的实例用法
2020/11/03 Python
Ubuntu20下的Django安装的方法步骤
2021/01/24 Python
结合CSS3的新特性来总结垂直居中的实现方法
2016/05/30 HTML / CSS
七年级英语教学反思
2014/01/15 职场文书
党的群众路线教育实践活动个人对照检查材料(乡镇)
2014/11/05 职场文书
行风评议整改报告
2014/11/06 职场文书
仓库统计员岗位职责
2015/04/14 职场文书
2015年小学数学教研组工作总结
2015/05/21 职场文书
好员工观后感
2015/06/17 职场文书
SQL 聚合、分组和排序
2021/11/11 MySQL