91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

jQuery 關于點擊菜單項,使子條目"向上"展開效果的實現

發布時間:2020-05-29 10:53:37 來源:網絡 閱讀:1580 作者:我不會抽煙 欄目:web開發

為什么做了這樣一個的功能呢?原因是前一段時間jQuery群里有個朋友想實現這樣一個東東,大家都知道jQuery中有現成的slideDown和slideUp方法,但那是向下展開,而這個是一個完全相反的效果。

功能展示鏈接 http://runjs.cn/detail/v6i9g6g0

其實這樣一個功能也蠻奇怪的,感覺不是很實用,但是當時也沒有一下子做出來,試著寫了一會兒覺得不能馬上寫完就say sorry了。

最近呢又開始接著繼續學習jQuery的東西,學到animate動畫的時候,自己就在想,是不是可以用來實現一下這個功能呢(這個真是個心結啊~~)?然后就試著寫了一下,經過一番波折,不僅讓我對animate的使用更加了解之外,也讓我了解了一個用jQuery的小技巧,更重要的是,實現這個功能。

下面上代碼并做出解析:

Html部分:

    <div>
        <span>Item1.1</span>
        <span>Item1.2</span>
        <span>Item1.3</span>
        <span>Item1.4</span>
    </div>
    <div>
        <span>Item2.1</span>
        <span>Item2.2</span>
        <span>Item2.3</span>
        <span>Item2.4</span>
    </div>
    <div>
        <span>Item3.1</span>
        <span>Item3.2</span>
    </div>
    <div>
        <span>Item4.1</span>
        <span>Item4.2</span>
    </div>
    <div class="menu">
        <span>Item1</span>
        <span>Item2</span>
        <span>Item3</span>
        <span>Item4</span>
    </div>

文檔結構是這樣子的,大家可以看到menu這個主菜單的菜單項的順序與子菜單的實際順序是一致的。這個是為點擊菜單項上的條目通過位置查找對應子項做的一個設計。

jQuery部分:

        $(function () {
            $("div").each(function () {//遍歷所有div元素
                if ($(this).is("[class='menu']")) {//如果是菜單所在的div
                    $(this).css({ "top": $(this).height() + $(this).position().top,
                        "position": "absolute",
                        "color": "white",
                        "background-color": "white",
                        "width": "500px",
                        "left": "200px"
                    })//為菜單添加樣式
                    .children("span").css({ "background-color": "DimGrey",
                        "border": "black solid thin"
                    })//為菜單項添加樣式
                    .each(function () {//對每個菜單項進行遍歷
                        $(this).click(function () {//添加click事件
                            var Ind = $("div.menu").children().index(this);//找出當前點擊的菜單項是菜單div中的第幾個span
                            var FocusEle = $("div:eq(" + Ind + ")");//將選中菜單項的子項設成一個變量
                            if ($("div[class*='up']").size() == 0) {//說明是第一次加載,初次的時候為沒選中任何菜單項的狀態,所以up的個數為0
                                FocusEle.animate(
                                {
                                    top: $(this).height() - 10//使對應的子項向上移動
                                },
                                'normal',//中速移動
                                function () {
                                    $(this).addClass("up");//移動完之后為這個子項加上up的樣式
                                });
                            } else {//如果不是初次加載
                                $("div[class*='up']").animate(//找到正在顯示的菜單子項
                                {
                                    top: $(this).height() + 10//使對應子項向下移動
                                },
                                'normal',
                                function () {
                                    $(this).removeClass("up");//移除這個子項的up樣式
                                    FocusEle.animate(//一
                                    {
                                        top: $(this).height() - 10//將重新選中的菜單子項向上移動
                                    },
                                    'normal',
                                    function () {
                                        $(this).addClass("up");//添加up樣式
                                    });
                                })
                                //***************************特別說明**********************
//                                .queue(function () {二
//                                    FocusEle.animate(
//                                    {
//                                        top: $(this).height() - 10
//                                    },
//                                    'slow',
//                                    function () {
//                                        $(this).addClass("up");
//                                    });
//                                });
                            }

                        }).css("cursor", "pointer").hover(function () {
                            $(this).css("color", "red");
                        }, function () {
                            $(this).css("color", "white");
                        })
                    });
                }
                else {//如果不是菜單所在的div,即菜單子項
                    var Index = $("div").index(this);
                    var Left = $("div.menu span:eq(" + Index + ")").position().left + 200;//修改不同子項的橫坐標,使其與菜單項的條目一致
                    $(this).css({ "top": $(this).height() + $(this).position().top,
                        "left": Left,
                        "color": "white",
                        "position": "absolute"
                    })//為菜單子項添加樣式
                    .children().css({
                        "background-color": "SlateGrey",
                        "border": "black solid thin",
                        "cursor": "pointer"
                    }).hover(function () {
                        $(this).css("color", "red");
                    }, function () {
                        $(this).css("color", "white");
                    });
                }
            })
        });

上面的代碼幾乎是逐條注釋的,大家應該都能看懂,主要的實現思想我還是說一下,大家再結合著注釋看就OK了,大家會發現實現這個功能的時候完全沒有顯示(show()),隱藏(hide())的操作,最開始我也是一個思維誤區,以為必須要用顯示,隱藏去實現,但做著做著發現了一個非常傻的問題,展開的效果實現上是通過移動隱藏和顯示來實現的。怎么說呢,大家想想看完電影之后演員名單那部分的東西就能有個概念了。

這里有兩點很重要:

1、這5個div全部為absolute形式的,因為只有這樣才能進行相對移動

2、所謂的消失,實際上是4個子項的div被menu div也遮擋住了,所以這里要知道,我給menu div加了背景色,即白色。

說到這大家應該就知道是如何實現的了吧?

另外在說一 下 注釋中”特別說明”的那部分,其實這部分代碼與它上面不遠處的【一】的代碼是一樣的,只是前面加了.queue這么東西,這是做什么的呢?就是將多個動畫放到一個隊列里,然后依據隊列的次序,一個一個的展現出來。我的初衷就是,如果當前有子項是展開狀態的,那么就“先”把其關閉,“后”把新點擊的子項展開。

不過不知道為什么,如果是二次進行了點擊的子項,就不會再經過queue 中animate結束時那個function了。這個有明白為什么的朋友可以幫忙解答一下。然而像我【一】中這個實現,也是合乎規則的。

其實這個小功能還有點弊端,就是如果點擊過快,大家會發現同時展開多項子菜單,原因是動畫的過程是需要時間的,而在這段時間里我沒有禁止click事件。應該是用指派命名空間的方法就可以搞定。大家可以研究研究然后告訴我。

最后總結了一下,寫這個小功能有點慚愧的說寫了挺長時間,中間換了好多方法為解決一些問題,現在看來,這么簡單的東西為什么會寫這么久,還是因為最開始的時候沒有想好,邊寫邊想花費了許多時間。以后要改進這種做事方法。


新浪微博:http://weibo.com/zhouhongyu1989 歡迎圍觀~!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

永泰县| 盱眙县| 汶上县| 阜南县| 长寿区| 渑池县| 大港区| 德格县| 塔河县| 民乐县| 仙游县| 专栏| 金华市| 枣强县| 盐源县| 阿城市| 东阿县| 石棉县| 阿勒泰市| 三门县| 普安县| 施甸县| 莱州市| 博罗县| 卢湾区| 高青县| 南汇区| 华阴市| 河东区| 萍乡市| 曲水县| 晋中市| 香格里拉县| 韶山市| 绩溪县| 新乐市| 望城县| 徐汇区| 普定县| 南和县| 新乡县|