效果图
floor.html
<!DOCTYPE html> <html lang="zh-CN"><!-- 设置简体中文 --> head> meta charset="UTF-8"title>floor</link rel="stylesheet" href="../css/base.css"="../css/floor.css"body 1F --> div class="floor"> ="container"> img src="../img/floor-loading.gif"div> 2F一 3F ="floor" 4F 5F elevator --> ="elevator container" id="elevator"a href="javascript:;" class="elevator-item"span ="elevator-num">F1span="elevator-text">服饰a>F2>美妆>F3>手机>F4>家电>F5>数码script ="../js/jquery.js"></script="../js/transition.js"="../js/showhide.js"="../js/tab2.js"="../js/floor.js"html>
base.css https://www.cnblogs.com/chenyingying0/p/12363689.html
floor.css
/*基本样式 */ .container{ width:1200px; margin:0 auto; } .transition{ -webkit-transition:all .5s; -moz-transition: -ms-transition: -o-transition: transition:all .5s; } .text-hidden{ text-indent:-9999px; overflow:hidden; } .fl{ float:left; } floor楼层区域 .floor{ margin-top:7px; height:534px; } .floor .container{ position: relative; z-index:1; } .tab-head{68px; border-bottom:1px solid #f01414; } .tab-head-title{22px; } .tab-head-title-num{ display: inline-block;24px; border-radius:50%; background-color:#07111b; color:#fff; text-align: center; line-height: margin-right:10px; } .tab-head-title-name{ font-size:20px; top:3px; } .tab-head-item-wrap{8px;62px;62px; } .tab-head-item{14px; color:#93999f;16px; } .tab-head-item-active{#f01414; background:url(../img/floor-arrow.png) center bottom no-repeat; } .tab-head-item-divider{1px;#d9dde1;21px; .tab-body{466px; } .tab-body-panel{466px; none; } .tab-body-panel-item{200px;233px; center; } .tab-body-panel-item:hover{ box-shadow:0 0 10px rgba(0,.2); } .tab-body-panel-item-pic{24px; } .tab-body-panel-item-name{23px;12px;#07111b; } .tab-body-panel-item-price{9px;#f01414; } elevator .elevator{ fixed; left:-90px; margin-left:-640px; container宽度1200px,50%是-600px,再移动-40px左右的距离*/ } .elevator-item{35px; block; 35px;#4d555d; border-top:1px solid #d9dde1; } .elevator-item:hover,.elevator-item-active{#f01414; } .elevator-num{ } .elevator-text{ .elevator-item:hover .elevator-num,.elevator-item-active .elevator-num{ .elevator-item:hover .elevator-text,.elevator-item-active .elevator-text{ block; }
transition.js https://www.cnblogs.com/chenyingying0/p/12363649.html
showhide.js https://www.cnblogs.com/chenyingying0/p/12363707.html
tab2.js https://www.cnblogs.com/chenyingying0/p/12384972.html
floor.js
// 不要暴露在全局,使用匿名函数自执行 (function($){ "use strict"; floor var $floor=$(".floor"); 楼层数据 var floorData=[ { num:"1",text:"服装箱包"],offsetTop:$floor.eq(0).offset().top,height:$floor.eq(0).height(),items:[ [ { name:"匡威男棒球开衫外套2020" },{ name:"匡威男棒球开衫外套2020" } ],[ { name:"匡威男棒球开衫外套2020" } ] ] },{ num:"2"1234 } ] ] } ]; 提前加载图片 loadImg(url,success,fail){ var image=new Image(); image.onload=(){ if(typeof success==="function") success(); } image.onerror=typeof fail==="function") fail(); } image.src=url; } 按需加载图片 loadImgs($imgs,fail){ $imgs.each((_,el){ var $img=$(el); loadImg($img.data("src"),(url){ var url=$img.data('src'); $img.attr("src"(url){ fail($img,url); }) }); } 延迟加载 loadUtil(options){ var items={},loadedItemsNum=0nulloptions.$container,id=options.id,totalItemNum=options.totalItemNum,triggerEvent=options.triggerEvent; 接收开始显示图片的消息 $elem.on(triggerEvent,loadFn=(e,i,elem){ if(items[i] !== "loaded"){ 触发开始加载图片的自定义事件 $elem.trigger(id+"-loadItems",[i,elem,1)">(){ items[i]="loaded"; loadedItemsNum++; if(loadedItemsNum===totalItemNum){ 触发全部加载完毕的自定义事件 $elem.trigger(id+"-itemsLoaded"); } }]); } }); 绑定全部加载完毕的自定义事件 $elem.on(id+"-itemsLoaded",1)">(e){ 清除事件 $elem.off(triggerEvent,loadFn); }); } 创建floor结构 buildFloor(floorData){ var html=""; html+=`<div class="container">`; html+=buildFloorHead(floorData); html+=buildFloorBody(floorData); html+=`</div>`; return html; } 创建floor头部 buildFloorHead(floorData){ ; html+=`<div class="tab-head"> <div class="tab-head-title fl"> <span class="tab-head-title-num">`+floorData.num+`F</span><span class="tab-head-title-name">`+floorData.text+`</span> </div> <ul class="tab-head-item-wrap fr">`; for(var i=0;i<floorData.tabs.length;i++){ html+=`<li class="fl"><a href="javascript:;" class="tab-head-item">`+floorData.tabs[i]+`</a></li>`; if(i!==floorData.tabs.length-1){ html+=`<li class="fl tab-head-item-divider text-hidden">分割线</li>`; } } html+=`</ul> </div>`; 创建floor体 buildFloorBody(floorData){ ; html+=`<div class="tab-body">){ html+=`<ul class="tab-body-panel">`; var j=0;j<floorData.items[i].length;j++){ html+=`<li class="tab-body-panel-item fl"> <p class="tab-body-panel-item-pic"><a href="#" class="link"><img src="../img/floor/loading.gif" class="floor-img" data-src="../img/floor/`+floorData.num+`/`+(i+1)+`/`+(j+1)+`.png"></a></p> <p class="tab-body-panel-item-name">`+floorData.items[i][j].name+`</p> <p class="tab-body-panel-item-price">`+floorData.items[i][j].price+`</p> </li>`; } html+=`</ul>`; } html+=`</div>`; 是否在可视区内 isVisible(floorData){ 性能优化:将固定的值如楼层距离网页顶端的距离和楼层的高度存入floorData,不在此每次执行 视口的高度+视口滚过的距离 大于 元素距离网页顶部的距离(否则元素顶部在视口下面) 并且 视口滚过的距离 小于 元素滚过的距离+元素高度(否则元素底部在视口上面) return ($(window).height()+$(window).scrollTop()>floorData.offsetTop) && ($(window).scrollTop()<floorData.offsetTop+floorData.height); } 展示楼层 showFloor(){ $(".floor").each(function(index,elem){each的第一个参数默认是索引 注意第二个参数不是jQuery对象,转对象需要包装 if(isVisible(floorData[index])){ floor的父元素触发事件 $(document).trigger("floor-show"(){ clearTimeout($floor.timer); 开定时器稀释事件流,优化性能 $floor.timer=setTimeout(showFloor,250); }); tab监听事件 $floor.on("floor-loadItems",success){ loadImgs($(elem).find(".floor-img"),1)">($img,url){ $img.attr("src","../img/floor.placeholder.png"); }); }); 楼层监听事件 $(document).on("floors-loadItems",success){ var html=buildFloor(floorData[i]),1)">$(elem); success(); 模拟线上延迟 setTimeout((){ $elem.html(html); 延迟加载tab loadUtil({ $container:$elem,totalItemNum:$elem.find(".floor-img").length,triggerEvent:"tab-show"激活tab选项卡 $elem.Tab({ event:"mouseenter",1)">click css3:false"fade"0 }); },1000楼层加载结束监听事件 $(document).on("floors-itemsLoaded",1)">(){ $(window).off("scroll resize"延迟加载楼层 loadUtil({ $container:$(document),totalItemNum:$floor.length,triggerEvent:"floor-show",1)">tab-show id:"floors",1)">floor }); showFloor(); elevator whichFloor(){ var num; $floor.each((index,elem){ num=index; $(window).height()/2表示在楼层的1/2位置即可出现 if($(window).scrollTop()+$(window).height()/2<floorData[index].offsetTop){ num=index-1; return ; } }); num; } var elevator=$("#elevator"),eleItems=elevator.find(".elevator-item"); setElevator setElevator(){ var num=whichFloor(); if(num<0){ elevator.fadeOut(); }else{ elevator.fadeIn(); eleItems.removeClass("elevator-item-active"); eleItems.eq(num).addClass("elevator-item-active"); } } setElevator(); var eleTimer=; $(window).on("scroll resize",1)">(){ clearTimeout(eleTimer); eleTimer=setTimeout(setElevator,1)">事件代理抵达指定楼层 elevator.on("click",".elevator-item",1)">(){ $("html,body").animate({ $(this).index()获取当前点击的项的索引 scrollTop:floorData[$(this).index()].offsetTop }) }) })(jQuery);