原生js实现电商侧边导航效果
发布时间 - 2026-01-10 22:39:16 点击率:次知识要点

实现原理:
1.点击楼层跳相应楼层,用的是锚点定位
电梯:<a href="#item2">2F 个护家清</a></li>
列表title:<div class="floor-title" id="item2"></div>
这个没什么好说的
2.当点击楼层跳到相应楼层时,该楼层高亮显示
我们的脚本主要就是实现这个功能。
原理获取浏览器导航条下拉的距离与各个楼层相对于文档顶部下拉的距离进行校验。
这里需要用到的方法事件:
window.onscroll=function(){ } //浏览器滚动监听事件执行函数
.scrollTop //获取滚动条下拉的高度,大家可以用 console.log(top) 试一下就明白了
.offsetTop //获取元素距离文档顶部的距离
大体过程分析
首先获取滚动条下拉的高度,以及存储一些会用到的变量
//获取滚动条下拉的高度
var top=document.documentElement.scrollTop||document.body.scrollTop;
//console.log(top)
//所有楼层
var items=document.getElementById("wrap").getElementsByClassName("floor-title");
//a标签父级
var elev=document.getElementById("elev");
遍历所有楼层,获取每个楼层距离文档顶部的距离,如果滚动条的高度大于楼层的高度,就把楼层的ID赋给thisID,
每个楼层都比较一次,直到不满足条件退出循环。
//创建空变量下面存储当前楼层的ID
var thisID="";
//遍历所有楼层
for(var i=0;i<items.length;i++){
//获取每个楼层距离文档顶部的距离
var itemTop=items[i].offsetTop;
//console.log(itemTop)
//如果滚动条的高度大于楼层的高度,就把楼层的ID赋给thisID
//每个楼层都比较一次,直到不满足条件退出循环
if(top>itemTop-100){//减去100是为了用户体验,自己测试下就懂了
thisID=items[i].id;
}else{
break;
}
}
最后就是给当前楼层添加高亮样式,其他的删除样式。
因为用的是原生js,没有jquery强大的选择器所以还要用一个循环遍历获取href值是当前楼层的ID,
这里需要注意的是,在js里 .href 获取的是个完整的链接,所以要用split()方法分割为数组,数组的最后一位就是ID了
//所有a标签
var alinks=elev.getElementsByTagName("a");
if(thisID){
for(var j=0;j<alinks.length;j++){
//因为获取的是一个完整链接所以要切割两半
var _href=alinks[j].href.split("#");
//对数组最后一位和当前高度楼层的id进行校验
if(_href[_href.length-1]!=thisID){
alinks[j].className="";
}else{
addClass(alinks[j],"current")
}
}
}
完整代码
注:图片链接自己替换下,再多复制些商品列表让浏览器足以满屏
<!DOCTYPE html>
<html lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>demo</title>
<style>
body,h1,h2,h3,h4,h5,h6,hr,p,blockquote,dl,dt,dd,ul,ol,li,pre,form,fieldset,legend,button,input,textarea,th,td{margin:0;padding:0;}
h1,h2,h3,h4,h5,h6{font-size:100%;}
address,cite,dfn,em,var{font-style:normal;}
code,kbd,pre,samp{font-family:courier new,courier,monospace;}
ul,ol{list-style:none;}
a{text-decoration:none;}
a:hover{text-decoration:none;}
sup{vertical-align:text-top;}
sub{vertical-align:text-bottom;}
legend{color:#000;}
fieldset,img{border:0;}
button,input,select,textarea{font-size:100%;}
table{border-collapse:collapse;border-spacing:0;}
.clear{clear: both;float: none;height: 0;overflow: hidden;}
body{background: #9B1BC5;}
@font-face {
font-family: 'iconfont'; /* project id 196174 */
src: url('https://at.alicdn.com/t/font_9dwvwg9edp0q9f6r.eot');
src: url('https://at.alicdn.com/t/font_9dwvwg9edp0q9f6r.eot?#iefix') format('embedded-opentype'),
url('https://at.alicdn.com/t/font_9dwvwg9edp0q9f6r.woff') format('woff'),
url('https://at.alicdn.com/t/font_9dwvwg9edp0q9f6r.ttf') format('truetype'),
url('https://at.alicdn.com/t/font_9dwvwg9edp0q9f6r.svg#iconfont') format('svg');
}
.cart{
font-family:"iconfont" !important;
font-size:36px;font-style:normal;
-webkit-font-smoothing: antialiased;
-webkit-text-stroke-width: 0.2px;
-moz-osx-font-smoothing: grayscale;
cursor: pointer;
color: #dd2727;
height: 36px;
width: 36px;
padding: 0;
line-height: 1;
position: absolute;
right: 0;
bottom: 0;
}
.floor-title{width: 990px; margin: 0 auto; overflow: hidden;}
.floor-text{width:990px; height: 80px; margin: 10px auto 0; font-size: 100%;}
.content{width: 990px; margin: 0 auto; overflow: hidden;}
.list0{font-size: 0; margin: 0 -10px -10px 0;}
.item{display: inline-block; vertical-align: top; width: 190px; margin:0 10px 10px 0; background: #fff; position: relative; line-height: 1.2;}
.item a{display: block;}
.item-main{padding: 9px; position: relative;}
.item-title{font: 14px/1.3 tahoma,arial,"\5b8b\4f53"; color: #313D44; display: -webkit-box; -webkit-line-clamp:2; -webkit-box-orient:vertical; overflow: hidden; margin-bottom: 3px;}
.item-desc{font: 12px/1.2 tahoma,arial,"\5b8b\4f53"; color: #dd2727; margin-bottom: 5px;}
.item-imp{font: 12px/1.2 tahoma,arial,"\5b8b\4f53"; margin-top: 9px; padding-right: 35px; position: relative;}
.item-sales{color: #666;}
.promotion-price{font-size: 18px; color: #dd2727; font-weight: 700; font-family: Helvetica; line-height: 1.1; display: inline-block;}
.promotion-price:first-letter {font-size: 14px; font-weight: 400; margin-right: 1px;}
.elevator{position: fixed; left: 50%; margin-left: 505px; bottom: 60px; width: 100px; font: 12px/1.5 "Microsoft Yahei",tahoma,arial;}
.elevator ul{background: #B50100;}
.elevator ul li a{height: 25px; line-height: 25px; color: #fff; display: block; text-align: center;}
.elevator ul li a:hover,
.elevator ul li a.current{background: #800100;}
</style>
</head>
<body>
<div class="elevator" id="elev">
<ul>
<li><a href="#item1" class="current">1F 休闲食品</a></li>
<li><a href="#item2">2F 个护家清</a></li>
<li><a href="#item3">3F 粮油干货</a></li>
<li><a href="#item4">4F 母婴用品</a></li>
<li><a href="#item5">5F 进口食品</a></li>
<li><a href="#item6">6F 纸品日百</a></li>
</ul>
</div>
<div id="wrap">
<div class="floor-title" id="item1"><h3 class="floor-text"><img src="images/1f.png"></h3></div>
<div class="content">
<div class="list0">
<div class="item">
<a href="#">
<div class="img-wrap"><img src="images/pic.jpg"></div>
<div class="item-main">
<div class="item-info">
<div class="item-title">Walch/威露士清新青柠水润保湿洁净健康沐浴露600mlssssssssssss</div>
<div class="item-desc">满188减100</div>
</div>
<div class="item-imp">
<div class="imp-main">
<div class="item-sales">月销25170件</div>
<div class="item-price"><b class="promotion-price">¥29.9</b></div>
</div>
<i class="cart"></i>
</div>
</div>
</a>
</div>
</div>
</div>
<div class="floor-title" id="item2"><h3 class="floor-text"><img src="images/2f.png"></h3></div>
<div class="content">
<div class="list0">
<div class="item">
<a href="#">
<div class="img-wrap"><img src="images/pic.jpg"></div>
<div class="item-main">
<div class="item-info">
<div class="item-title">Walch/威露士清新青柠水润保湿洁净健康沐浴露600mlssssssssssss</div>
<div class="item-desc">满188减100</div>
</div>
<div class="item-imp">
<div class="imp-main">
<div class="item-sales">月销25170件</div>
<div class="item-price"><b class="promotion-price">¥29.9</b></div>
</div>
<i class="cart"></i>
</div>
</div>
</a>
</div>
</div>
</div>
<div class="floor-title" id="item3"><h3 class="floor-text"><img src="images/3f.png"></h3></div>
<div class="content">
<div class="list0">
<div class="item">
<a href="#">
<div class="img-wrap"><img src="images/pic.jpg"></div>
<div class="item-main">
<div class="item-info">
<div class="item-title">Walch/威露士清新青柠水润保湿洁净健康沐浴露600mlssssssssssss</div>
<div class="item-desc">满188减100</div>
</div>
<div class="item-imp">
<div class="imp-main">
<div class="item-sales">月销25170件</div>
<div class="item-price"><b class="promotion-price">¥29.9</b></div>
</div>
<i class="cart"></i>
</div>
</div>
</a>
</div>
</div>
</div>
<div class="floor-title" id="item4"><h3 class="floor-text"><img src="images/4f.png"></h3></div>
<div class="content">
<div class="list0">
<div class="item">
<a href="#">
<div class="img-wrap"><img src="images/pic.jpg"></div>
<div class="item-main">
<div class="item-info">
<div class="item-title">Walch/威露士清新青柠水润保湿洁净健康沐浴露600mlssssssssssss</div>
<div class="item-desc">满188减100</div>
</div>
<div class="item-imp">
<div class="imp-main">
<div class="item-sales">月销25170件</div>
<div class="item-price"><b class="promotion-price">¥29.9</b></div>
</div>
<i class="cart"></i>
</div>
</div>
</a>
</div>
</div>
</div>
<div class="floor-title" id="item5"><h3 class="floor-text"><img src="images/5f.png"></h3></div>
<div class="content">
<div class="list0">
<div class="item">
<a href="#">
<div class="img-wrap"><img src="images/pic.jpg"></div>
<div class="item-main">
<div class="item-info">
<div class="item-title">Walch/威露士清新青柠水润保湿洁净健康沐浴露600mlssssssssssss</div>
<div class="item-desc">满188减100</div>
</div>
<div class="item-imp">
<div class="imp-main">
<div class="item-sales">月销25170件</div>
<div class="item-price"><b class="promotion-price">¥29.9</b></div>
</div>
<i class="cart"></i>
</div>
</div>
</a>
</div>
</div>
</div>
<div class="floor-title" id="item6"><h3 class="floor-text"><img src="images/6f.png"></h3></div>
<div class="content">
<div class="list0">
<div class="item">
<a href="#">
<div class="img-wrap"><img src="images/pic.jpg"></div>
<div class="item-main">
<div class="item-info">
<div class="item-title">Walch/威露士清新青柠水润保湿洁净健康沐浴露600mlssssssssssss</div>
<div class="item-desc">满188减100</div>
</div>
<div class="item-imp">
<div class="imp-main">
<div class="item-sales">月销25170件</div>
<div class="item-price"><b class="promotion-price">¥29.9</b></div>
</div>
<i class="cart"></i>
</div>
</div>
</a>
</div>
</div>
</div>
</div>
<script type="text/javascript">
//在页面加载完后立即执行多个函数完美方案。
function addloadEvent(func){
var oldonload=window.onload;
if(typeof window.onload !="function"){
window.onload=func;
}
else{
window.onload=function(){
if(oldonload){
oldonload();
}
func();
}
}
}
addloadEvent(b);
//在页面加载完后立即执行多个函数完美方案over。
//给元素在原来基础上添加一个className
function addClass(element,value){
if(!element.className){
element.className=value;
}
else{
newClassName=element.className;
newClassName+=" ";
newClassName+=value;
element.className=newClassName;
}
}
function b(){
window.onscroll=function(){
//获取滚动条下拉的高度
var top=document.documentElement.scrollTop||document.body.scrollTop;
//console.log(top)
//所有楼层
var items=document.getElementById("wrap").getElementsByClassName("floor-title");
//a标签父级
var elev=document.getElementById("elev");
//创建空变量下面存储当前楼层的ID
var thisID="";
//遍历所有楼层
for(var i=0;i<items.length;i++){
//获取每个楼层距离文档顶部的距离
var itemTop=items[i].offsetTop;
//console.log(itemTop)
//如果滚动条的高度大于楼层的高度,就把楼层的ID赋给thisID
//每个楼层都比较一次,直到不满足条件退出循环
if(top>itemTop-100){//减去100是为了用户体验,自己测试下就懂了
thisID=items[i].id;
}else{
break;
}
}
//所有a标签
var alinks=elev.getElementsByTagName("a");
if(thisID){
for(var j=0;j<alinks.length;j++){
//因为获取的是一个完整链接所以要切割两半
var _href=alinks[j].href.split("#");
//对数组最后一位和当前高度楼层的id进行校验
if(_href[_href.length-1]!=thisID){
alinks[j].className="";
}else{
addClass(alinks[j],"current")
}
}
}
}
}
</script>
</body>
</html>
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持!
# js
# 侧边导航
# javascript仿京东导航左侧分类导航下拉菜单效果
# js实现的常用的左侧导航效果
# js左侧三级菜单导航实例代码
# js+json用表格实现简单网站左侧导航
# 的是
# 滚动条
# 遍历
# 沐浴露
# 文档
# 就把
# 威露士
# 不满足
# 多个
# 要用
# 完后
# 是为了
# 加载
# 是个
# 基础上
# 可以用
# 其他的
# 相对于
# 再多
# 跳到
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
如何在景安云服务器上绑定域名并配置虚拟主机?
Laravel怎么配置不同环境的数据库_Laravel本地测试与生产环境动态切换【方法】
如何基于云服务器快速搭建网站及云盘系统?
非常酷的网站设计制作软件,酷培ai教育官方网站?
Laravel如何创建自定义Facades?(详细步骤)
标准网站视频模板制作软件,现在有哪个网站的视频编辑素材最齐全的,背景音乐、音效等?
今日头条AI怎样推荐抢票工具_今日头条AI抢票工具推荐算法与筛选【技巧】
Laravel怎么使用Collection集合方法_Laravel数组操作高级函数pluck与map【手册】
Python图片处理进阶教程_Pillow滤镜与图像增强
高性能网站服务器配置指南:安全稳定与高效建站核心方案
Windows10电脑怎么设置虚拟光驱_Win10右键装载ISO镜像文件
JS碰撞运动实现方法详解
如何在宝塔面板中创建新站点?
Laravel Eloquent性能优化技巧_Laravel N+1查询问题解决
如何用AI一键生成爆款短视频文案?小红书AI文案写作指令【教程】
Laravel怎么实现搜索功能_Laravel使用Eloquent实现模糊查询与多条件搜索【实例】
哪家制作企业网站好,开办像阿里巴巴那样的网络公司和网站要怎么做?
Linux安全能力提升路径_长期防护思维说明【指导】
Python并发异常传播_错误处理解析【教程】
再谈Python中的字符串与字符编码(推荐)
Android Socket接口实现即时通讯实例代码
google浏览器怎么清理缓存_谷歌浏览器清除缓存加速详细步骤
如何快速搭建高效WAP手机网站?
Python企业级消息系统教程_KafkaRabbitMQ高并发应用
node.js报错:Cannot find module 'ejs'的解决办法
Laravel怎么进行数据库事务处理_Laravel DB Facade事务操作确保数据一致性
php嵌入式断网后怎么恢复_php检测网络重连并恢复硬件控制【操作】
用yum安装MySQLdb模块的步骤方法
JavaScript如何实现路由_前端路由原理是什么
如何续费美橙建站之星域名及服务?
如何挑选优质建站一级代理提升网站排名?
电视网站制作tvbox接口,云海电视怎样自定义添加电视源?
香港服务器租用费用高吗?如何避免常见误区?
音响网站制作视频教程,隆霸音响官方网站?
如何在阿里云购买域名并搭建网站?
Laravel如何使用API Resources格式化JSON响应_Laravel数据资源封装与格式化输出
如何快速启动建站代理加盟业务?
Laravel如何处理JSON字段_Eloquent原生JSON字段类型操作教程
如何在 Python 中将列表项按字母顺序编号(a.、b.、c. …)
网站优化排名时,需要考虑哪些问题呢?
iOS验证手机号的正则表达式
Laravel如何处理文件上传_Laravel Storage门面实现文件存储与管理
如何快速搭建高效服务器建站系统?
如何在香港服务器上快速搭建免备案网站?
Laravel怎么设置路由分组Prefix_Laravel多级路由嵌套与命名空间隔离【步骤】
javascript日期怎么处理_如何格式化输出
如何快速使用云服务器搭建个人网站?
儿童网站界面设计图片,中国少年儿童教育网站-怎么去注册?
Laravel怎么做数据加密_Laravel内置Crypt门面的加密与解密功能
javascript中对象的定义、使用以及对象和原型链操作小结

