Vue 개발 흡 정 효과 구현 예시 코드

6255 단어 Vue흡 정
프로젝트 수요 로 인해 최근 에 위 챗 공식 번호 개발 로 전환 하여 Vue 프레임 워 크 를 접 하 게 되 었 습 니 다.이 효과 의 실현 은 Vue 프레임 워 크 를 바탕 으로 이 루어 진 것 이 라 고 하지만 다른 곳 도 참고 할 수 있 고 원 리 는 똑 같 습 니 다.
본론 으로 들 어가 면 먼저 효과 도 를 봅 니 다.
 
사실 js 가 이 효 과 를 하 는 것 은 매우 간단 하 다.왜냐하면 css 에서 우 리 는 하나의 요 소 를 설정 할 수 있 기 때문이다position: fixed;이렇게 하면 그곳 에 고정 할 수 있다.이렇게 하면 페이지 가 아무리 굴 러 도 그 위치 가 영향 을 받 지 않 기 때문에 우리 의 사고방식 은 적당 한 시기 에 머리 요 소 를 흡수 할 position 속성 을 fixed 로 설정 하면 된다.그러나 이 적당 한 시기 가 언제 일 까요?이것 은 우리 가 계산 해 야 합 니 다.우 리 는 페이지 의 스크롤 상 태 를 감청 해 야 합 니 다.페이지 가 꼭대기 요 소 를 흡수 할 위치 로 굴 러 갈 때 바로 우리 가 고정 시 킬 때 입 니 다.그래서 우리 가 필요 합 니 다.
1.감청 페이지 의 스크롤 상태:
mounted 리 셋 에 다음 코드 를 추가 합 니 다:

mounted() {
 // handleScroll          
 window.addEventListener('scroll', this.handleScroll);
 },
동시에 destroyed 리 셋 에서 감청 제거:

destroyed(){
 window.removeEventListener('scroll', this.handleScroll);
},
2.흡수 요소 가 페이지 상단 까지 의 거 리 를 계산 합 니 다.
이 거 리 를 계산 한 후에 고정 적 인 흡 정 요소 의 시 기 를 확정 할 수 있 습 니 다.만약 에 당신 의 흡 정 요소 위의 요소 의 높이 가 고정 이 라면 간단 합 니 다.handle Scroll 방법 에서 직접 판단 하면 됩 니 다.세 번 째 단계 로 바로 넘 어 갈 수 있 습 니 다.만약 에 동태 적 인 것 이 라면 우리 가 인터페이스 에서 데 이 터 를 요청 해 야 합 니 다.dom 요 소 를 렌 더 링 한 후에 동적 계산 을 했 습 니 다.Vue 에서 사용 하기 좋 은 방법 이 있 습 니 다.dom 렌 더 링 을 편리 하 게 감청 할 수 있 습 니 다.

//   dom    
this.$nextTick(function(){
 //   fixedHeaderRoot      ID
 let header = document.getElementById("fixedHeaderRoot");
 //      top           
 this.offsetTop = header.offsetTop;
 this.offsetHeight = header.offsetHeight;
 console.log("offsetTop:" + this.offsetTop + "," + this.offsetHeight);
});
3.페이지 스크롤 거리 판단:

handleScroll(){
 //          
 let scrollTop = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop;
 //                     
 this.headerFixed = scrollTop > (this.offsetTop - this.offsetHeight * 2);
},
ps:여 기 는 이론 적 으로 스크롤 탑>(this.of set 탑-this.of set Height)이 어야 합 니 다.그런데 왜 제 가 여기 서 만들어 서 흡수 요소 위치 로 굴 렀 을 때 스크롤 탑 은 this.of set 탑-this.of set Height 보다 작 기 때문에 여기*2,이렇게 얻 은 값 이 딱 좋 습 니 다.아 는 친구 가 있 으 면 궁금 증 을 풀 어 주세요.
위 에서 우 리 는 header Fixed 의 boolean 속성 값 을 얻 었 습 니 다.그 다음 에 우 리 는 그 값 에 따라 흡수 요소 의position: fixed;속성 을 설정 하면 됩 니 다.css 스타일 을 쓸 수 있 습 니 다:

.isFixed{
 position: fixed;
 top: px2rem(110);
 left: px2rem(20);
 right: px2rem(20);
}
그리고 Vue 는 dom 요소 에서 클 라 스 를 이렇게 동적 으로 설정 할 수 있어 서 매우 편리 합 니 다.

<div id="fixedHeaderRoot">
 <div id="knowPointHeader" class="knowPointHeader" :class="headerFixed?'isFixed':''">
 <div><span>    </span></div>
 <div><span>   </span></div>
 <div><span>    </span></div>
 </div>
