웹 프론트엔드 JS 튜토리얼 Js는 Jingdong의 지연 없는 메뉴 효과를 실현합니다(데모)

Js는 Jingdong의 지연 없는 메뉴 효과를 실현합니다(데모)

Jun 26, 2017 pm 03:04 PM
javascript 징둥 성취하다 지연 효과 메뉴

용선축제인데 밖에 사람도 많고 너무 더워서 집에 있으면서 MOOC를 봐야 더 풍성한 경험을 할 수 있을 것 같아요...

이것은 js 입니다. JD 논딜레이 메뉴 구현 효과가 너무 좋아요, 모두와 공유하고 싶어요...

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

<span style="color: #000000">先来理清思路:<br>1.开发基本的菜单结构    

 

2.开发普通的二级菜单效果

 

3.假如延迟解决移动问题

  切换子菜单时候,用setTimeout设置延迟

 

  debounce去抖技

  在事件被频繁触发是,只执行一次处理

 

4.解决延迟引入的新问题  

  跟踪鼠标的移动

  用鼠标当前位置,和鼠标上一次位置与子菜单上下边缘的三角形区域进行比较

   

  运用到向量

  二位向量叉乘公式

  用叉乘法判断点在三角形内</span>

로그인 후 복사

1

2

最终效果:鼠标自然的移动和点击到子菜单

         切换时无延迟

로그인 후 복사

아래 코드를 시작하세요:

Develop 기본 메뉴 구조

1

