原生js实现电商侧边导航效果
知识要点
实现原理:
1.点击楼层跳相应楼层,用的是锚点定位
电梯:<ahref="#item2">2F个护家清</a></li>
列表title:<divclass="floor-title"id="item2"></div>
这个没什么好说的
2.当点击楼层跳到相应楼层时,该楼层高亮显示
我们的脚本主要就是实现这个功能。
原理获取浏览器导航条下拉的距离与各个楼层相对于文档顶部下拉的距离进行校验。
这里需要用到的方法事件:
window.onscroll=function(){}//浏览器滚动监听事件执行函数 .scrollTop//获取滚动条下拉的高度,大家可以用console.log(top)试一下就明白了 .offsetTop//获取元素距离文档顶部的距离
大体过程分析
首先获取滚动条下拉的高度,以及存储一些会用到的变量
//获取滚动条下拉的高度 vartop=document.documentElement.scrollTop||document.body.scrollTop; //console.log(top) //所有楼层 varitems=document.getElementById("wrap").getElementsByClassName("floor-title"); //a标签父级 varelev=document.getElementById("elev");
遍历所有楼层,获取每个楼层距离文档顶部的距离,如果滚动条的高度大于楼层的高度,就把楼层的ID赋给thisID,
每个楼层都比较一次,直到不满足条件退出循环。
//创建空变量下面存储当前楼层的ID varthisID=""; //遍历所有楼层 for(vari=0;i<items.length;i++){ //获取每个楼层距离文档顶部的距离 varitemTop=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标签 varalinks=elev.getElementsByTagName("a"); if(thisID){ for(varj=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") } } }
完整代码
注:图片链接自己替换下,再多复制些商品列表让浏览器足以满屏
<!DOCTYPEhtml> <htmllang="en"> <head> <metahttp-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:couriernew,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';/*projectid196174*/ 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:0auto;overflow:hidden;} .floor-text{width:990px;height:80px;margin:10pxauto0;font-size:100%;} .content{width:990px;margin:0auto;overflow:hidden;} .list0{font-size:0;margin:0-10px-10px0;} .item{display:inline-block;vertical-align:top;width:190px;margin:010px10px0;background:#fff;position:relative;line-height:1.2;} .itema{display:block;} .item-main{padding:9px;position:relative;} .item-title{font:14px/1.3tahoma,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.2tahoma,arial,"\5b8b\4f53";color:#dd2727;margin-bottom:5px;} .item-imp{font:12px/1.2tahoma,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"MicrosoftYahei",tahoma,arial;} .elevatorul{background:#B50100;} .elevatorullia{height:25px;line-height:25px;color:#fff;display:block;text-align:center;} .elevatorullia:hover, .elevatorullia.current{background:#800100;} </style> </head> <body> <divclass="elevator"id="elev"> <ul> <li><ahref="#item1"class="current">1F休闲食品</a></li> <li><ahref="#item2">2F个护家清</a></li> <li><ahref="#item3">3F粮油干货</a></li> <li><ahref="#item4">4F母婴用品</a></li> <li><ahref="#item5">5F进口食品</a></li> <li><ahref="#item6">6F纸品日百</a></li> </ul> </div> <divid="wrap"> <divclass="floor-title"id="item1"><h3class="floor-text"><imgsrc="images/1f.png"></h3></div> <divclass="content"> <divclass="list0"> <divclass="item"> <ahref="#"> <divclass="img-wrap"><imgsrc="images/pic.jpg"></div> <divclass="item-main"> <divclass="item-info"> <divclass="item-title">Walch/威露士清新青柠水润保湿洁净健康沐浴露600mlssssssssssss</div> <divclass="item-desc">满188减100</div> </div> <divclass="item-imp"> <divclass="imp-main"> <divclass="item-sales">月销25170件</div> <divclass="item-price"><bclass="promotion-price">¥29.9</b></div> </div> <iclass="cart">Z</i> </div> </div> </a> </div> </div> </div> <divclass="floor-title"id="item2"><h3class="floor-text"><imgsrc="images/2f.png"></h3></div> <divclass="content"> <divclass="list0"> <divclass="item"> <ahref="#"> <divclass="img-wrap"><imgsrc="images/pic.jpg"></div> <divclass="item-main"> <divclass="item-info"> <divclass="item-title">Walch/威露士清新青柠水润保湿洁净健康沐浴露600mlssssssssssss</div> <divclass="item-desc">满188减100</div> </div> <divclass="item-imp"> <divclass="imp-main"> <divclass="item-sales">月销25170件</div> <divclass="item-price"><bclass="promotion-price">¥29.9</b></div> </div> <iclass="cart">Z</i> </div> </div> </a> </div> </div> </div> <divclass="floor-title"id="item3"><h3class="floor-text"><imgsrc="images/3f.png"></h3></div> <divclass="content"> <divclass="list0"> <divclass="item"> <ahref="#"> <divclass="img-wrap"><imgsrc="images/pic.jpg"></div> <divclass="item-main"> <divclass="item-info"> <divclass="item-title">Walch/威露士清新青柠水润保湿洁净健康沐浴露600mlssssssssssss</div> <divclass="item-desc">满188减100</div> </div> <divclass="item-imp"> <divclass="imp-main"> <divclass="item-sales">月销25170件</div> <divclass="item-price"><bclass="promotion-price">¥29.9</b></div> </div> <iclass="cart">Z</i> </div> </div> </a> </div> </div> </div> <divclass="floor-title"id="item4"><h3class="floor-text"><imgsrc="images/4f.png"></h3></div> <divclass="content"> <divclass="list0"> <divclass="item"> <ahref="#"> <divclass="img-wrap"><imgsrc="images/pic.jpg"></div> <divclass="item-main"> <divclass="item-info"> <divclass="item-title">Walch/威露士清新青柠水润保湿洁净健康沐浴露600mlssssssssssss</div> <divclass="item-desc">满188减100</div> </div> <divclass="item-imp"> <divclass="imp-main"> <divclass="item-sales">月销25170件</div> <divclass="item-price"><bclass="promotion-price">¥29.9</b></div> </div> <iclass="cart">Z</i> </div> </div> </a> </div> </div> </div> <divclass="floor-title"id="item5"><h3class="floor-text"><imgsrc="images/5f.png"></h3></div> <divclass="content"> <divclass="list0"> <divclass="item"> <ahref="#"> <divclass="img-wrap"><imgsrc="images/pic.jpg"></div> <divclass="item-main"> <divclass="item-info"> <divclass="item-title">Walch/威露士清新青柠水润保湿洁净健康沐浴露600mlssssssssssss</div> <divclass="item-desc">满188减100</div> </div> <divclass="item-imp"> <divclass="imp-main"> <divclass="item-sales">月销25170件</div> <divclass="item-price"><bclass="promotion-price">¥29.9</b></div> </div> <iclass="cart">Z</i> </div> </div> </a> </div> </div> </div> <divclass="floor-title"id="item6"><h3class="floor-text"><imgsrc="images/6f.png"></h3></div> <divclass="content"> <divclass="list0"> <divclass="item"> <ahref="#"> <divclass="img-wrap"><imgsrc="images/pic.jpg"></div> <divclass="item-main"> <divclass="item-info"> <divclass="item-title">Walch/威露士清新青柠水润保湿洁净健康沐浴露600mlssssssssssss</div> <divclass="item-desc">满188减100</div> </div> <divclass="item-imp"> <divclass="imp-main"> <divclass="item-sales">月销25170件</div> <divclass="item-price"><bclass="promotion-price">¥29.9</b></div> </div> <iclass="cart">Z</i> </div> </div> </a> </div> </div> </div> </div> <scripttype="text/javascript"> //在页面加载完后立即执行多个函数完美方案。 functionaddloadEvent(func){ varoldonload=window.onload; if(typeofwindow.onload!="function"){ window.onload=func; } else{ window.onload=function(){ if(oldonload){ oldonload(); } func(); } } } addloadEvent(b); //在页面加载完后立即执行多个函数完美方案over。 //给元素在原来基础上添加一个className functionaddClass(element,value){ if(!element.className){ element.className=value; } else{ newClassName=element.className; newClassName+=""; newClassName+=value; element.className=newClassName; } } functionb(){ window.onscroll=function(){ //获取滚动条下拉的高度 vartop=document.documentElement.scrollTop||document.body.scrollTop; //console.log(top) //所有楼层 varitems=document.getElementById("wrap").getElementsByClassName("floor-title"); //a标签父级 varelev=document.getElementById("elev"); //创建空变量下面存储当前楼层的ID varthisID=""; //遍历所有楼层 for(vari=0;i<items.length;i++){ //获取每个楼层距离文档顶部的距离 varitemTop=items[i].offsetTop; //console.log(itemTop) //如果滚动条的高度大于楼层的高度,就把楼层的ID赋给thisID //每个楼层都比较一次,直到不满足条件退出循环 if(top>itemTop-100){//减去100是为了用户体验,自己测试下就懂了 thisID=items[i].id; }else{ break; } } //所有a标签 varalinks=elev.getElementsByTagName("a"); if(thisID){ for(varj=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>
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持毛票票!