찾다
웹 프론트엔드JS 튜토리얼자바스크립트로 직접 만든 플로팅 메뉴_자바스크립트 스킬

일부 바퀴를 선택적으로 재창조하는 것이 반드시 나쁜 것은 아닙니다. 아론 블로그에 플로팅 메뉴가 추가됐는데, 굉장히 고급스러워 보이네요. 이런 종류의 트릭을 본 것은 이번이 처음은 아니지만 직접 쓴 적은 없습니다. 오늘은 이 기능에 대해 선별적으로 글을 쓰겠습니다. 다음은 요구사항 문서의 분석 및 구현 프로세스라고도 볼 수 있는 이 휠의 개발 프로세스입니다.

데모 주소: http://sandbox.runjs.cn/show/to8wdmuy

소스코드 다운로드: https://github.com/bjtqti/floatmenu

첫 번째 단계는 DOM 노드 구조를 만드는 것입니다.

코드 복사 코드는 다음과 같습니다.





AppCarrier

머리>


~
                  

과거는 상처를 줄 수 있지만 과거로부터 도망칠 수도 있고 배울 수도 있습니다


                  

과거는 고통스럽지만, 그로부터 벗어나거나 성장할 수 있습니다


> >             ~ ~ `` >                

규칙은 깨져야 합니다.


                  

세월이 지나면 피부가 주름질 수 있지만 열정을 포기하면 영혼이 주름지게 됩니다.


& Lt; p & gt; 세월이 지나면 얼굴이 늙어질 뿐이고, 열정은 더 이상 마음을 시들게 하지 않습니다.
~ test2
~                                                                                 


>

매일 즐거운 시간을 보내세요.


> > & 중 & gt;
> & Lt; 언제든지 우연한 모험을 시작할 준비가 되어 있습니다.
                   

인생은 실망으로 가득 차 있습니다. 계속해서 나아가야 합니다.


& Lt; p & gt; 인생은 종종 만족스럽지 않습니다. 과거에 빠지지 말고 용감하게 앞으로 나아가십시오.
                                          

나는 자유로운 영혼입니다.


내 영혼은 자유롭고 속박되어서는 안 됩니다.


~ 일부 마음은 눈에 보이지 않는 것을 볼 때가 있습니다.
& Lt; P & gt; 눈으로 보지 않아도 마음으로 느끼실 수 있습니다 & lt;/p & gt;                        

단순한 것 또한 가장 특별한 것이며, 현명한 사람만이 그것을 볼 수 있습니다.


               

가장 평범한 일은 가장 특별한 일이기도 하며, 현명한 사람만이 이해할 수 있습니다.


~ > >테스트3
~ >              

how many xxxxxx


             

how many xxxxxx


             

how many xxxxxx


             

how many xxxxxx


             

how many xxxxxx


             

how many xxxxxx


             

how many xxxxxx


             

how many xxxxxx


             

how many xxxxxx


             

how many xxxxxx


             

how many xxxxxx


             

how many xxxxxx


             

how many xxxxxx


             

how many xxxxxx


             

how many xxxxxx


             

test4


             

how many xxxxxx


             

how many xxxxxx


             

how many xxxxxx


             

how many xxxxxx


             

how many xxxxxx


             

how many xxxxxx


             

how many xxxxxx


             

how many xxxxxx


             

how many xxxxxx


             

how many xxxxxx


             

how many xxxxxx


             

how many xxxxxx


             

how many xxxxxx


             

how many xxxxxx


             

how many xxxxxx


             

how many xxxxxx


   


본문>





두 번째 단계는 CSS 파일을 준비하는 것입니다.


코드 복사

코드는 다음과 같습니다. ul { 목록 스타일 유형: 없음; } {
텍스트 장식: 없음;
}
/*기사 콘텐츠 영역*/
#컨텐츠 {
너비:400px;
여백: 0 자동;
글꼴 크기: 2em;
}
/*일시 중단된 메뉴*/
.메뉴 {
위치: 고정;
상위:20%;
오른쪽: 0;
너비:200px;
테두리: 1px 단색 회색;
테두리 반경: 5px;
}
.menu 리 {
높이: 2em;
줄 높이: 2em;
}
.red {
색상: 빨간색;
}
.숨기기 {
디스플레이: 없음;
}
/*플로팅 메뉴 숨기기*/
.slideIn {
변환:translate3d(202px, 0, 0);
전환 기간: .5초;
}
/*플로팅 메뉴 표시*/
.slideOut {
변환: 번역3d(0, 0, 0);
전환 기간: .5초;
}
.정적 {
색상:#007aff;
텍스트 정렬: 가운데;
}
/*서스펜션 볼 표시*/
.toShow {
디스플레이: 블록;
          너비: 4.8em;
높이: 2em;
         줄 높이: 2em;
         테두리 반경: .5em;
테두리: 1px 단색 회색;
변환:translate3d(-5em, 0, 0);
전환 기간: 1초;
}