&lt;!doctype html&gt;&lt;html lang=&quot;en&quot;&gt;&lt;head&gt;&lt;meta charset=&quot;UTF-8&quot;&gt;&lt;title&gt;京东菜单无刷新&lt;/title&gt;&lt;script src=&quot;js/jquery-1.7.2.min.js?1.1.11&quot;&gt;&lt;/script&gt;&lt;script src=&quot;js/mche.js?1.1.11&quot;&gt;&lt;/script&gt;&lt;script src=&quot;js/function.js?1.1.11&quot;&gt;&lt;/script&gt;&lt;style&gt;.wrap{position:relative;width:200px;left:50px;top:50px;}ul{padding:15px;margin:9;list-style:none;background:#6c6669;color:#ffffff;border-right-width:0;}/*水平居中*/li{display:block;height:30px;line-height: 30px;padding-left:12px;cursor:pointer;font-size: 14px;position:relative;}/*鼠标移动上去的背景色*/li.active{background:#999395;}/*js可以很好地调用类,一般效果css实现就好*/li span:hover{color:#c81623;}/*隐藏的类*/.none{display: none;}/*二级菜单*/#sub{width:600px;position: absolute;border:1px solid #f7f7f7;background:#f7f7f7;box-shadow:2px 0 rgba(0,0,0,.3);left: 200px;top:0;box-sizing:border-box;margin: 0px;padding:10px;}.sub-content a{font-style:12px;color:#666;text-decoration:none;}.sub-content dd a{border-left:1px solid #e0e0e0;padding:0 1px;margin:4px 0;}.sub-content dl {overflow:hidden;}.sub-content dt{float: left;width:70px;font-weight: bold;clear:left;position:relative;}.sub-content dd {float: left;margin-left: 5px;border-top:1px solid #eee;margin-bottom: 5px;}.sub-content dt i{width:4px;height: 14px;font:400 9px/14px consolas;position: absolute;right:5px;top:5px;}&lt;/style&gt;&lt;/head&gt;&lt;body&gt;&lt;div class=&quot;wrap&quot; id=&quot;test&quot;&gt;&lt;ul&gt;&lt;li data-id=&quot;a&quot;&gt;&lt;span&gt;家用电器&lt;/span&gt;    &lt;/li&gt;&lt;li data-id=&quot;b&quot;&gt;&lt;span&gt;手机 / 运营商 / 数码&lt;/span&gt;    &lt;/li&gt;&lt;li data-id=&quot;c&quot;&gt;&lt;span&gt;电脑办公 / 办公&lt;/span&gt;    &lt;/li&gt;&lt;li data-id=&quot;d&quot;&gt;&lt;span&gt;家居 / 家具 / 家装 / 厨具&lt;/span&gt;    &lt;/li&gt;&lt;li data-id=&quot;e&quot;&gt;&lt;span&gt;男装 / 女装 / 童装 / 内衣 &lt;/span&gt;    &lt;/li&gt;&lt;li data-id=&quot;f&quot;&gt;&lt;span&gt;美妆个护 / 宠物 &lt;/span&gt;    &lt;/li&gt;&lt;li data-id=&quot;g&quot;&gt;&lt;span&gt;女鞋 / 箱包 / 钟表 / 珠宝 &lt;/span&gt;    &lt;/li&gt;&lt;li data-id=&quot;h&quot;&gt;&lt;span&gt;男鞋 / 运动 / 户外&lt;/span&gt;    &lt;/li&gt;&lt;li data-id=&quot;i&quot;&gt;&lt;span&gt;汽车 / 汽车用品  &lt;/span&gt;    &lt;/li&gt;&lt;/ul&gt;&lt;div id=&quot;sub&quot; class=&quot;none&quot;&gt;&lt;div id=&quot;a&quot; class=&quot;sub-content none&quot;&gt;&lt;dl&gt;&lt;dt&gt;&lt;a href=&quot;#&quot;&gt;电视&lt;i&gt;&amp;gt&lt;/i&gt;&lt;/a&gt;&lt;/dt&gt;&lt;dd&gt;&lt;a href=&quot;#&quot;&gt;曲面电视&lt;/a&gt;&lt;a href=&quot;#&quot;&gt;超薄电视&lt;/a&gt;&lt;a href=&quot;#&quot;&gt;HDR电视&lt;/a&gt;&lt;a href=&quot;#&quot;&gt;DLED电视&lt;/a&gt;&lt;/dd&gt;&lt;dt&gt;&lt;a href=&quot;#&quot;&gt;空调&lt;i&gt;&amp;gt&lt;/i&gt;&lt;/a&gt;&lt;/dt&gt;&lt;dd&gt;&lt;a href=&quot;#&quot;&gt;挂壁式空调&lt;/a&gt;&lt;a href=&quot;#&quot;&gt;柜式空调&lt;/a&gt;&lt;a href=&quot;#&quot;&gt;中央空调&lt;/a&gt;&lt;a href=&quot;#&quot;&gt;以旧换新&lt;/a&gt;&lt;/dd&gt;&lt;dt&gt;&lt;a href=&quot;#&quot;&gt;洗衣机&lt;i&gt;&amp;gt&lt;/i&gt;&lt;/a&gt;&lt;/dt&gt;&lt;dd&gt;&lt;a href=&quot;#&quot;&gt;滚筒式洗衣机&lt;/a&gt;&lt;a href=&quot;#&quot;&gt;洗烘一体机&lt;/a&gt;&lt;a href=&quot;#&quot;&gt;波轮洗衣机&lt;/a&gt;&lt;a href=&quot;#&quot;&gt;迷你洗衣机&lt;/a&gt;&lt;/dd&gt;&lt;/dl&gt;&lt;/div&gt;&lt;div id=&quot;b&quot; class=&quot;sub-content none&quot;&gt;&lt;dl&gt;&lt;dt&gt;&lt;a href=&quot;#&quot;&gt;手机通讯&lt;i&gt;&amp;gt&lt;/i&gt;&lt;/a&gt;&lt;/dt&gt;&lt;dd&gt;&lt;a href=&quot;#&quot;&gt;手机&lt;/a&gt;&lt;a href=&quot;#&quot;&gt;对讲机&lt;/a&gt;&lt;a href=&quot;#&quot;&gt;以旧换新&lt;/a&gt;&lt;a href=&quot;#&quot;&gt;手机维修&lt;/a&gt;&lt;/dd&gt;&lt;dt&gt;&lt;a href=&quot;#&quot;&gt;运营商&lt;i&gt;&amp;gt&lt;/i&gt;&lt;/a&gt;&lt;/dt&gt;&lt;dd&gt;&lt;a href=&quot;#&quot;&gt;合约机&lt;/a&gt;&lt;a href=&quot;#&quot;&gt;选号机&lt;/a&gt;&lt;a href=&quot;#&quot;&gt;固定电话&lt;/a&gt;&lt;a href=&quot;#&quot;&gt;办宽带&lt;/a&gt;&lt;/dd&gt;&lt;dt&gt;&lt;a href=&quot;#&quot;&gt;手机配件&lt;i&gt;&amp;gt&lt;/i&gt;&lt;/a&gt;&lt;/dt&gt;&lt;dd&gt;&lt;a href=&quot;#&quot;&gt;手机壳&lt;/a&gt;&lt;a href=&quot;#&quot;&gt;贴膜&lt;/a&gt;&lt;a href=&quot;#&quot;&gt;手机存储卡&lt;/a&gt;&lt;a href=&quot;#&quot;&gt;数据线&lt;/a&gt;&lt;/dd&gt;&lt;/dl&gt;&lt;/div&gt;&lt;div id=&quot;c&quot; class=&quot;sub-content none&quot;&gt;&lt;dl&gt;&lt;dt&gt;&lt;a href=&quot;#&quot;&gt;电脑整机&lt;i&gt;&amp;gt&lt;/i&gt;&lt;/a&gt;&lt;/dt&gt;&lt;dd&gt;&lt;a href=&quot;#&quot;&gt;笔记本&lt;/a&gt;&lt;a href=&quot;#&quot;&gt;游戏本&lt;/a&gt;&lt;a href=&quot;#&quot;&gt;平板电脑&lt;/a&gt;&lt;/dd&gt;&lt;dt&gt;&lt;a href=&quot;#&quot;&gt;电脑配件&lt;i&gt;&amp;gt&lt;/i&gt;&lt;/a&gt;&lt;/dt&gt;&lt;dd&gt;&lt;a href=&quot;#&quot;&gt;显示器&lt;/a&gt;&lt;a href=&quot;#&quot;&gt;CPU&lt;/a&gt;&lt;a href=&quot;#&quot;&gt;主板&lt;/a&gt;&lt;/dd&gt;&lt;dt&gt;&lt;a href=&quot;#&quot;&gt;外设产品&lt;i&gt;&amp;gt&lt;/i&gt;&lt;/a&gt;&lt;/dt&gt;&lt;dd&gt;&lt;a href=&quot;#&quot;&gt;鼠标&lt;/a&gt;&lt;a href=&quot;#&quot;&gt;键盘&lt;/a&gt;&lt;a href=&quot;#&quot;&gt;键盘套餐&lt;/a&gt;&lt;/dd&gt;&lt;/dl&gt;&lt;/div&gt;&lt;div id=&quot;d&quot; class=&quot;sub-content none&quot;&gt;&lt;dl&gt;&lt;dt&gt;&lt;a href=&quot;#&quot;&gt;厨具&lt;i&gt;&amp;gt&lt;/i&gt;&lt;/a&gt;&lt;/dt&gt;&lt;dd&gt;&lt;a href=&quot;#&quot;&gt;烹饪锅具&lt;/a&gt;&lt;a href=&quot;#&quot;&gt;刀剪配件&lt;/a&gt;&lt;a href=&quot;#&quot;&gt;厨房配件&lt;/a&gt;&lt;a href=&quot;#&quot;&gt;水具酒具&lt;/a&gt;&lt;/dd&gt;&lt;dt&gt;&lt;a href=&quot;#&quot;&gt;家纺&lt;i&gt;&amp;gt&lt;/i&gt;&lt;/a&gt;&lt;/dt&gt;&lt;dd&gt;&lt;a href=&quot;#&quot;&gt;床品套件&lt;/a&gt;&lt;a href=&quot;#&quot;&gt;被子&lt;/a&gt;&lt;a href=&quot;#&quot;&gt;枕芯&lt;/a&gt;&lt;a href=&quot;#&quot;&gt;蚊帐&lt;/a&gt;&lt;/dd&gt;&lt;dt&gt;&lt;a href=&quot;#&quot;&gt;生活日用&lt;i&gt;&amp;gt&lt;/i&gt;&lt;/a&gt;&lt;/dt&gt;&lt;dd&gt;&lt;a href=&quot;#&quot;&gt;收纳用品&lt;/a&gt;&lt;a href=&quot;#&quot;&gt;雨伞雨具&lt;/a&gt;&lt;a href=&quot;#&quot;&gt;净化除味&lt;/a&gt;&lt;a href=&quot;#&quot;&gt;浴室用品&lt;/a&gt;&lt;/dd&gt;&lt;/dl&gt;&lt;/div&gt;&lt;div id=&quot;e&quot; class=&quot;sub-content none&quot;&gt;&lt;dl&gt;&lt;dt&gt;&lt;a href=&quot;#&quot;&gt;女装&lt;i&gt;&amp;gt&lt;/i&gt;&lt;/a&gt;&lt;/dt&gt;&lt;dd&gt;&lt;a href=&quot;#&quot;&gt;商城同款&lt;/a&gt;&lt;a href=&quot;#&quot;&gt;当季热卖&lt;/a&gt;&lt;a href=&quot;#&quot;&gt;2017新品&lt;/a&gt;&lt;a href=&quot;#&quot;&gt;连衣裙&lt;/a&gt;&lt;/dd&gt;&lt;dt&gt;&lt;a href=&quot;#&quot;&gt;男装&lt;i&gt;&amp;gt&lt;/i&gt;&lt;/a&gt;&lt;/dt&gt;&lt;dd&gt;&lt;a href=&quot;#&quot;&gt;商城同款&lt;/a&gt;&lt;a href=&quot;#&quot;&gt;当季热卖&lt;/a&gt;&lt;a href=&quot;#&quot;&gt;2017新品&lt;/a&gt;&lt;a href=&quot;#&quot;&gt;牛仔裤&lt;/a&gt;&lt;/dd&gt;&lt;/dl&gt;&lt;/div&gt;&lt;div id=&quot;f&quot; class=&quot;sub-content none&quot;&gt;&lt;dl&gt;&lt;dt&gt;&lt;a href=&quot;#&quot;&gt;面部护肤&lt;i&gt;&amp;gt&lt;/i&gt;&lt;/a&gt;&lt;/dt&gt;&lt;dd&gt;&lt;a href=&quot;#&quot;&gt;补水保湿&lt;/a&gt;&lt;a href=&quot;#&quot;&gt;卸妆&lt;/a&gt;&lt;a href=&quot;#&quot;&gt;洁面&lt;/a&gt;&lt;/dd&gt;&lt;/dl&gt;&lt;/div&gt;&lt;/div&gt;&lt;/ul&gt;&lt;/body&gt;&lt;/html&gt;

로그인 후 복사

두 번째, 세 번째 문제를 해결하세요

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

$(document).ready(function(){var sub = $('#sub')var activeRowvar activeMenuvar timervar mouseInSub = falsesub.on('mouseenter',function(e){

        mouseInSub = true}).on('mouseleave',function(e){

        mouseInSub = false})var mouseTrack = []var moveHandler = function(e){

        mouseTrack.push({

            x:e.pageX,

            y:e.pageY

        })if(mouseTrack.length &gt; 3){

            mouseTrack.shift()

        }

    }

 

    $('#test')

        .on('mouseenter',function(e){

            sub.removeClass('none')

 

            $(document).bind('mousemove',moveHandler)

        })

        .on('mouseleave',function(e){

            sub.addClass('none')if(activeRow){

                activeRow.removeClass('active')

                activeRow = null;

            }if(activeMenu){

                activeMenu.addClass('none')

                activeMenu = null;

            }//解绑$(document).unbind('mousemove',moveHandler)

        })

 

        .on('mouseenter','li',function(e){if(!activeRow){

                activeRow = $(e.target).addClass('acrive')

                activeMenu = $('#'+activeRow.data('id'))

                activeMenu.removeClass('none')return}//清除if(timer){

                clearTimeout(timer)

            }//鼠标当前坐标var  currMousePos = mouseTrack[mouseTrack.length - 1]//上次的坐标var leftCorner = mouseTrack[mouseTrack.length-2]var delay = needDelay(sub,leftCorner,currMousePos)if(delay){// 时间触发,设置一个缓冲期timer = setTimeout(function(){//判断if(mouseInSub){return}

                    activeRow.removeClass('active')

                    activeMenu.addClass('none')

 

                    activeRow = $(e.target)

                    activeRow.addClass('active')

                    activeMenu = $('#'+ activeRow.data('id'))

                    activeMenu.removeClass('none')

 

                    timer = null}, 300)

            }else{var prevActiveRow = activeRowvar prevActiveMenu = activeMenu

 

                activeRow = $(e.target)

                activeMenu = $('#' + activeRow.data('id'))

 

                prevActiveRow.removeClass('active')

                prevActiveMenu.addClass('none')

 

                activeRow.addClass('active')

                activeMenu.removeClass('none')

            }

        })

})

