原生js实现电商侧边导航效果


Posted in Javascript onJanuary 19, 2017

知识要点

实现原理:

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>

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持三水点靠木!

Javascript 相关文章推荐
js继承 Base类的源码解析
Dec 30 Javascript
jQuery ul标签下拉菜单演示代码
Dec 11 Javascript
在ASP.NET中使用JavaScript脚本的方法
Nov 12 Javascript
js实现文字闪烁特效的方法
Dec 17 Javascript
JavaScript从数组的indexOf()深入之Object的Property机制
May 11 Javascript
jquery动态遍历Json对象的属性和值的方法
Jul 27 Javascript
微信小程序 数组(增,删,改,查)等操作实例详解
Jan 05 Javascript
vue filters的使用详解
Jun 11 Javascript
vue.js动画中的js钩子函数的实现
Jul 06 Javascript
详解Angular中实现自定义组件的双向绑定的两种方法
Nov 23 Javascript
vue实现记事本功能
Jun 26 Javascript
JS 遍历 json 和 JQuery 遍历json操作完整示例
Nov 11 jQuery
JS实现touch 点击滑动轮播实例代码
Jan 19 #Javascript
微信小程序 视图容器组件的详解及实例代码
Jan 19 #Javascript
详解前端构建工具gulpjs的使用介绍及技巧
Jan 19 #Javascript
js实现漫天星星效果
Jan 19 #Javascript
ajax 提交数据到后台jsp页面及页面跳转问题
Jan 19 #Javascript
ajax与json 获取数据并在前台使用简单实例
Jan 19 #Javascript
javaScript基础详解
Jan 19 #Javascript
You might like
php中的curl使用入门教程和常见用法实例
2014/04/10 PHP
微信公众平台天气预报功能开发
2014/07/06 PHP
实例介绍PHP的Reflection反射机制
2014/08/05 PHP
php array_walk_recursive 使用自定的函数处理数组中的每一个元素
2016/11/16 PHP
提高 DHTML 页面性能
2006/12/25 Javascript
jquery删除提示框弹出是否删除对话框
2014/01/07 Javascript
Jquery中的$.each获取各种返回类型数据的使用方法
2015/05/03 Javascript
js实现用户离开页面前提示是否离开此页面的方法(包括浏览器按钮事件)
2015/07/18 Javascript
js+div实现文字滚动和图片切换效果代码
2015/08/27 Javascript
AngularJS表单验证中级篇(3)
2016/09/28 Javascript
玩转NODE.JS(四)-搭建简单的聊天室的代码
2016/11/11 Javascript
Bootstrap基本样式学习笔记之表格(2)
2016/12/07 Javascript
详解vue项目优化之按需加载组件-使用webpack require.ensure
2017/06/13 Javascript
微信小程序使用map组件实现检索(定位位置)周边的POI功能示例
2019/01/23 Javascript
vue安装遇到的5个报错及解决方法
2019/06/12 Javascript
[01:03]DOTA2新的征程 你的脚印值得踏上
2014/08/13 DOTA
使用FastCGI部署Python的Django应用的教程
2015/07/22 Python
Odoo中如何生成唯一不重复的序列号详解
2018/02/10 Python
点球小游戏python脚本
2018/05/22 Python
解决Tensorflow安装成功,但在导入时报错的问题
2018/06/13 Python
Python爬虫抓取技术的一些经验
2019/07/12 Python
Python二元赋值实用技巧解析
2019/10/25 Python
Python爬虫实现模拟点击动态页面
2020/03/05 Python
使用 Python ssh 远程登陆服务器的最佳方案
2020/03/06 Python
python 判断txt每行内容中是否包含子串并重新写入保存的实例
2020/03/12 Python
乌克兰网上服装店:Bolf.ua
2018/10/30 全球购物
SIDESTEP荷兰:在线购买鞋子
2019/11/18 全球购物
美国亚马逊旗下时尚女装网店:SHOPBOP(支持中文)
2020/10/17 全球购物
财务出纳岗位职责
2014/02/03 职场文书
担保书格式范文
2015/09/22 职场文书
检讨书范文
2019/04/16 职场文书
JUnit5常用注解的使用
2021/07/02 Java/Android
JS 4个超级实用的小技巧 提升开发效率
2021/10/05 Javascript
微软Win11什么功能最惊艳? Windows11新功能特性汇总
2021/11/21 数码科技
Redis+Lua脚本实现计数器接口防刷功能(升级版)
2022/02/12 Redis
Redis实现分布式锁的五种方法详解
2022/06/14 Redis