세 번째 단계는 js 코드 작성을 시작하는 것입니다.


코드 복사

코드는 다음과 같습니다.

(함수(문서){
//각 챕터의 링크 위치 수집
var 위치 = [],
​​​​ //메뉴 항목 수집
          링크 = doc.getElementsByTagName('a'),
//챕터 제목 수집
titles = doc.getElementsByTagName('h1'),
//일시 중단된 메뉴
           메뉴 = doc.getElementById('menubar'),
//현재 선택
           currentItem=null;
//빨간색 스타일 추가
var addClass = 함수(요소){
                  currentItem && currentItem.removeAttribute('class');
                element.setAttribute('class','red');
                  currentItem = 요소;
         },
// 웹페이지가 높게 표시됩니다:
         getScrollTop = 함수 (){
               Math.ceil(document.body.scrollTop) 1을 반환합니다.
},
//스크롤 위치 계산
StartScroll = 함수 (){
            var scrollTop = getScrollTop(),
                   len = titles.length,
                  i = 0;
//제1조
If(scrollTop>=0 && scrollTop                    addClass(links[0]);
                  반품;
            }
// 마지막 If(scrollTop>=pos[len-1]){
                    addClass(links[len-1]);
                  반품;
            }
// 중간 for(;i If(scrollTop > pos[i] && scrollTop                      addClass(links[i]);
휴식;
                }
            }
};
//색상을 변경하려면 목록의 링크를 클릭하세요
menu.onclick=function(e){
        var target = e.target || e.srcElement;
If(target.nodeName.toLowerCase() === 'a'){
//목록 항목 상태 표시
               addClass(대상);
              반품;
         }
If(target.nodeName.toLowerCase() === 'p'){
If(target.className == '정적'){
//메뉴 숨기기
This.className = '메뉴 슬라이드인';
                    setTimeout(function(){
                               target.className = 'static toShow';
Target.innerHTML = '디스플레이';
                   },1000);
                }else{
//메뉴 표시
                        target.className = 'static';
                       target.innerHTML = '숨기기';
This.className = '메뉴 슬라이드아웃';
            }
         }
}
//각 장의 초기 위치 계산
var ln = titles.length;
; while(--ln>-1){
​​​​ //titles[len].offsetParent.offsetTop = 0;
           pos.unshift(titles[ln].offsetTop);
}
시작스크롤();
//스크롤 듣기
​ window.onscroll = function(){
시작스크롤()
}
})(문서);

분석:

1. 지정된 섹션으로 자동 점프

이 단계는 태그의 앵커 기능을 사용하여 수행할 수 있습니다. HTML5는 향후 name 속성을 지원하지 않으므로(HTML5는 지원하지 않습니다. 앵커 이름을 지정하십시오.) ID를 사용하여 점프합니다.

2. 플로팅 메뉴의 항목이 왼쪽 콘텐츠에서 어느 장에 속하는지 확인합니다.

이 단계는 어렵습니다. 먼저 간단히 분석해 보겠습니다.

2.1 첫 번째 상황은 메뉴 항목을 수동으로 클릭하는 것입니다. 이것은 쉽습니다. 클릭한 요소를 식별하기만 하면 됩니다.

2.2 두 번째 경우에는 마우스 가운데 버튼을 스크롤하거나 스크롤 막대를 드래그합니다. 이때 왼쪽의 콘텐츠를 오른쪽의 메뉴 항목과 연결해야 합니다. 쉬운 것부터 시작해서 어려운 것부터 하나씩 물리쳐가며 단계적으로 구현하는 전략을 고려해 보세요.

2.2.1 먼저 제목 요소의 좌표 높이를 수집합니다. 이는 모든 h1 태그의 수직 높이입니다. 배열 1에 저장합니다.

