찾다
웹 프론트엔드JS 튜토리얼Js는 Jingdong의 지연 없는 메뉴 효과를 실현합니다(데모)
Js는 Jingdong의 지연 없는 메뉴 효과를 실현합니다(데모)Jun 26, 2017 pm 03:04 PM
javascript징둥성취하다지연효과메뉴

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

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

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

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

3.假如延迟解决移动问题 
  切换子菜单时候,用setTimeout设置延迟

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

4.解决延迟引入的新问题  
  跟踪鼠标的移动
  用鼠标当前位置,和鼠标上一次位置与子菜单上下边缘的三角形区域进行比较
  
  运用到向量
  二位向量叉乘公式
  用叉乘法判断点在三角形内</span>

最终效果:鼠标自然的移动和点击到子菜单
         切换时无延迟

아래 코드를 시작하세요:

Develop 기본 메뉴 구조

nbsp;html><meta><title>京东菜单无刷新</title><script></script><script></script><script></script><style>.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;}</style><div>
<ul>
<li>
<span>家用电器</span>    </li>
<li>
<span>手机 / 运营商 / 数码</span>    </li>
<li>
<span>电脑办公 / 办公</span>    </li>
<li>
<span>家居 / 家具 / 家装 / 厨具</span>    </li>
<li>
<span>男装 / 女装 / 童装 / 内衣 </span>    </li>
<li>
<span>美妆个护 / 宠物 </span>    </li>
<li>
<span>女鞋 / 箱包 / 钟表 / 珠宝 </span>    </li>
<li>
<span>男鞋 / 运动 / 户外</span>    </li>
<li>
<span>汽车 / 汽车用品  </span>    </li>
</ul>
<div>
<div><dl>
<dt><a>电视<i>&gt</i></a></dt>
<dd>
<a>曲面电视</a><a>超薄电视</a><a>HDR电视</a><a>DLED电视</a>
</dd>
<dt><a>空调<i>&gt</i></a></dt>
<dd>
<a>挂壁式空调</a><a>柜式空调</a><a>中央空调</a><a>以旧换新</a>
</dd>
<dt><a>洗衣机<i>&gt</i></a></dt>
<dd>
<a>滚筒式洗衣机</a><a>洗烘一体机</a><a>波轮洗衣机</a><a>迷你洗衣机</a>
</dd>
</dl></div>
<div><dl>
<dt><a>手机通讯<i>&gt</i></a></dt>
<dd>
<a>手机</a><a>对讲机</a><a>以旧换新</a><a>手机维修</a>
</dd>
<dt><a>运营商<i>&gt</i></a></dt>
<dd>
<a>合约机</a><a>选号机</a><a>固定电话</a><a>办宽带</a>
</dd>
<dt><a>手机配件<i>&gt</i></a></dt>
<dd>
<a>手机壳</a><a>贴膜</a><a>手机存储卡</a><a>数据线</a>
</dd>
</dl></div>
<div><dl>
<dt><a>电脑整机<i>&gt</i></a></dt>
<dd>
<a>笔记本</a><a>游戏本</a><a>平板电脑</a>
</dd>
<dt><a>电脑配件<i>&gt</i></a></dt>
<dd>
<a>显示器</a><a>CPU</a><a>主板</a>
</dd>
<dt><a>外设产品<i>&gt</i></a></dt>
<dd>
<a>鼠标</a><a>键盘</a><a>键盘套餐</a>
</dd>
</dl></div>
<div><dl>
<dt><a>厨具<i>&gt</i></a></dt>
<dd>
<a>烹饪锅具</a><a>刀剪配件</a><a>厨房配件</a><a>水具酒具</a>
</dd>
<dt><a>家纺<i>&gt</i></a></dt>
<dd>
<a>床品套件</a><a>被子</a><a>枕芯</a><a>蚊帐</a>
</dd>
<dt><a>生活日用<i>&gt</i></a></dt>
<dd>
<a>收纳用品</a><a>雨伞雨具</a><a>净化除味</a><a>浴室用品</a>
</dd>
</dl></div>
<div><dl>
<dt><a>女装<i>&gt</i></a></dt>
<dd>
<a>商城同款</a><a>当季热卖</a><a>2017新品</a><a>连衣裙</a>
</dd>
<dt><a>男装<i>&gt</i></a></dt>
<dd>
<a>商城同款</a><a>当季热卖</a><a>2017新品</a><a>牛仔裤</a>
</dd>
</dl></div>
<div><dl>
<dt><a>面部护肤<i>&gt</i></a></dt>
<dd>
<a>补水保湿</a><a>卸妆</a><a>洁面</a>
</dd>
</dl></div>
</div>
</div> <p style="text-align:justify;"><span style="font-family: 宋体"><span style="font-size: 16px; color: #ff0000"> 두 번째, 세 번째 문제를 해결하세요</span><br></span></p><div class="cnblogs_code"><pre class="brush:php;toolbar:false">$(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 > 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')
            }
        })
})

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

