이 글의 예시는 참고용으로 Baidu 뉴스 탐색 메뉴 슬라이딩 애니메이션을 구현하기 위해 jquery를 공유하는 것입니다.
아이디어와 단계
1. UL을 사용하여 간단한 수평 탐색을 만듭니다.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>仿百度新闻菜单滑动动画</title> <style type="text/css"> body, div, ul, li, a { margin: 0px; padding: 0px; font-size: 20px; color: #FFF; border: 0; } .div-nav-container { margin-top: 50px; width: 100%; background-color: #01204F; } .div-nav { width: 870px; margin: 0px auto; } ul { list-style: outside none none; width: 100%; height: 50px; } ul li { float: left; } ul li a { line-height: 50px; display: block; padding: 0px 15px; text-align: center; text-decoration: none; } </style> </head> <body> <div class="div-nav-container"> <div class="div-nav"> <ul> <li><a href="javascript:void(0)">网站首页</a></li> <li><a href="javascript:void(0)">热点</a> </li> <li><a href="javascript:void(0)">国际新闻</a> </li> <li><a href="javascript:void(0)">国内新闻</a> </li> <li><a href="javascript:void(0)">国家政策</a> </li> <li><a href="javascript:void(0)">体育新闻</a> </li> <li><a href="javascript:void(0)">娱乐新闻</a> </li> <li><a href="javascript:void(0)">名人</a> </li> <li><a href="javascript:void(0)">古迹</a> </li> </ul> </div> </div> </body> </html>
2. 메뉴 슬라이딩 애니메이션을 위해 div-hover라는 이름의 div를 추가하고 CSS 스타일을 설정합니다.
<style type="text/css"> .div-hover { background-color: Red;height: 50px; left: 0px; top: 0px; width: 0px; } </style> <div class="div-nav"> <!--添加滑动背景--> <div class="div-hover"> </div> <ul> ... </ul> </div>
<script type="text/javascript"> var divHoverLeft = 0; var aWidth = 0; $(document).ready(function () { $("a").on({ 'mouseover': function () { SetDivHoverWidthAndLeft(this); //设置滑动动画 $(".div-hover").stop().animate({ width: aWidth, left: divHoverLeft }, 150); } }); }); function SetDivHoverWidthAndLeft(element) { divHoverLeft = GetLeft(element); aWidth = GetWidth(element); } //获得Li宽度 function GetWidth(ele) { return $(ele).parent().width(); } //获得div-hover左边距 function GetLeft(element) { //获得li之前的同级li元素 var menuList = $(element).parent().prevAll(); var left = 0; //计算背景遮罩左边距 $.each(menuList, function (index, ele) { left += $(ele).width(); }); return left; } </script>효과 미리보기
미리보기 효과에서 알 수 있듯이 div-hover 위치에 문제가 있습니다. div-hover는 상위 요소와 절대 위치해야 하므로 수정된 코드(주석 부분이 수정 지점입니다) 다음과 같습니다:
<style type="text/css"> .div-nav { width: 870px; margin: 0px auto; /*作为div-hover的父元素定位参照*/ position: relative; } .div-hover { background-color: Red; height: 50px; left: 0px; top: 0px; width: 0px; /*以父元素绝对定位*/ position: absolute; } </style>
위치 문제가 해결되었음에도 불구하고 배경 이미지는 여전히 텍스트 위에 떠 있으므로 빨간색 div 위에 텍스트가 뜨도록 코드가 조정됩니다.
<style type="text/css"> ul li { float: left; /*****Start(作用:导航文字浮于div-hover红色之上)*******/ position: relative; z-index: 4; /*********************End*************************/ } </style>효과 미리보기
4. 로딩 페이지에 메뉴 클릭 및 기본 메뉴 선택 추가
<style type="text/css"> /**设置菜单激活***/ .active { background-color: Red; } </style> <script type="text/javascript"> var divHoverLeft = 0; var aWidth = 0; $(document).ready(function () { $("a").on({ 'mouseover': function () { SetDivHoverWidthAndLeft(this); //设置滑动动画 $(".div-hover").stop().animate({ width: aWidth, left: divHoverLeft }, 150); }, /*添加点击事件*/ 'click': function () { SetDivHoverWidthAndLeft(this); //清除所有a标签class $('a').removeClass(); //设置当前点击菜单为激活状态 $(this).addClass('active'); } }); }); </script> </head> <body> <div class="div-nav-container"> <div class="div-nav"> <!--添加滑动背景--> <div class="div-hover"> </div> <ul> <--默认菜单激活--> <li><a class="active" href="javascript:void(0)">网站首页</a></li> ………… </ul> </div> </div> </body> </html>효과 미리보기
5. 마우스를 범위 밖으로 이동하여 현재 활성화된 요소를 자동으로 찾는 기능을 추가합니다.
①이 조건을 충족하려면 이곳에서 어떤 이벤트를 선택해야 합니까?
②선택한 이벤트는 어떤 요소에 위치하나요?
③마우스를 밖으로 옮긴 후 현재 어떤 요소가 활성화되어 있는지 어떻게 알 수 있나요?
④div-hover의 왼쪽 여백과 너비에 해당하는 값을 어떻게 알 수 있나요?
연습을 통해 진정한 지식을 얻고, 연습해 보세요.
우선 마우스아웃을 예로 들면, 첫 번째 문제는 자연스럽게 해결됩니다.
둘째, 이벤트가 위치한 요소는 무엇입니까? 위의 GIF 다이어그램 분석을 통해 위치 지정이 A 태그 또는 Li 태그에 있는 경우 A 태그 또는 Li 태그 사이를 전환하는 마우스 이동 작업도 활성 요소에 대한 자동 위치 지정을 트리거합니다(자동이라고 가정). 위치 지정이 완료됨) 다음 그림이 표시됩니다.
따라서 A나 Li 태그에 위치할 수 없습니다. 다시 생각해 보면 마우스를 전체 탐색 범위 밖으로 이동해야 합니다. 그러면 어떤 요소를 위치시켜야 하는지 쉽게 알 수 있습니다. UL 또는 UL의 상위 요소의 크기 범위는 동일하므로 두 요소 모두 괜찮습니다. 두 요소의 크기가 일치하지 않으면 UL에 배치해야 합니다. 그래서 다음과 비슷한 코드가 있습니다.
그러면 현재 활성화된 요소를 어떻게 알 수 있나요? 숨겨진 필드나 다른 표시 방법을 사용하여 이벤트를 클릭했을 때 현재 클릭한 요소의 너비와 왼쪽 여백을 저장할 수 있습니다. 데이터를 다시 읽은 후 애니메이션 위치 지정을 진행하면 위의 ③ ④ 코드 부분이 해결됩니다.
$("ul").on({ 'mouseout': function (event) { /*动画定位div-hover位置到激活元素*/ } });(물론 메뉴 활성화 요소를 알고 싶다면 클래스가 active인 메소드를 이용해서 찾을 수도 있습니다. 하지만 이 방법이 상대적으로 더 번거롭습니다. 먼저 활성화 요소를 가져온 후 너비를 다시 계산하세요. li을 탐색하여 합산합니다. 마지막으로 값을 할당하고 슬라이딩 위치를 추가합니다. 여기서는 편리하고 간단하기 때문에 임시로 숨겨진 필드 방법을 사용하여 실험할 수 있습니다.
效果展示:
看图发现依旧出现之前类似定位在A或Li的问题,出现这种情况的原因:
jquery中mouseout如果定位在一个元素上,例如div,那么此div之下的元素都会具有mouseout事件,也就是常说的,事件冒泡机制;与此类似的事件如mousedown,mouseover等,那么是不是阻止事件冒泡就行了呢? 理论上是这样的。通常阻止冒泡有两种方式: event.stopPropagation();和return false;当然他们之间也是有区别的。
相关代码修改如下:
<script type="text/javascript"> .......... $(document).ready(function () { /*鼠标滑出UL或者div-nav背景div-hover自动定位到激活菜单处*/ $("ul").on({ 'mouseout': function (event) { $(".div-hover").stop().animate({ width: $(".h-width").val(), left: $(".h-left").val() }, 150); /**阻止冒泡**/ event.stopPropagation(); //return false; } }); }); ....... </script>
无论何种阻止方式,都没有卵用,依旧阻止不了冒泡,效果可想而知,与上面Gif图所示无异;
由此证明,mouseover在实现此功能方面是有问题的;
那换mouseleave呢,除了将mouseover修改为mouseleave和去除冒泡代码外,其他代码不做改动,实验效果如下:
从上图可以看出,效果与百度新闻导航滑动基本无异,至此大功告成;
完整代码
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>仿百度新闻菜单滑动动画</title> <style type="text/css"> body, div, ul, li, a { margin: 0px; padding: 0px; font-size: 20px; color: #FFF; border: 0; } .div-nav-container { margin-top: 50px; width: 100%; background-color: #01204F; } .div-nav { /*作为div-hover的父元素定位参照*/ position: relative; width: 870px; margin: 0px auto; } .div-hover { background-color: Red; /*以父元素绝对定位*/ position: absolute; height: 50px; left: 0px; top: 0px; width: 0px; } ul { list-style: outside none none; width: 100%; height: 50px; } ul li { float: left; /*****Start(作用:导航文字浮于div-hover红色之上)*******/ position: relative; z-index: 4; /*********************End*************************/ } ul li a { line-height: 50px; display: block; padding: 0px 15px; text-align: center; text-decoration: none; } /**设置菜单激活***/ .active { background-color: Red; } </style> <script src="../js/jquery-1.11.3.min.js" type="text/javascript"></script> <script type="text/javascript"> var divHoverLeft = 0; var aWidth = 0; $(document).ready(function () { //菜单滑动动画 $("a").on({ /*此处用mouseover或者mouseenter均可,如果以后要为X标签同时添加悬停和移出事件,建议用enter和leave也就是传说中的hover事件,因为里面事件冒泡已经处理过,就不会出现类似over和out之类的情况了*/ 'mouseenter': function () { SetDivHoverWidthAndLeft(this); //设置滑动动画 $(".div-hover").stop().animate({ width: aWidth, left: divHoverLeft }, 150); }, 'click': function () { SetDivHoverWidthAndLeft(this); //清除所有a标签class $('a').removeClass(); //设置当前点击菜单为激活状态 $(this).addClass('active'); $(".h-width").val(aWidth); $(".h-left").val(divHoverLeft); } }); /*鼠标滑出UL或者div-nav背景div-hover自动定位到激活菜单处*/ //mouseleave事件定位到ul或者div-nav均可 $("ul").on({ 'mouseleave': function (event) { $(".div-hover").stop().animate({ width: $(".h-width").val(), left: $(".h-left").val() }, 150); } }); }); function SetDivHoverWidthAndLeft(element) { divHoverLeft = GetLeft(element); aWidth = GetWidth(element); } //获得Li宽度 function GetWidth(ele) { return $(ele).parent().width(); } //获得div-hover左边距 function GetLeft(element) { //获得li之前的同级li元素 var menuList = $(element).parent().prevAll(); var left = 0; //计算背景遮罩左边距 $.each(menuList, function (index, ele) { left += $(ele).width(); }); return left; } </script> </head> <body> <div class="div-nav-container"> <div class="div-nav"> <!--添加滑动背景--> <div class="div-hover"> </div> <ul> <li><a class="active" href="javascript:void(0)">网站首页</a></li> <li><a href="javascript:void(0)">热点</a> </li> <li><a href="javascript:void(0)">国际新闻</a> </li> <li><a href="javascript:void(0)">国内新闻</a> </li> <li><a href="javascript:void(0)">国家政策</a> </li> <li><a href="javascript:void(0)">体育新闻</a> </li> <li><a href="javascript:void(0)">娱乐新闻</a> </li> <li><a href="javascript:void(0)">名人</a> </li> <li><a href="javascript:void(0)">古迹</a> </li> </ul> </div> </div> <input type="hidden" class="h-width" value="110" /> <input type="hidden" class="h-left" value="0" /> </body> </html>
总结和关键点
1.背景滑动由某个块状元素(此处用的div)来实现,而非本元素的hover改变背景颜色;
2.注意元素定位(滑动块状元素以谁来绝对定位或者相对定位,左边距的计算和自身宽度的计算;滑动块状元素div-hover和li之间的相对定位,以及层级大小);
3.滑动动画事件animate和记录激活菜单,鼠标移出区域自定定位到激活菜单;
4.jquery中mouseover,mouseout以及mouseenter,mouseleave关于冒泡机制的区别;(前两个未做冒泡机制的限制,后两个冒泡已经经过处理,事件只针对注册元素本身,而不会对子元素起作用,mouseenter和mouseleave用在一个元素标签上可以用hover事件代替,本身hover就是这两者的封装,如果事件在不同元素标签上,最好分开调用mouseenter和mouseleave事件)
5.所有关键点以及作用都已经在代码各处加上注释,各位可以看看。
希望本文对大家学习jquery程序设计有所帮助。

보다 효율적인 코드를 작성하고 성능 병목 현상 및 최적화 전략을 이해하는 데 도움이되기 때문에 JavaScript 엔진이 내부적으로 작동하는 방식을 이해하는 것은 개발자에게 중요합니다. 1) 엔진의 워크 플로에는 구문 분석, 컴파일 및 실행; 2) 실행 프로세스 중에 엔진은 인라인 캐시 및 숨겨진 클래스와 같은 동적 최적화를 수행합니다. 3) 모범 사례에는 글로벌 변수를 피하고 루프 최적화, Const 및 Lets 사용 및 과도한 폐쇄 사용을 피하는 것이 포함됩니다.

Python은 부드러운 학습 곡선과 간결한 구문으로 초보자에게 더 적합합니다. JavaScript는 가파른 학습 곡선과 유연한 구문으로 프론트 엔드 개발에 적합합니다. 1. Python Syntax는 직관적이며 데이터 과학 및 백엔드 개발에 적합합니다. 2. JavaScript는 유연하며 프론트 엔드 및 서버 측 프로그래밍에서 널리 사용됩니다.

Python과 JavaScript는 커뮤니티, 라이브러리 및 리소스 측면에서 고유 한 장점과 단점이 있습니다. 1) Python 커뮤니티는 친절하고 초보자에게 적합하지만 프론트 엔드 개발 리소스는 JavaScript만큼 풍부하지 않습니다. 2) Python은 데이터 과학 및 기계 학습 라이브러리에서 강력하며 JavaScript는 프론트 엔드 개발 라이브러리 및 프레임 워크에서 더 좋습니다. 3) 둘 다 풍부한 학습 리소스를 가지고 있지만 Python은 공식 문서로 시작하는 데 적합하지만 JavaScript는 MDNWebDocs에서 더 좋습니다. 선택은 프로젝트 요구와 개인적인 이익을 기반으로해야합니다.

C/C에서 JavaScript로 전환하려면 동적 타이핑, 쓰레기 수집 및 비동기 프로그래밍으로 적응해야합니다. 1) C/C는 수동 메모리 관리가 필요한 정적으로 입력 한 언어이며 JavaScript는 동적으로 입력하고 쓰레기 수집이 자동으로 처리됩니다. 2) C/C를 기계 코드로 컴파일 해야하는 반면 JavaScript는 해석 된 언어입니다. 3) JavaScript는 폐쇄, 프로토 타입 체인 및 약속과 같은 개념을 소개하여 유연성과 비동기 프로그래밍 기능을 향상시킵니다.

각각의 엔진의 구현 원리 및 최적화 전략이 다르기 때문에 JavaScript 엔진은 JavaScript 코드를 구문 분석하고 실행할 때 다른 영향을 미칩니다. 1. 어휘 분석 : 소스 코드를 어휘 단위로 변환합니다. 2. 문법 분석 : 추상 구문 트리를 생성합니다. 3. 최적화 및 컴파일 : JIT 컴파일러를 통해 기계 코드를 생성합니다. 4. 실행 : 기계 코드를 실행하십시오. V8 엔진은 즉각적인 컴파일 및 숨겨진 클래스를 통해 최적화하여 Spidermonkey는 유형 추론 시스템을 사용하여 동일한 코드에서 성능이 다른 성능을 제공합니다.

실제 세계에서 JavaScript의 응용 프로그램에는 서버 측 프로그래밍, 모바일 애플리케이션 개발 및 사물 인터넷 제어가 포함됩니다. 1. 서버 측 프로그래밍은 Node.js를 통해 실현되며 동시 요청 처리에 적합합니다. 2. 모바일 애플리케이션 개발은 재교육을 통해 수행되며 크로스 플랫폼 배포를 지원합니다. 3. Johnny-Five 라이브러리를 통한 IoT 장치 제어에 사용되며 하드웨어 상호 작용에 적합합니다.

일상적인 기술 도구를 사용하여 기능적 다중 테넌트 SaaS 응용 프로그램 (Edtech 앱)을 구축했으며 동일한 작업을 수행 할 수 있습니다. 먼저, 다중 테넌트 SaaS 응용 프로그램은 무엇입니까? 멀티 테넌트 SAAS 응용 프로그램은 노래에서 여러 고객에게 서비스를 제공 할 수 있습니다.

이 기사에서는 Contrim에 의해 확보 된 백엔드와의 프론트 엔드 통합을 보여 주며 Next.js를 사용하여 기능적인 Edtech SaaS 응용 프로그램을 구축합니다. Frontend는 UI 가시성을 제어하기 위해 사용자 권한을 가져오고 API가 역할 기반을 준수하도록합니다.


핫 AI 도구

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

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

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

Clothoff.io
AI 옷 제거제

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

인기 기사

뜨거운 도구

SecList
SecLists는 최고의 보안 테스터의 동반자입니다. 보안 평가 시 자주 사용되는 다양한 유형의 목록을 한 곳에 모아 놓은 것입니다. SecLists는 보안 테스터에게 필요할 수 있는 모든 목록을 편리하게 제공하여 보안 테스트를 더욱 효율적이고 생산적으로 만드는 데 도움이 됩니다. 목록 유형에는 사용자 이름, 비밀번호, URL, 퍼징 페이로드, 민감한 데이터 패턴, 웹 셸 등이 포함됩니다. 테스터는 이 저장소를 새로운 테스트 시스템으로 간단히 가져올 수 있으며 필요한 모든 유형의 목록에 액세스할 수 있습니다.

PhpStorm 맥 버전
최신(2018.2.1) 전문 PHP 통합 개발 도구

DVWA
DVWA(Damn Vulnerable Web App)는 매우 취약한 PHP/MySQL 웹 애플리케이션입니다. 주요 목표는 보안 전문가가 법적 환경에서 자신의 기술과 도구를 테스트하고, 웹 개발자가 웹 응용 프로그램 보안 프로세스를 더 잘 이해할 수 있도록 돕고, 교사/학생이 교실 환경 웹 응용 프로그램에서 가르치고 배울 수 있도록 돕는 것입니다. 보안. DVWA의 목표는 다양한 난이도의 간단하고 간단한 인터페이스를 통해 가장 일반적인 웹 취약점 중 일부를 연습하는 것입니다. 이 소프트웨어는

Dreamweaver Mac版
시각적 웹 개발 도구

드림위버 CS6
시각적 웹 개발 도구