</div>
사실 여기 서 이 효 과 는 이미 완성 되 었 습 니 다.그러나 저 는 테스트 과정 에서 ios 핸드폰 페이지 가 끝까지 굴 러 갈 때 위로 당 길 수 있 고 고무줄 효과 가 있 기 때문에 이 효 과 는 우리 페이지 의 Bug 를 초래 할 수 있 습 니 다.이런 고무줄 효과 도 페이지 가 굴 러 가 는 감청 을 촉발 할 수 있 기 때문에 데이터 가 많 을 때 알 아 볼 수 없습니다.데이터 가 화면 을 가득 채 울 때 만 이 럴 때 화면 을 계속 위로 미 끄 러 뜨리 면 페이지 의 스크롤 감청 이 실 행 됩 니 다.이때 handle Scroll 방법 에서 계 산 된 값 scrollTop 은 흡수 요소 top 의 거리 보다 크기 때문에 흡수 요 소 는 고정 속성 으로 설 정 됩 니 다.한 요소 가 설정 되면position: fixed;.그러면 브 라 우 저 창 에 비해 포 지 셔 닝 을 합 니 다.그러면 우리 아래 의 내용 이 위로 올 라 갑 니 다.그러면 scrollTop 의 값 은 흡수 요소 top 의 거리 보다 작 습 니 다.그러면 header Fixed 속성 은 false 이 고position: fixed;속성 도 없습니다.그러면 원래 의 부모 요소 와 포 지 셔 닝 을 하면 순환 이 됩 니 다.너 는 페이지 가 위아래 로 뛰 어 내 리 는 것 을 발견 할 것 이다.그러면 안 될 것 이다.그래서 나 는 다음 에 이 문 제 를 최적화 시 켰 다.물론 이 방안 은 특별히 완벽 하지 않 지만 이 문 제 를 해결 할 수 있다.
위의 분석 을 통 해 우 리 는 이 문 제 를 일 으 킨 원인 은 우리 가 요소 의position: fixed;속성 을 설정 하여 아래 의 내용 을 위로 올 려 놓 았 기 때 문 이라는 것 을 알 수 있다.그래서 이 문 제 를 해결 하려 면 우 리 는 이 요 소 를 고정 시 키 지 않 는 다.그러나 이렇게 하면 흡수 효과 에 이 르 지 못 하기 때문에 우 리 는 흡수 요소 와 똑 같은 요 소 를 추가 해 야 한다.그것 은 항상 고정 상태 이다.

<div id="fixedHeaderRootReal">
 <div class="knowPointHeader isFixed" v-show="headerFixed">
 <div><span>    </span></div>
 <div><span>   </span></div>
 <div><span>    </span></div>
 </div>
</div>
이 요 소 는 기본적으로 숨겨 져 있 습 니 다.페이지 가 굴 러 가 는 거리 가 그 위치 에 이 르 렀 을 때 만 표시 할 수 있 습 니 다.고정된 상태 이기 때문에 숨겨 진 디 스 플레이 는 페이지 에 영향 을 주지 않 습 니 다.그러면 아래 의 내용 이 위로 올 라 가지 않 고 ios 핸드폰 에서 페이지 고무줄 효 과 를 끄 는 Bug 를 해결 할 수 있 습 니 다.물론 이런 방식 은 약간 교묘 합 니 다.하지만 당분간 더 좋 은 해결 방안 이 없습니다.더 좋 은 해결 방안 이 있다 면 아래 에 댓 글 을 달 아 주세요.마지막 으로 제 페이지 레이아웃 을 보 여 드 리 겠 습 니 다.

<div v-show="kpointListShow" class="knowPointList">
  <div id="fixedHeaderRoot">
  <div id="knowPointHeader" class="knowPointHeader">
   <div><span>    </span></div>
   <div><span>   </span></div>
   <div><span>    </span></div>
  </div>
  </div>
  <div id="fixedHeaderRootReal">
  <div class="knowPointHeader isFixed" v-show="headerFixed">
   <div><span>    </span></div>
   <div><span>   </span></div>
   <div><span>    </span></div>
  </div>
  </div>
  <div class="knowPointItem" v-for="(kpointItem,index) in rows.kpointList" :key="index">
  <div><span>{{kpointItem.knowModule}}</span></div>
  <div><span>{{kpointItem.knowPoint}}</span></div>
  <div><span>{{kpointItem.abilityRequire}}</span></div>
  </div>
</div>
레 퍼 런 스
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기