용선축제인데 밖에 사람도 많고 너무 더워서 집에 있으면서 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>></i></a></dt> <dd> <a>曲面电视</a><a>超薄电视</a><a>HDR电视</a><a>DLED电视</a> </dd> <dt><a>空调<i>></i></a></dt> <dd> <a>挂壁式空调</a><a>柜式空调</a><a>中央空调</a><a>以旧换新</a> </dd> <dt><a>洗衣机<i>></i></a></dt> <dd> <a>滚筒式洗衣机</a><a>洗烘一体机</a><a>波轮洗衣机</a><a>迷你洗衣机</a> </dd> </dl></div> <div><dl> <dt><a>手机通讯<i>></i></a></dt> <dd> <a>手机</a><a>对讲机</a><a>以旧换新</a><a>手机维修</a> </dd> <dt><a>运营商<i>></i></a></dt> <dd> <a>合约机</a><a>选号机</a><a>固定电话</a><a>办宽带</a> </dd> <dt><a>手机配件<i>></i></a></dt> <dd> <a>手机壳</a><a>贴膜</a><a>手机存储卡</a><a>数据线</a> </dd> </dl></div> <div><dl> <dt><a>电脑整机<i>></i></a></dt> <dd> <a>笔记本</a><a>游戏本</a><a>平板电脑</a> </dd> <dt><a>电脑配件<i>></i></a></dt> <dd> <a>显示器</a><a>CPU</a><a>主板</a> </dd> <dt><a>外设产品<i>></i></a></dt> <dd> <a>鼠标</a><a>键盘</a><a>键盘套餐</a> </dd> </dl></div> <div><dl> <dt><a>厨具<i>></i></a></dt> <dd> <a>烹饪锅具</a><a>刀剪配件</a><a>厨房配件</a><a>水具酒具</a> </dd> <dt><a>家纺<i>></i></a></dt> <dd> <a>床品套件</a><a>被子</a><a>枕芯</a><a>蚊帐</a> </dd> <dt><a>生活日用<i>></i></a></dt> <dd> <a>收纳用品</a><a>雨伞雨具</a><a>净化除味</a><a>浴室用品</a> </dd> </dl></div> <div><dl> <dt><a>女装<i>></i></a></dt> <dd> <a>商城同款</a><a>当季热卖</a><a>2017新品</a><a>连衣裙</a> </dd> <dt><a>男装<i>></i></a></dt> <dd> <a>商城同款</a><a>当季热卖</a><a>2017新品</a><a>牛仔裤</a> </dd> </dl></div> <div><dl> <dt><a>面部护肤<i>></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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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

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

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

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

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

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

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

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


핫 AI 도구

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

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

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

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

인기 기사

뜨거운 도구

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

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

WebStorm Mac 버전
유용한 JavaScript 개발 도구

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

SublimeText3 Linux 새 버전
SublimeText3 Linux 최신 버전

뜨거운 주제



