js实现水平滚动菜单导航

发布时间 - 2026-01-11 02:26:28    点击率:

项目中用到了滚动导航,但是默认的滚动条太丑了,只好用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水平滚动菜单导航  # js水平滚动菜单  # js水平单导航  # 利用Js+Css实现折纸动态导航效果实例源码  # JS+CSS实现鼠标滑过时动态翻滚的导航条效果  # javascript实现的鼠标悬停时动态翻滚的导航条  # JS实现移动端可折叠导航菜单(现代都市风)  # JS无限级导航菜单实现方法  # vuejs 切换导航条高亮(路由菜单高亮)的方法示例  # 原生JS实现导航下拉菜单效果  # 如何使用wheelnav.js构建酷炫的动态导航菜单  # 偏移量  # 有机会  # 大神  # 再来  # 我给  # 所示  # 好用  # 能为  # 掉进  # 先看  # 不完善  # 大家多多  # 移除  # 滚动条  # 主要是  # width  # content  # height  # px  # abs 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel中间件起什么作用_Laravel Middleware请求生命周期与自定义详解  Java遍历集合的三种方式  HTML5空格在Angular项目里怎么处理_Angular中空格的渲染问题【详解】  成都网站制作公司哪家好,四川省职工服务网是做什么用?  Laravel如何编写单元测试和功能测试?(PHPUnit示例)  Laravel用户密码怎么加密_Laravel Hash门面使用教程  如何快速启动建站代理加盟业务?  如何用y主机助手快速搭建网站?  iOS验证手机号的正则表达式  怎么用AI帮你为初创公司进行市场定位分析?  为什么php本地部署后css不生效_静态资源加载失败修复技巧【技巧】  合肥制作网站的公司有哪些,合肥聚美网络科技有限公司介绍?  夸克浏览器网页跳转延迟怎么办 夸克浏览器跳转优化  使用C语言编写圣诞表白程序  Laravel怎么生成二维码图片_Laravel集成Simple-QrCode扩展包与参数设置【实战】  如何用好域名打造高点击率的自主建站?  在线ppt制作网站有哪些软件,如何把网页的内容做成ppt?  Laravel如何使用API Resources格式化JSON响应_Laravel数据资源封装与格式化输出  广州网站制作公司哪家好一点,广州欧莱雅百库网络科技有限公司官网?  Laravel怎么集成Vue.js_Laravel Mix配置Vue开发环境  laravel怎么通过契约(Contracts)编程_laravel契约(Contracts)编程方法  jimdo怎样用html5做选项卡_jimdo选项卡html5实现与切换效果【指南】  js代码实现下拉菜单【推荐】  魔方云NAT建站如何实现端口转发?  Windows10如何删除恢复分区_Win10 Diskpart命令强制删除分区  Android自定义listview布局实现上拉加载下拉刷新功能  Laravel怎么实现API接口鉴权_Laravel Sanctum令牌生成与请求验证【教程】  制作ppt免费网站有哪些,有哪些比较好的ppt模板下载网站?  php读取心率传感器数据怎么弄_php获取max30100的心率值【指南】  Laravel怎么使用Blade模板引擎_Laravel模板继承与Component组件复用【手册】  微信公众帐号开发教程之图文消息全攻略  使用spring连接及操作mongodb3.0实例  宙斯浏览器视频悬浮窗怎么开启 边看视频边操作其他应用教程  如何在IIS管理器中快速创建并配置网站?  购物网站制作费用多少,开办网上购物网站,需要办理哪些手续?  大同网页,大同瑞慈医院官网?  Python企业级消息系统教程_KafkaRabbitMQ高并发应用  怎么制作网站设计模板图片,有电商商品详情页面的免费模板素材网站推荐吗?  韩国网站服务器搭建指南:VPS选购、域名解析与DNS配置推荐  Laravel如何实现本地化和多语言支持_Laravel多语言配置与翻译文件管理  如何在阿里云域名上完成建站全流程?  Laravel如何使用Contracts(契约)进行编程_Laravel契约接口与依赖反转  ,怎么在广州志愿者网站注册?  怎么用AI帮你设计一套个性化的手机App图标?  Python数据仓库与ETL构建实战_Airflow调度流程详解  如何在 Go 中优雅地映射具有动态字段的 JSON 对象到结构体  Mybatis 中的insertOrUpdate操作  西安专业网站制作公司有哪些,陕西省建行官方网站?  Laravel如何集成第三方登录_Laravel Socialite实现微信QQ微博登录  Laravel如何优化应用性能?(缓存和优化命令)