로그인 후 복사

지연으로 인해 발생하는 새로운 문제를 해결하세요

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

function sameSign(a,b){return (a ^ b) &gt;= 0}function vector(a,b){return{

        x:b.x - a.x,

        y:b.y - a.y

    }

}function vectorProduct(v1,v2){return v1.x * v2.y - v2.x * v1.y

}function isPointInTrangle(p,a,b,c){var pa = vector(p,a)var pb = vector(p,b)var pc = vector(p,c)var t1 = vectorProduct(pa,pb)var t2 = vectorProduct(pb,pc)var t3 = vectorProduct(pc,pa)return sameSign(t1,t2) &amp;&amp; sameSign(t2,t3)

 

function needDelay(elem,leftCorner,currMousePos){var offset = elem.offset()var topLeft = {

        x:offset.left,

        y:offset.top

    }var bottomLeft = {

        x:offset.left,

        y:offset.top + elem.height()

    }return isPointInTrangle(currMousePos,leftCorner,topLeft,bottomLeft)

}

로그인 후 복사

이걸 보면, Jingdong의 지연 메뉴 효과를 깨달았고 동시에 나도 당신을 좋아하고 여기에서 볼 수 있습니다.

저는 IT 업계에 입문하자마자 긍정적인 학습 태도를 유지하는 것이 필요하다고 느꼈습니다. 블로그를 통해 진행 상황을 기록했습니다.

궁금한 점이 있으시면 메시지를 남겨주시면 함께 논의하고 발전해 나갈 수 있습니다.

위 내용은 Js는 Jingdong의 지연 없는 메뉴 효과를 실현합니다(데모)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

뜨거운 기사 태그

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

사용자에게 드문 결함 발생: Samsung Watch 스마트워치에서 갑자기 흰색 화면 문제가 발생함 사용자에게 드문 결함 발생: Samsung Watch 스마트워치에서 갑자기 흰색 화면 문제가 발생함 Apr 03, 2024 am 08:13 AM

사용자에게 드문 결함 발생: Samsung Watch 스마트워치에서 갑자기 흰색 화면 문제가 발생함

징동닷컴(JD.com)은 '무료 방문 반품 및 교환' 화물 보험 서비스를 더욱 업그레이드해 8월 말까지 전면 출시될 예정이다. 징동닷컴(JD.com)은 '무료 방문 반품 및 교환' 화물 보험 서비스를 더욱 업그레이드해 8월 말까지 전면 출시될 예정이다. Aug 14, 2024 am 10:09 AM

징동닷컴(JD.com)은 '무료 방문 반품 및 교환' 화물 보험 서비스를 더욱 업그레이드해 8월 말까지 전면 출시될 예정이다.

Huawei 휴대폰에서 이중 WeChat 로그인을 구현하는 방법은 무엇입니까? Huawei 휴대폰에서 이중 WeChat 로그인을 구현하는 방법은 무엇입니까? Mar 24, 2024 am 11:27 AM

Huawei 휴대폰에서 이중 WeChat 로그인을 구현하는 방법은 무엇입니까?

Kyushu Fengshen Assassin 4S 라디에이터 리뷰 공냉식 'Assassin Master' 스타일 Kyushu Fengshen Assassin 4S 라디에이터 리뷰 공냉식 'Assassin Master' 스타일 Mar 28, 2024 am 11:11 AM

Kyushu Fengshen Assassin 4S 라디에이터 리뷰 공냉식 'Assassin Master' 스타일

봄의 절묘한 빛과 그림자 예술, Haqu H2는 비용 효율적인 선택입니다. 봄의 절묘한 빛과 그림자 예술, Haqu H2는 비용 효율적인 선택입니다. Apr 17, 2024 pm 05:07 PM

봄의 절묘한 빛과 그림자 예술, Haqu H2는 비용 효율적인 선택입니다.

Huawei 휴대폰에서 WeChat 복제 기능을 구현하는 방법 Huawei 휴대폰에서 WeChat 복제 기능을 구현하는 방법 Mar 24, 2024 pm 06:03 PM

Huawei 휴대폰에서 WeChat 복제 기능을 구현하는 방법

Huntkey MX750P 전체 모듈 전원 공급 장치 검토: 750W의 집중된 백금 강도 Huntkey MX750P 전체 모듈 전원 공급 장치 검토: 750W의 집중된 백금 강도 Mar 28, 2024 pm 03:20 PM

Huntkey MX750P 전체 모듈 전원 공급 장치 검토: 750W의 집중된 백금 강도

PHP 프로그래밍 가이드: 피보나치 수열을 구현하는 방법 PHP 프로그래밍 가이드: 피보나치 수열을 구현하는 방법 Mar 20, 2024 pm 04:54 PM

PHP 프로그래밍 가이드: 피보나치 수열을 구현하는 방법

See all articles