原生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 相关文章推荐
jQuery each()方法的使用方法
Mar 18 Javascript
jQuery 表单验证扩展代码(一)
Oct 11 Javascript
js判断生效时间不得大于失效时间的思路及代码
Apr 23 Javascript
简单实用的全选反选按钮例子
Oct 18 Javascript
js给页面加style无效果的解决方法
Jan 20 Javascript
jquery中map函数与each函数的区别实例介绍
Jun 23 Javascript
JavaScript之WebSocket技术详解
Nov 18 Javascript
AngularJS 防止页面闪烁的方法
Mar 09 Javascript
Vue内容分发slot(全面解析)
Aug 19 Javascript
Javascript中弹窗confirm与prompt的区别
Oct 26 Javascript
6行代码实现微信小程序页面返回顶部效果
Dec 28 Javascript
eslint 的三大通用规则详解
May 16 Javascript
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
跟我学Laravel之请求(Request)的生命周期
2014/10/15 PHP
19个Android常用工具类汇总
2014/12/30 PHP
PHP导出Excel实例讲解
2016/01/24 PHP
使用laravel根据用户类型来显示或隐藏字段
2019/10/17 PHP
PHP学习记录之常用的魔术常量详解
2019/12/12 PHP
director.js实现前端路由使用实例
2015/02/03 Javascript
BootStrap Table实现server分页序号连续显示功能(当前页从上一页的结束序号开始)
2017/09/12 Javascript
jQuery实现表单动态加减、ajax表单提交功能
2018/06/08 jQuery
Vue.js递归组件实现组织架构树和选人功能案例分析
2019/07/03 Javascript
ant design pro中可控的筛选和排序实例
2020/11/17 Javascript
微信小程序实现简单购物车功能
2020/12/30 Javascript
JavaScript 中的六种循环方法
2021/01/06 Javascript
总结Python编程中函数的使用要点
2016/03/20 Python
解决django服务器重启端口被占用的问题
2019/07/26 Python
python函数的万能参数传参详解
2019/07/26 Python
Python制作词云图代码实例
2019/09/09 Python
pytorch中交叉熵损失(nn.CrossEntropyLoss())的计算过程详解
2020/01/02 Python
Django values()和value_list()的使用
2020/03/31 Python
CSS3实现滚动条动画效果代码分享
2016/08/03 HTML / CSS
Origins悦木之源香港官网:雅诗兰黛集团高端植物护肤品牌
2018/03/21 全球购物
盖尔斯工厂店:GUESS Factory
2020/01/21 全球购物
空指针到底是什么
2012/08/07 面试题
专营店会计助理岗位职责
2013/11/29 职场文书
文明学生标兵事迹
2014/01/21 职场文书
少年闰土教学反思
2014/02/22 职场文书
安全生产月演讲稿
2014/05/09 职场文书
劳动竞赛口号
2014/06/16 职场文书
英语辞职信怎么写
2015/02/28 职场文书
法制工作总结2015
2015/07/23 职场文书
2015年店长个人工作总结
2015/10/23 职场文书
《爬天都峰》教学反思
2016/02/23 职场文书
高效课堂教学反思
2016/02/24 职场文书
如何拟写通知正文?
2019/04/02 职场文书
如果用一句诗总结你的上半年,你会用哪句呢?
2019/07/16 职场文书
关于感恩的作文
2019/08/26 职场文书
python 如何获取页面所有a标签下href的值
2021/05/06 Python