利用JQuery配合Ajax实现小米首页下拉框

1.效果介绍

博主首先介绍一下要制作的东西以及要实现的效果.大家打开小米官网,可以看到如img1.png中的这样一个下拉框,当我们鼠标在对象的列表中移动的时候,会出现对应的产品数据,如img2.png 鼠标移入"小米手机"列表中,会出现一个从上至下的滑动效果并出现产品信息.

小米首页下拉框:


img1.png

鼠标移入"小米手机"列表中:

img2.png

2.步骤简介

1.在布局上,"小米手机","红米"等等的列表只要写入一个ul就行了,ul(headwrap)中只有一个隐藏的div(class为div_hid),其他所有的信息,我们利用Ajax读取创建进去就行了
2.利用$.get("data.json",function(result){})从data.json数据中读取到对应的数据(即回调函数中的result),然后再对这些数据进行操作.

3.HTML布局

<ul class = "headwrap">
  <div class = "div_hid"></div>
</ul>

3.data.json简介

这里我的data.json数据仅仅只是小米官网下拉框的这一部分,如img3.png所示,json内是一个数组,数组中有10项,每一项都是一个对象,对应着一个列表.

img3.png

而数组中的每一个对象下又有tittledata俩个属性,其中data属性是一个数组,数组中的每一项对应一个产品信息.如img4.png

img4.png

4.JS代码

第一步:
可以通过JQuery内置的Ajax调用get方法读取到data.json数据并遍历读取到的数据,所有的操作全部都是在get方法中的函数内执行的,然后创建li标签并向li标签中添加对应的数据内容:

/**
 *通过JQuery内置的Ajax的get方法从json中读取数据并初始化下拉框的菜单栏
 */
  $.get('data.json', function (result) {
    for (let res of result) {
    //创建标题li
        let $li_top = $(`<li class="li_top"><a class="li_top_a">${res.title}</a></li>`);
    //将创建好的每一个li添加到ul中
        $li_top.appendTo($('.headwrap'));
  见第二步
    }

第二步:
先获取到上面创建好的所有li标签,对它们进行遍历,给每个li都添加mouseenter事件,鼠标移入对应的li列表中,创建对应的数据并添加在页面中


$('.li_top').each(function (index, element) {
     //利用index()方法获取到当前指向的这个列表li在所有li列表集合中的索引值.
       var index1 = $(this).index();
   //给每个li列表添加mouseenter事件
       $(this).on('mouseenter', function () {
   //在给隐藏div添加数据之前,先清空它
               $('.div_hid').html('');
   //创建一个ul标签,用来盛放所有的产品信息
               var $ul_hid = $(`<ul class="a1_con"></ul>`);
   //遍历data.json数据中的对应li列表下标的对象的data数组
   //res表示的就是数组中的每一项,也就是每一个产品的信息
               for (var res of result[index1].data) {
   //创建li标签用于添加每一个产品的信息
                   var li_hid = $(`<li class="a1_con_li">
                       <div class="a1_con_con">
                       <a href="#">
                         <img src=${res.img}>
                       </a>
                       </div>
                       <div class="a1_con_foot">
                           <a href="">${res.title}</a>
                           <p>${res.price}</p>
                       </div></li>`);
                 //因为产品中有的有"新品","享免息"等标签,有的没有,所以这里要做一个判断
                   if(res.flag!=""){
                       $(`<div class="a1_con_top">${res.flag}</div>`).appendTo(li_hid);
                   }
                 //将创建好的隐藏的li标签(也就是每个产品信息)添加到隐藏ul中
                   li_hid.appendTo($ul_hid);
               }
             //将隐藏的ul添加到隐藏的div中
               $ul_hid.appendTo($('.a1'));
       });
   });
});  //$.get()

第三步:
下拉框的效果实际是分为俩块:
第一块:鼠标移入包裹li列表的ul(class为headwarp)中,隐藏div(div_hid)从上至下滑动出来,鼠标移出包裹li列表的ul,隐藏div从下至上滑动上去.
第二块:鼠标在ul(class为headwarp)内部之间的li列表移动,不会有滑动效果,只有数据的变换.
所以我们可以对ul(class为headwarp)进行事件监听,并让它冒泡到最底层放字的a标签中.(这里有一点要注意的是,最后俩个li列表也就是"服务"和"社区"是没有内容的,所以鼠标移到它们上面应该是不执行隐藏div滑动的效果的).具体代码如下:

$('.headwrap').on({
    'mouseover':function(event) {
      //判断若冒泡的目标是a标签,则执行之后的代码
        if(event.target.nodeName.toLowerCase() == 'a'){
          //判断若a标签中的内容是"服务"或者"社区"则让隐藏div回去
            if($(event.target).html()=="服务"||$(event.target).html()=="社区"){
                $('.div_hid').slideUp(300);
                return;
            }
          //调用slideDown()让隐藏div在300毫秒内滑动下来
            $('.div_hid').slideDown(300);
        }
    },
    'mouseleave':function () {
      //当鼠标离开时,调用slideDown()让隐藏div在300毫秒内滑动上去
        $('.div_hid').slideUp(300);
    }
});