function sameSign(a,b){return (a ^ b) >= 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) && 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으로 문의하세요.
es6数组怎么去掉重复并且重新排序es6数组怎么去掉重复并且重新排序May 05, 2022 pm 07:08 PM

去掉重复并排序的方法:1、使用“Array.from(new Set(arr))”或者“[…new Set(arr)]”语句,去掉数组中的重复元素,返回去重后的新数组;2、利用sort()对去重数组进行排序,语法“去重数组.sort()”。

JavaScript的Symbol类型、隐藏属性及全局注册表详解JavaScript的Symbol类型、隐藏属性及全局注册表详解Jun 02, 2022 am 11:50 AM

本篇文章给大家带来了关于JavaScript的相关知识,其中主要介绍了关于Symbol类型、隐藏属性及全局注册表的相关问题,包括了Symbol类型的描述、Symbol不会隐式转字符串等问题,下面一起来看一下,希望对大家有帮助。

原来利用纯CSS也能实现文字轮播与图片轮播!原来利用纯CSS也能实现文字轮播与图片轮播!Jun 10, 2022 pm 01:00 PM

怎么制作文字轮播与图片轮播?大家第一想到的是不是利用js,其实利用纯CSS也能实现文字轮播与图片轮播,下面来看看实现方法,希望对大家有所帮助!

JavaScript对象的构造函数和new操作符(实例详解)JavaScript对象的构造函数和new操作符(实例详解)May 10, 2022 pm 06:16 PM

本篇文章给大家带来了关于JavaScript的相关知识,其中主要介绍了关于对象的构造函数和new操作符,构造函数是所有对象的成员方法中,最早被调用的那个,下面一起来看一下吧,希望对大家有帮助。

JavaScript面向对象详细解析之属性描述符JavaScript面向对象详细解析之属性描述符May 27, 2022 pm 05:29 PM

本篇文章给大家带来了关于JavaScript的相关知识,其中主要介绍了关于面向对象的相关问题,包括了属性描述符、数据描述符、存取描述符等等内容,下面一起来看一下,希望对大家有帮助。

javascript怎么移除元素点击事件javascript怎么移除元素点击事件Apr 11, 2022 pm 04:51 PM

方法:1、利用“点击元素对象.unbind("click");”方法,该方法可以移除被选元素的事件处理程序;2、利用“点击元素对象.off("click");”方法,该方法可以移除通过on()方法添加的事件处理程序。

foreach是es6里的吗foreach是es6里的吗May 05, 2022 pm 05:59 PM

foreach不是es6的方法。foreach是es3中一个遍历数组的方法,可以调用数组的每个元素,并将元素传给回调函数进行处理,语法“array.forEach(function(当前元素,索引,数组){...})”;该方法不处理空数组。

整理总结JavaScript常见的BOM操作整理总结JavaScript常见的BOM操作Jun 01, 2022 am 11:43 AM

本篇文章给大家带来了关于JavaScript的相关知识,其中主要介绍了关于BOM操作的相关问题,包括了window对象的常见事件、JavaScript执行机制等等相关内容,下面一起来看一下,希望对大家有帮助。

See all articles

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
3 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
3 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
3 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25 : Myrise에서 모든 것을 잠금 해제하는 방법
3 몇 주 전By尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

SublimeText3 영어 버전

SublimeText3 영어 버전

권장 사항: Win 버전, 코드 프롬프트 지원!

SublimeText3 중국어 버전

SublimeText3 중국어 버전

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

WebStorm Mac 버전

WebStorm Mac 버전

유용한 JavaScript 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

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

SublimeText3 Linux 새 버전

SublimeText3 Linux 새 버전

SublimeText3 Linux 최신 버전