2.2.2 메뉴 항목의 a 요소를 수집하여 배열 2에 저장합니다.

2.2.3 스크롤 이벤트를 듣고 현재 콘텐츠가 어떤 메뉴 항목에 속하는지 확인합니다.

한 걸음을 내딛을 때 원고지에 그림을 그리는 것을 추천합니다:

A1

******************
~ *
~                  ~ *
~                  *
~ *

스크롤할 때마다 현재 스크롤 거리가 어느 간격인지 확인합니다. 0~A1이면 1장, A1~A2는 2장 등입니다.

요소의 위치와 높이에 관해서는 단순히 element.offsetTop을 사용하여 가져옵니다. jquery를 사용하여 가져오는 경우에는 $('element').offset()이어야 합니다. 위로

마찬가지로 롤링바의 높이도 간단히 document.body.scrolltop을 사용하여 jquery로 바꾸면 $(window)여야 합니다.

그림의 기능은 추상적인 문제를 구체화하고 규칙을 생각하고 찾아내도록 돕는 것입니다. 어쩌면 '모델링'이라고 부르는 것이 좀 더 고귀할지도 모르겠습니다.

배열 1과 배열 2의 관계는 일대일 대응이어야 한다는 점을 강조해야 합니다. 예를 들어

에 해당합니다.

2.3 세 번째 경우는 페이지에 직접 진입했을 때의 메뉴 상태 표시입니다. 예를 들어 index.html#h3 등의 주소를 통해 진입하는 경우 메뉴의 h3이 강조 표시되어야 합니다.

3. 플로팅 메뉴 표시 및 숨기기 애니메이션을 구현합니다.

3.1 이 단계는 비교적 간단하므로 먼저 수행하는 것을 고려해 볼 수 있습니다. CSS3의 Tramsform 속성을 사용하면 간단하고 효율적입니다. 크로스 브라우저라면 호환성에 주의하세요.

변환에 주의하세요:translate3d(x-axis, y-axis, z-axis); 3D를 사용하면 하드웨어 가속을 사용하여 애니메이션 효과를 높일 수 있지만 전력 소비가 증가하므로 잘 활용하십시오! 첫 번째 매개변수는 왼쪽과 오른쪽 방향을 제어합니다. 양수이면 오른쪽으로 이동한다는 의미입니다. 사실 엄밀한 것은 아니지만, 기준점을 기준으로 판단해야 합니다. 예를 들어 요소가 정지해 있을 때 x 좌표는 0인데, x 값을 오른쪽으로 늘리고 왼쪽으로 줄입니다. , 0이 재설정됩니다.

분석이 끝나면 코드를 작성할 차례입니다. 이에 대해 할 말이 없습니다. 키보드 타이핑의 음악성을 즐겨보세요.

작성을 마친 후 미리보기를 하고 메뉴를 클릭한 후 지정된 장으로 이동하고 해당 항목을 클릭하면 빨간색으로 바뀌고 현재 페이지를 새로고침하면 종속성이 올바르게 표시됩니다. 스크롤 휠을 밀면 내용이 변경됨에 따라 메뉴 항목도 변경됩니다. 스크롤 막대를 끌면 마찬가지입니다. 마지막으로 클릭하면 메뉴가 표시되고 메뉴가 슬라이드됩니다. . 이것으로 플로팅 기능이 완료됩니다.

위 내용은 이 글의 전체 내용입니다. 모두 마음에 드셨으면 좋겠습니다.

성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 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()方法添加的事件处理程序。

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

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

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

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

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를 무료로 생성하십시오.

뜨거운 도구

ZendStudio 13.5.1 맥

ZendStudio 13.5.1 맥

강력한 PHP 통합 개발 환경

안전한 시험 브라우저

안전한 시험 브라우저

안전한 시험 브라우저는 온라인 시험을 안전하게 치르기 위한 보안 브라우저 환경입니다. 이 소프트웨어는 모든 컴퓨터를 안전한 워크스테이션으로 바꿔줍니다. 이는 모든 유틸리티에 대한 액세스를 제어하고 학생들이 승인되지 않은 리소스를 사용하는 것을 방지합니다.

DVWA

DVWA

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

SublimeText3 영어 버전

SublimeText3 영어 버전

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

VSCode Windows 64비트 다운로드

VSCode Windows 64비트 다운로드

Microsoft에서 출시한 강력한 무료 IDE 편집기