面向对象版本

上面博主介绍的是面向过程的版本,这里再来一个面向对象的版本.
面向对象呢,我用的是class类的做法:

1.声明类

先声明一个类TopNav用来充当构造函数
这个类中有:
1.类的构造函数:constructor();
2.初始化函数:_init();
3.加载创建列表li:loadTopLi();
4.改变隐藏div内的内容:changeHidDiv();
5.加载创建隐藏ul:loadHidUl();
6.加载创建隐藏li:loadHidLi();

2.设计每个函数

面向对象的思想就是将每一个功能都用一个函数来写,各个功能直接互不影响,若是有需要添加的功能直接再添加函数就行了.

class TopNav{
    constructor(container){
        this.container = container;
        this.container.on({
            'mouseover':function(event) {
                if(event.target.nodeName.toLowerCase() == 'a'){
                    if($(event.target).html()=="服务"||$(event.target).html()=="社区"){
                        $('.a1').slideUp(300);
                        return;
                    }
                    $('.a1').slideDown(300);
                }
            },
            'mouseleave':function () {
                $('.a1').slideUp(300);
            }
        });
    }

    /**
     * 初始化函数
     * @private
     */
    _init(){
        $.get('list.json',(result)=>{
            this.result = result;
            this.loadTopLi();
        })
    }
    /**
     * 加载创建上面的列表li
     */
    loadTopLi(){
        for(let i=0;i<this.result.length;i++){
            let $li_top = $(`<li class="li_top"><a class="li_top_a">${this.result[i].title}</a></li>`)
            $li_top.on('mouseenter',()=>{
                this.changeHidDiv(this.result[i].data);
            });
            $li_top.appendTo(this.container);
        }
    }

    /**
     * 改变隐藏div内的内容
     */
    changeHidDiv(res){
        let $a1 = $('.a1');
        $a1.html('');
        this.loadHidUl($a1,res)
    }

    /**
     * 加载创建隐藏ul
     */
    loadHidUl(container,res){
        let $ul_hid = $(`<ul class="a1_con"></ul>`);
        for(let i=0;i<res.length;i++){
            this.loadHidLi($ul_hid,res[i])
        }
        $ul_hid.appendTo(container);
    }

    /**
     * 加载创建隐藏li
     */
    loadHidLi(container,res){
            let li_hid = $(`<li class="a1_con_li">
                        <div class="a1_con_con">
                        <a href="#">
                          <img src=${res.img}>
                        </a>
                        </div>
                        <div class="a1_con_foot">
                            <a href="">${res.title}</a>
                            <p>${res.price}</p>
                        </div></li>`);
            if(res.flag!=""){
                $(`<div class="a1_con_top">${res.flag}</div>`).appendTo(li_hid);
            }
            li_hid.appendTo(container);
    }
}

3.声明一个对象并调用类中的初始化函数(_init)

let topNav = new TopNav($('.headwrap_2_2'));
topNav._init();

后文:

小米首页的下拉框主要是有几点要注意的:
1.鼠标移和移出ul(class为headwarp)时,隐藏div(class为div_hid)有滑动效果出来或者消失,但是鼠标在ul内部移动的时候没有滑动效果.这里可以交给事件代理去做.

2.隐藏div内的内容主要是靠Ajax从data.json文件中读取到数据并创建各种标签,然后添加到其中.

3.在每次创建新的数据标签并添加到隐藏div之前,先要将隐藏div清空,而清空常用的一种方式是$('.div_hid').html("").

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,902评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,037评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,978评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,867评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,763评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,104评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,565评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,236评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,379评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,313评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,363评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,034评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,637评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,719评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,952评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,371评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,948评论 2 341

推荐阅读更多精彩内容

  • 1.JQuery 基础 改变web开发人员创造搞交互性界面的方式。设计者无需花费时间纠缠JS复杂的高级特性。 1....
    LaBaby_阅读 1,155评论 0 1
  • 1.JQuery 基础 改变web开发人员创造搞交互性界面的方式。设计者无需花费时间纠缠JS复杂的高级特性。 1....
    LaBaby_阅读 1,316评论 0 2
  • 请参看我github中的wiki,不定期更新。https://github.com/ivonzhang/Front...
    zhangivon阅读 7,087评论 2 19
  • $(”p”).addClass(css中定义的样式类型); 给某个元素添加样式 $(”img”).attr({sr...
    专注寒冰三千岁阅读 501评论 0 4
  • 同一律指的是任何时候任何人在讲一件事情的时候都要保证一个论题,一个概念。假如两人讨论问题,不在同一个频道,那么就会...
    伊森田慧慧阅读 252评论 0 0