这几天一直在给一家电商搞前端开发,首页做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()来获取浏览器可视区域高度是解决本章所提问题的关键。

最后轻松搞定:

我认为一个优秀的前端工程师总会舍得以“更好的体验”为目标来绞尽脑汁、压榨自己,虽然我没达到“优秀前端工程师”的高度,但依旧相信一直强迫自己去实现更多的功能,总会让我有所建树,共勉啦 :)

仿淘宝首页产品分类菜单栏的设计相关推荐

  1. Android仿淘宝首页UI(附代源代码及示例图片)

    Android仿淘宝首页UI(附代源代码及示例图片) 可以收获 运行出来的效果 部分代码 源代码 可以收获 更改Layout中的文字和drawble中的图片即可生成适应于不同情景的APP,帮助开发者完 ...

  2. 安卓仿淘宝首页的分类标签实现(横向滑动)

    淘宝效果 我的效果 使用recycleview实现 很简单,几行代码(只粘贴 了主要代码) GridLayoutManager gridLayoutManager = new GridLayoutMa ...

  3. 【仿淘宝首页】前端网页模板,大学生前端作业分享,html5+css电商网站模板,包含js动效

    直接上代码 <!doctype html> <html lang="en"><head><meta charset="UTF-8 ...

  4. android用sku算法仿淘宝选择颜色分类弹框。

    当规格超出边界会自动换行,点击规格会根据算法判断关联规格,无则灰显,全部选中后则变化图片.代码是kotlin和java混合. 效果如下,当一行显示不下所有规格时,会自动换行.用的夜神模拟器,分辨率有点 ...

  5. Android 实现图片轮播(仿淘宝首页商品轮播展示)

    一  引用依赖 // 图片轮播图implementation 'com.github.dongjunkun:BannerLayout:1.0.6' 二 创建图片加载工具类 public class G ...

  6. 仿淘宝商品界面(html div+css)

    <!DOCTYPE html><html><head><meta http-equiv="Content-Type" content=&q ...

  7. 仿淘宝网首页导航条效果

    < html > < head > < meta http - equiv = " Content-Type "  content = " ...

  8. 2022仿淘宝网首页html+css

    效果图如下: 所有文件已经打包好了,上链接: 蓝奏云: 仿淘宝网站首页.zip - 蓝奏云 百度网盘: https://pan.baidu.com/s/1DsloErpJFQ_stwLQYb8dYw? ...

  9. 淘宝APP产品升级:首页聚焦转化和运营效率「买家秀」社区升级为 「逛逛」

    转载|Tech星球 记者|李晓蕾 淘宝正在进行产品升级. 内测版淘宝主要有以下三方面变化,"微淘"升级为"订阅",和"推荐"并列在首页展示: ...

  10. 学生dreamweaver网页设计作业成品:电商网页设计——仿淘宝静态首页(HTML+CSS)

    学生dreamweaver网页设计作业成品:电商网页设计--仿淘宝静态首页(HTML+CSS) 临近期末, 你还在为HTML网页设计结课作业,老师的作业要求感到头大?HTML网页作业无从下手?网页要求 ...

最新文章

  1. 删除或卸载以前添加的库:cocoapods
  2. 服务器返回的信息无效或无法识别的响应,c# - 服务器从Visual Studio返回了无效或无法识别的响应错误 - 堆栈内存溢出...
  3. 帝国整站PHP源码,帝国cms 诗词整站源码
  4. Java-进阶:多线程1
  5. centos默认安装mysql_centos6.x默认安装mysql5.7
  6. Redis高可用方案哨兵机制------ 配置文件sentinel.conf详解
  7. hive jdbc连接时的乱码问题
  8. 开发者开源软件商业模式
  9. 华硕M2A-VM+AMD4000超频方法
  10. docker hub上镜像手动下载_Docker 下载镜像
  11. 怎么把录音导入库乐队_库乐队导入电脑版 苹果库乐队怎么导入歌
  12. JavaEE JavaSE JavaME的区别
  13. 3DMax人物动画制作
  14. springboot 多topic 动态配置
  15. 北京最最最牛的IT公司都在这了
  16. Python 爬虫之初体验(实习僧)
  17. rabbitmq遇到的一些坑
  18. 【PMP】专题沟通管理 错题
  19. 跟小博老师一起学JSP ——EL表达式
  20. ANSYS FLUENT二维结构网络数值计算及后处理——流动传热

热门文章

  1. PL/SQL Developer 8注册码
  2. We7从这里开始---认识we7
  3. 【OpenCV入门指南】第三篇Canny边缘检测
  4. Mac如何修改文件默认打开方式?
  5. 如何使用CleanMyMac快速释放系统内存?
  6. centos 7 重设密码总是失败
  7. Linux脚本中带有小数点的数值比较大小
  8. BZOJ2337:[HNOI2011]XOR和路径——题解
  9. 图片加载库之Glide和Picasso对比
  10. Hadoop-2.0命令手册