仿淘宝首页产品分类菜单栏的设计
这几天一直在给一家电商搞前端开发,首页做DIV页面重构的时候自然地做到每个电商平台都会有的部分——产品分类菜单栏,如下图截的是淘宝的效果:
其实实现鼠标移到左侧主分类(我们暂且称之为A部分)便显示出右侧详细分类部分(称之为B部分)的功能并不困难,但这里不得不说主流的电商平台在这个地方都有个很好的用户体验,就是B部分的底部总不会被浏览器底部遮住,看看下面的图片分析:
情况⑴——若B底部是不会被浏览器遮住的,那么A和B顶部默认在同一水平线上:
情况⑵——若B底部有可能超过浏览器底部,导致B下方内容被遮住的话,则采取“摒弃A和B顶部在同水平线上”的显示方式,以抬高B位置(抬多高呢?嗯,只要B底端刚好贴住浏览器底端,或者比浏览器低端高一点点就行)来解决问题:
下面先说下基础架构和功能的实现吧。首先架构很简单,不外乎是写一层A的DIV(class="maintip"),再写一层对应的B的DIV(class="tips"),HTML如下:
1 <div class="maintip"><a href="#">服装类</a></div> 2 <div class="tips"> 3 <p> 4 <a href="http://www.baidu.com">各种衣服啊</a> 5 </p> <br/><br/><br/><br/><br/><br/><br/><br/><br/> 6 <p> 7 <a href="http://www.baidu.com">来百度一下找衣服啊</a> 8 </p> 9 </div> 10 11 <div class="maintip">家电数码</div> 12 <div class="tips"> 13 <p> 14 M8卖那么贵,HTC请你继续flop好么 15 </p> 16 </div> 17 18 <div class="maintip">美食</div> 19 <div class="tips"> 20 <p> 21 葡萄酒,白酒,啤酒 <br/><br/><br/><br/><br/><br/><br/><br/><br/> 22 我特么只是想把这个框拉长 23 </p> 24 </div> 25 26 <div class="maintip">玩具</div> 27 <div class="tips"> 28 <p> 29 <a href="http://www.123.com">智力魔方啊神马的你要的都有哦</a> 30 </p> 31 </div>
View Code
定义下CSS:
1 <style type="text/css"> 2 body{ 3 margin:100px; 4 } 5 .maintip{ 6 position:relative; 7 z-index:1; 8 border:1px solid #E5D1A1; 9 text-align:center; 10 width:200px; 11 background:#FFFDD2; 12 height:35px; 13 line-height:30px; 14 } 15 .tips{ 16 position:absolute; 17 z-index:2; 18 width:800px; 19 min-height:100px; 20 border:1px solid #E5D1A1; 21 background:#fff; 22 display:none; 23 } 24 </style>
View Code
注意B部分的position设为absolute。(z-index是为了让A压在B上面,A被选中时,其border-right是不上色的,且要确保该边压在B上面)
接着写下JQuery代码让鼠标移到A的某行,就显示出对应的B的那行,且默认A和B等高:
1 $(function(){ 2 3 $(".maintip").each(function(index){ //遍历A部分,注意这里绑定事件用了index参数 4 $(this).mouseover(function(){ //鼠标经过A时触发事件 5 var obj=$(this).offset(); //获取被鼠标经过的A的偏移位置,offset()是个好东西,不懂的朋友得去了解下 6 var xobj=obj.left+200+"px"; //后面要让B水平偏移的距离,这里的“200”是可自定义的,当然你可以改为$(this).width()来获得跟A一样的宽度 7 var yobj=obj.top+"px"; //后面要让B垂直偏移的距离 8 $(this).css({"width":"200px","z-index":"9999","border-right":"none","background":"#fff"}); //A改变样式,变为选中状态的效果 9 $(".tips:eq("+index+")").css({"left":xobj,"top":yobj}).show(); //对应的(这里利用了索引)B改变样式并显示出来 10 }) 11 .mouseout(function(){ //鼠标离开A时触发的事件 12 $(".tips").hide(); //B隐藏 13 $(this).css({"width":"200px","z-index":"1","border":"1px solid #E5D1A1","background":"#FFFDD2"}) //A变回原始样式 14 }) 15 }) 16 17 $(".tips").each(function(){ //遍历B 18 $(this).mouseover(function(){ //鼠标经过B时触发事件 19 $(this).prev(".maintip").css({"width":"200px","z-index":"9999","border-right":"none","background":"#fff"}) //对应的A变为选中状态效果 20 $(this).show(); //A不要隐藏了,解决因为上面写的鼠标离开A导致A隐藏 21 }) 22 .mouseout(function(){ //鼠标离开B触发事件,其实就是让B隐藏,同时A变为原始状态 23 $(this).hide(); 24 $(this).prev(".maintip").css({"width":"200px","z-index":"1","border":"1px solid #E5D1A1","background":"#FFFDD2"}); 25 }) 26 }) 27 })
现在效果如下:
但是现在还没有解决一个问题,就是如果B超过了浏览器下方,导致B的部分内容被遮住怎么办,如下图所示:
其实问题也不难解决,最终措施不外乎是当B超过浏览器底部时,把B往上挪到“B底部与浏览器底部齐平”的位置,如下图:
而具体要挪多高,这个只要获取浏览器当前可视区域的高度就能轻松获得:
如上图所示,B的顶部距离浏览器顶部的距离只要设为“win_h - b_h”即可解决问题。那么我们着手修改下js代码:
1 $(function(){ 2 3 $(".maintip").each(function(index){ 4 var tip_height=$(".tips:eq("+index+")").height(); 5 $(this).mouseover(function(){ 6 var win_height=$(window).height(); //获取浏览器当前可视区域高度 7 var obj=$(this).offset(); 8 var wobj=$(this).width(); 9 if(obj.top+tip_height<win_height){ //判断B底部是否超过浏览器底部 10 //没超过,按默认A和B顶端偏移位置一致即可 11 var xobj=obj.left+wobj+"px"; 12 var yobj=obj.top+"px"; 13 } 14 else{ 15 //超过了,那么抬高B顶部位置 16 var tip_top=win_height-tip_height; 17 var xobj=obj.left+wobj+"px"; 18 var yobj=tip_top+"px"; 19 } 20 $(this).css({"width":"200px","z-index":"9999","border-right":"none","background":"#fff"}); 21 $(".tips:eq("+index+")").css({"left":xobj,"top":yobj}).show(); 22 }).mouseout(function(){ 23 $(".tips").hide(); 24 $(this).css({"width":"200px","z-index":"1","border":"1px solid #E5D1A1","background":"#FFFDD2"}) 25 }) 26 27 }) 28 29 $(".tips").each(function(){ 30 $(this).mouseover(function(){ 31 $(this).prev(".maintip").css({"width":"200px","z-index":"9999","border-right":"none","background":"#fff"}) 32 $(this).show(); 33 }).mouseout(function(){ 34 $(this).hide(); 35 $(this).prev(".maintip").css({"width":"200px","z-index":"1","border":"1px solid #E5D1A1","background":"#FFFDD2"}); 36 }) 37 38 }) 39 })
在JQ里使用$(window).height()来获取浏览器可视区域高度是解决本章所提问题的关键。
最后轻松搞定:
我认为一个优秀的前端工程师总会舍得以“更好的体验”为目标来绞尽脑汁、压榨自己,虽然我没达到“优秀前端工程师”的高度,但依旧相信一直强迫自己去实现更多的功能,总会让我有所建树,共勉啦 :)
仿淘宝首页产品分类菜单栏的设计相关推荐
- Android仿淘宝首页UI(附代源代码及示例图片)
Android仿淘宝首页UI(附代源代码及示例图片) 可以收获 运行出来的效果 部分代码 源代码 可以收获 更改Layout中的文字和drawble中的图片即可生成适应于不同情景的APP,帮助开发者完 ...
- 安卓仿淘宝首页的分类标签实现(横向滑动)
淘宝效果 我的效果 使用recycleview实现 很简单,几行代码(只粘贴 了主要代码) GridLayoutManager gridLayoutManager = new GridLayoutMa ...
- 【仿淘宝首页】前端网页模板,大学生前端作业分享,html5+css电商网站模板,包含js动效
直接上代码 <!doctype html> <html lang="en"><head><meta charset="UTF-8 ...
- android用sku算法仿淘宝选择颜色分类弹框。
当规格超出边界会自动换行,点击规格会根据算法判断关联规格,无则灰显,全部选中后则变化图片.代码是kotlin和java混合. 效果如下,当一行显示不下所有规格时,会自动换行.用的夜神模拟器,分辨率有点 ...
- Android 实现图片轮播(仿淘宝首页商品轮播展示)
一 引用依赖 // 图片轮播图implementation 'com.github.dongjunkun:BannerLayout:1.0.6' 二 创建图片加载工具类 public class G ...
- 仿淘宝商品界面(html div+css)
<!DOCTYPE html><html><head><meta http-equiv="Content-Type" content=&q ...
- 仿淘宝网首页导航条效果
< html > < head > < meta http - equiv = " Content-Type " content = " ...
- 2022仿淘宝网首页html+css
效果图如下: 所有文件已经打包好了,上链接: 蓝奏云: 仿淘宝网站首页.zip - 蓝奏云 百度网盘: https://pan.baidu.com/s/1DsloErpJFQ_stwLQYb8dYw? ...
- 淘宝APP产品升级:首页聚焦转化和运营效率「买家秀」社区升级为 「逛逛」
转载|Tech星球 记者|李晓蕾 淘宝正在进行产品升级. 内测版淘宝主要有以下三方面变化,"微淘"升级为"订阅",和"推荐"并列在首页展示: ...
- 学生dreamweaver网页设计作业成品:电商网页设计——仿淘宝静态首页(HTML+CSS)
学生dreamweaver网页设计作业成品:电商网页设计--仿淘宝静态首页(HTML+CSS) 临近期末, 你还在为HTML网页设计结课作业,老师的作业要求感到头大?HTML网页作业无从下手?网页要求 ...
最新文章
- 删除或卸载以前添加的库:cocoapods
- 服务器返回的信息无效或无法识别的响应,c# - 服务器从Visual Studio返回了无效或无法识别的响应错误 - 堆栈内存溢出...
- 帝国整站PHP源码,帝国cms 诗词整站源码
- Java-进阶:多线程1
- centos默认安装mysql_centos6.x默认安装mysql5.7
- Redis高可用方案哨兵机制------ 配置文件sentinel.conf详解
- hive jdbc连接时的乱码问题
- 开发者开源软件商业模式
- 华硕M2A-VM+AMD4000超频方法
- docker hub上镜像手动下载_Docker 下载镜像
- 怎么把录音导入库乐队_库乐队导入电脑版 苹果库乐队怎么导入歌
- JavaEE JavaSE JavaME的区别
- 3DMax人物动画制作
- springboot 多topic 动态配置
- 北京最最最牛的IT公司都在这了
- Python 爬虫之初体验(实习僧)
- rabbitmq遇到的一些坑
- 【PMP】专题沟通管理 错题
- 跟小博老师一起学JSP ——EL表达式
- ANSYS FLUENT二维结构网络数值计算及后处理——流动传热