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

자바스크립트로 직접 만든 플로팅 메뉴_자바스크립트 스킬

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB원래의
2016-05-16 16:14:301774검색

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

데모 주소: 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으로 문의하세요.