네 이 티 브 JS 투명 도 를 바 꾸 어 윤 방 효 과 를 실현 하 다.

12642 단어 JS윤파
내 가 보기에 윤 방 을 실현 하려 면 현재 있 는 페이지 와 곧 있 을 페이지 를 알 아야 한다.이 사례 는 그림 의 투명 도 를 바 꾸 어 윤 방 의 효 과 를 실현 하 는 것 이다.
나 는 HTML+css 와 JS 로 관련 된 지식 포 인 트 를 두 가지 로 나 누 었 다.
첫 번 째 부분(html+css)
포 함 된 지식 은 positon 포 지 셔 닝 입 니 다.
가장 바깥쪽 은 div 입 니 다.모든 요 소 를 포함 하고 있 습 니 다.이 라운드 방송 은 모두 세 장의 그림 이 있 는데,이 세 장의 그림 은 무질서 한 목록 에 포함 되 어 있다.가장 바깥쪽 div 에는 이전 그림 과 다음 그림 을 전환 하 는 하위 요소 가 두 개 있 습 니 다.이 두 키 요소 도 div 입 니 다.이전 그림 의 div 속성 을 pre 로 전환 하고 다음 그림 의 div 속성 을 next 로 전환 합 니 다.가장 바깥쪽 div 의 position 값 은 relative 입 니 다.그림 을 포함 하 는 무질서 목록 의 position 는 relative 입 니 다.무질서 목록 에 있 는 li 요소 의 positon 속성 값 은 absolute 입 니 다.이것 은 li 요 소 를 문서 흐름 밖 에 두 기 때문에 표시 되 지 않 는 설정 l 의 높이,ul 높이 는 0 입 니 다.그러나 우 리 는 css 로 ul 의 높이 를 표시 할 수 없습니다.이 라운드 방송의 높이 가 그림 의 높이 와 같 고 해상도 가 다른 컴퓨터 에서 그림 의 높이 와 너비 가 변 하지 않도록 해 야 하기 때문이다.해상도 가 다른 컴퓨터 에서 그림 이 보 여 주 는 높이 와 너 비 는 다르다.그래서 저 는 js 를 통 해 얼 의 높이 를 설정 합 니 다.l 의 position 속성 값 은 relative 이기 때문에 l 의 높이 는 외층 div 의 높이 를 벌 린 다.이 사례 는 그림 의 투명 도 를 바 꾸 어 윤 방 을 실현 하 는 것 이기 때문에 모든 그림 은 같은 위치 에 있 습 니 다.기본 적 인 상황 에서 마지막 그림 은 맨 위 에 있 고 첫 번 째 그림 은 맨 아래 에 있 습 니 다.윤 방 첫 번 째 그림 은 첫 번 째 그림 이 고 그 다음 에 두 번 째 그림 이 며 마지막 이 세 번 째 그림 입 니 다.그래서 표시 할 모든 li 에 z-index 속성 을 설정 합 니 다.또한 z-index 속성 치 는 순서대로 감소 합 니 다.나 는 js 로 모든 li 의 z-index 속성 값 을 설정 하지만,사실은 이렇게 할 필요 가 없다.직접 css 속성 을 사용 하면 된다.단지 세 개의 선택 기 를 써 야 한다.
html 는 다음 과 같다.

<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <title>           </title>
 <link rel="stylesheet" type="text/css" href="index.css" rel="external nofollow" >
</head>
<body>
 <div class='warp' id='warp'>
 <ul class='list' id='list'>
  <li><img src='img/4274ad202b27b671e622388989399d54.jpg' style='opacity: 1'></li>
  <li><img src='img/299733ddbe89d6b317cc0e84c43999d4.jpg' style='opacity: 1'></li>
  <li><img src='img/9b7ec36280e638929aa10ce0955df3d3.jpg' style='opacity: 1'></li>
 </ul>
 <div class='pre' id='pre'>《</div>
 <div class='next' id='next'>》</div>
 </div>
 <script type="text/javascript" src='index.js'></script>
</body>
</html>
css 코드 는 다음 과 같 습 니 다.

*{
 padding: 0;
 margin: 0;
}
.warp{
 position: relative;
 width: 100%;
}
.list{
 position: relative;
 width: 100%;
}
.list li{
 position: absolute;
 top:0;
 left: 0;
 width: 100%;
 list-style: none;
 opacity: 1;
}
li img{
 width: 100%;
}
.pre,.next{
 position: absolute;
 top: 50%;
 bottom: 0;
 width: 64px;
 height: 64px;
 z-index: 10;
 margin-top: -32px;
 text-align: center;
 line-height: 64px;
 color: #fff;
 font-weight: bold;
 font-size: 30px;
 cursor: pointer;
 background-color: transparent;
}
.pre{
 left: 20px;
 right: auto;
}
.next{
 right:20px;
 left: auto;
}
.pre:hover,.next:hover{
 background-color: rgba(0,0,0,0.7);
}
두 번 째 부분(js)과 관련 된 지식 은 이벤트,함수 절 류,타이머 설정,타이머 제거
이 벤트 는 원생 js 로 기능 을 실현 하기 때문에 브 라 우 저 호환성 문 제 를 고려 해 야 합 니 다.
이벤트 흐름
두 가지 유형의 시간 흐름 이 있 는데 그것 이 바로 사건 의 거품 흐름 과 사건 의 포획 흐름 이다.이 차 이 는 완전히 상 반 된 사건 흐름 개념 이 고 사건 의 거품 흐름 을 사건 의 거품 이 라 고 하 는데 이것 은 IE 가 제기 한 것 이다.하나의 click 사건 을 예 로 들 면 이벤트 거품 에서 사건 은 가장 구체 적 인 요소,즉 우리 가 클릭 한 요소 에서 발생 한 다음 에 dom 트 리 를 따라 위로 전파 된다.전파 하 는 과정 에서 모든 단계 노드 에서 click 사건 이 발생 하고 전 파 된 document 대상 까지 발생 한다.이벤트 캡 처 흐름 을 이벤트 캡 처 라 고 하 는데 이것 은 Netscape Communicator 가 제기 한 것 입 니 다.마찬가지 로 하나의 click 이 벤트 를 예 로 들 면 이벤트 캡 처 에서 이 벤트 는 가장 구체 적 이지 않 은 그 노드(document 대상 이 먼저 이 벤트 를 받 음)에서 먼저 발생 한 다음 에 dom 트 리 를 따라 아래로 전파 되 고 가장 구체 적 인 노드 는 마지막 에 이 벤트 를 받 습 니 다.즉,실제로 점 격 된 그 요 소 는 마지막 에 click 이 벤트 를 받 습 니 다."DOM 2 급 사건'은 사건 흐름 이 사건 포획 단계 로 목표 단계 와 사건 거품 단계 에 있 는 세 단 계 를 포함한다 고 규정 하고 있다.주류 브 라 우 저 에 서 는 IE 를 제외 하고 DOM 이벤트 흐름 을 지원 하지 않 으 며,다른 브 라 우 저 에 서 는 DOM 이벤트 흐름 을 지원 합 니 다.그래서 IE 의 지원 사건 에 거품 이 생 겼 습 니 다.하지만 앞으로 IE 는 DOM 이벤트 흐름 을 지원 할 것 으로 보인다.그 때 는 이벤트 바 인 딩 을 할 때 브 라 우 저 호 환 문 제 를 고려 하지 않 아 도 됩 니 다.현재 각종 브 라 우 저 를 최대한 호 환 하기 위해 이벤트 처리 프로그램 을 이벤트 흐름 의 거품 단계 에 추가 합 니 다.
이벤트 처리 프로그램
>DOM 0 급 이벤트 처리 프로그램
DOM 0 레벨 은 요소 의 속성 할당 방식 으로 이 벤트 를 연결 하고 이벤트 처리 프로그램 속성의 값 을 함수 로 설정 하면 됩 니 다.프로그램의 this 는 현재 요 소 를 가리킨다.DOM 0 급 방법 으로 연 결 된 이 벤트 를 삭제 하 는 방법 은 이벤트 처리 프로그램의 속성 을 null 로 설정 하 는 것 입 니 다.만약 원소 가 이 벤트 를 귀속 시 켰 다 면,이 원 소 를 문 서 를 제거 하기 전에,이 원소 가 연 결 된 이 벤트 를 수 동 으로 해제 하 는 것 이 좋 습 니 다.이렇게 하면 요소 가 제거 되 는 것 을 방지 할 수 있 지만 이 요소 의 이벤트 처리 프로그램의 인용 은 메모리 에 남아 있 습 니 다.그래서 현대 브 라 우 저 는 DOM 0 급 이벤트 처리 프로그램 을 지원 합 니 다.그러나 DOM 0 급 으로 이 벤트 를 연결 할 때 모든 요소 가 같은 이벤트 에 하나의 이벤트 처리 프로그램 만 추가 할 수 있 습 니 다.
>DOM 2 급 이벤트 처리 프로그램
"DOM 2 급 이벤트"에서 이벤트 처리 프로그램 을 지정 하 는 방법 은 addEventListener()입 니 다.첫 번 째 매개 변 수 는 하나의 이벤트 이름 이 고 두 번 째 매개 변 수 는 하나의 이벤트 처리 프로그램(즉 하나의 함수,익명 함수 일 수 있 습 니 다)입 니 다.세 번 째 매개 변 수 는 불 값 입 니 다.이 불 값 은 어느 단계 에서 사건 을 처리 하 는 지,false 일 때 거품 단계 에서 처리 하 는 지,true 일 때 포획 단계 에서 처리 하 는 지 를 나타 낸다.호환성 을 위해 서 이 값 을 false 로 설정 합 니 다.'DOM 2 급 이벤트'로 연 결 된 시간 처리 프로그램 을 해제 하려 면 removeEventListener()를 사용 해 야 하 며 익명 의 이벤트 처리 프로그램 은 해제 할 수 없습니다."DOM 2 급 이벤트"바 인 딩 이 벤트 를 사용 할 때 모든 요소 가 같은 이벤트 에 여러 개의 이벤트 처리 프로그램 을 추가 할 수 있 습 니 다.'DOM 2 급 사건'으로 납치 한 사건 처리 프로그램 으로,this 는 현재 요 소 를 말한다.
IE 이벤트 처리 프로그램
IE 에서 이벤트 처리 프로그램 을 지정 하 는 방법 은 attachEvent()이 고 첫 번 째 매개 변 수 는 이벤트 처리 프로그램 이름(즉"on"+이벤트 이름)이 며 두 번 째 매개 변 수 는 시간 처리 프로그램(하나의 함수,익명 함수 일 수 있 음)입 니 다.IE 는 이벤트 거품 만 지원 하기 때문에 사건 은 거품 단계 에서 처 리 됩 니 다.detachEvent()를 사용 하면 attachEvent()로 추 가 된 시간 처리 프로그램 을 제거 할 수 있 지만 익명 함 수 는 제거 할 수 없습니다.attachEvent()바 인 딩 이벤트 this 는 window 를 말 합 니 다.attachEvent 바 인 딩 이 벤트 를 사용 할 때 모든 요소 가 같은 이벤트 에 여러 개의 이벤트 처리 프로그램 을 추가 할 수 있 습 니 다.
주:익명 함수 가 제거 되 지 않 는 이 유 는 js 에서 함수 가 하나의 대상 이 고 이 대상 은 더미 에 저장 되 어 있 으 며 함수 명 은 포인터 로 더미 속 의 대상 을 가리 키 고 있 기 때 문 입 니 다.익명 함수 에 대해 서 는 포인터 가 가리 키 지 않 아 접근 할 수 없습니다.
이벤트 개체
DOM 을 호 환 하 는 브 라 우 저 에서 이벤트 대상 은 하나의 매개 변수 로 이벤트 처리 프로그램 에 전 달 됩 니 다.(즉 DOM 을 호 환 하 는 브 라 우 저 에 서 는 DOM 0 급 이나 DOM 2 급 바 인 딩 이 벤트 를 통 해 이벤트 대상 을 매개 변수 로 이벤트 처리 프로그램 에 전달 하 는 것),당시 IE 브 라 우 저 에 서 는 DOM 0 급 으로 시간 처리 프로그램 을 지정 하면 이벤트 대상 은 window 의 이벤트 속성 에 저장 되 며,attachEvent()로 시간 처리 프로그램 을 지정 하면이벤트 대상 은 이벤트 처리 프로그램 에 매개 변수 로 전 달 됩 니 다.DOM 을 호 환 하 는 브 라 우 저의 이벤트 대상 의 값 과 IE 의 이벤트 대상 의 값 에 차이 가 있 습 니 다.그러나 이들 은 모두 공 통 된 값 인 type(즉,촉발 되 는 시간의 유형)을 가지 고 있다.DOM 을 호 환 하 는 브 라 우 저 에서 이벤트 대상 의 target 속성 은 이벤트 의 목 표를 표시 합 니 다.하나의 click 사건 을 예 로 들 면 target 속성 은 가장 구체 적 인 요 소 를 말 합 니 다.IE 브 라 우 저 에서 이벤트 대상 의 srcElement 속성 은 이벤트 목 표를 표시 합 니 다.
이 사례 에서 나 는 가장 바깥쪽 div(id 는 warp)에 click 의 이벤트 처리 프로그램 을 추가 했다.이벤트 목표 의 id 값 을 판단 하여 트리거 이벤트 의 가장 구체 적 인 노드 를 확인 합 니 다.이벤트 대상 의 id 값 이 pre 이면 이전 그림 으로 전환 하고 이벤트 대상 의 id 값 이 next 이면 다음 그림 으로 전환 합 니 다.이벤트 에이 전 트 를 사용 합 니 다.이벤트 에이 전 트 는 사용 하 는 메모 리 를 줄 일 수 있 습 니 다.
함수 절 류 는 이 사례 에서 함수 절 류 를 사용 하 는 것 은 resize 사건 을 연속 으로 촉발 할 때 브 라 우 저의 계 산 량 을 줄 이기 위해 서 입 니 다.브 라 우 저의 계 산 량 이 너무 많 으 면 브 라 우 저가 느 려 지고 심지어 무 너 지기 때 문 입 니 다.함수 절 류 는 이벤트 가 실 행 될 때 이벤트 처리 프로그램 에서 즉시 계산 하 는 것 이 아니 라 setTimeout 이나 setInterval 을 사용 하여 지 정 된 시간 후에 계산 하 는 것 입 니 다.
타이머 설정 과 타이머 제거주로 나 도 아직 완전히 이해 하지 못 했다.브 라 우 저 는 다 중 스 레 드 입 니 다.타 이 머 를 여 는 것 은 브 라 우 저의 타 이 머 스 레 드 입 니 다.js 실행 프로그램 은 브 라 우 저의 또 다른 스 레 드 입 니 다.브 라 우 저 는 이 두 스 레 드 를 제외 하고 다른 스 레 드 가 없습니다.나 도 브 라 우 저 스 레 드 간 의 관 계 를 알 게 된 후에 나 는 다시 한 편의 글 을 쓸 것 이다.
이 인 스 턴 스 에서 그림 의 투명 도 를 바 꾸 는 것 은 타이머 설정 을 통 해 점점 커지 거나 작 아 지 는 것 입 니 다.다음 그림 의 불투명 도 를 높이 기 전에 현재 그림 의 불투명 도 를 0 으로 줄 여야 합 니 다.
페이지 를 열 어 자동 으로 재생 하 는 것 도 타이머 로 이 루어 집 니 다.재생 을 중단 하려 면 타이머 를 제거 합 니 다.
js 코드 는 다음 과 같 습 니 다. 

//                      window load   。     dom0      ,     window load             ,        :   window.onload       ,     ,           ,      ,        。 attachEvent()  addEventListener()                        ,          。

function addLoadEvent(func){
 var oldLoad = window.onload;
 if(typeof oldLoad != 'function'){
 window.onload = func();
 }else{
 window.onload = function(){
  oldLoad();
  func();
 }
 }
}



//  class list   ,     position absolute  .list       
//             0,         margin: auto 0;     
function setListHeight(){
 var list = document.getElementById('list');
 var imgItem = list.getElementsByTagName('img')[0];
 var height = imgItem.offsetHeight;
 var list = document.getElementById('list');
 list.style.height = height + 'px';
}

//  li   ,    css  
function setLiIndex(){
 var list = document.getElementById('list');
 var li = list.getElementsByTagName('li');
 var liLen = li.length;
 for(var i = 0;i<liLen;i++){
 li[i].style.zIndex = liLen-i;
 }
}
var index = 1;//index         ,index       
var timer;//       ,             

//            
var untilEvent = {
 addEvent:function(element,type,hander){
 if(element.addEventListener){
  element.addEventListener(type,hander,false);
 }else if(element.attachEvent){
  element.attachEvent('on'+type,hander);
 }else{
  element['on'+type] = hander;
 }
 },
 getEvent:function(event){
 return event?event:window.event;
 },
 getTarget:function(event){
 return event.target||event.srcElement;
 }

};
function btnClick(){
 var warp = document.getElementById('warp');
 untilEvent.addEvent(warp,'click',function(event){
 var event = untilEvent.getEvent(event);
 var target = untilEvent.getTarget(event);
 switch(target.id){
  case 'pre': if(index == 1){//                 ,      "   "  ,                  
   index =3;
  }else{
   --index;
  }
  anmitate();
  break;
  case 'next':if(index == 3){//                ,      "   "  ,                 
  index = 1;
  }else{
   ++index;
  }
  anmitate();
  break;
 }
 });
}
//       
function decline(cur,inverTime,inverOpacity){
 var opacityed = parseFloat(cur.style.opacity);
 if(opacityed > 0){
 cur.style.opacity = opacityed-inverOpacity;
 setTimeout(function(){
  decline(cur,inverTime,inverOpacity);
 },inverTime);
 }
}
//       
function anmitate(){
 var list = document.getElementById('list');
 var imgs = list.getElementsByTagName('img');
 var imgsLen = imgs.length;
 var whole = 300;//          
 var inverTime = 5;//    
 var inverOpacity = 1/(whole/inverTime);
 for(var i = 0;i<imgsLen;i++){
 decline(imgs[i],inverTime,inverOpacity);
 }
 var go = function(){
 var opacityed = parseFloat(imgs[index - 1].style.opacity);
 if(opacityed < 1){
  imgs[index-1].style.opacity = opacityed + inverOpacity;
  setTimeout(go,inverTime);
 }
 };
 go();
}
//          
function play() {
 timer = setTimeout(function () {
 if(index == 3){
  index = 1;
 }else{
  ++index;
 }
 anmitate();
  play();
  //
 }, 3000);
}
//      ,                ,         ,       
function stop() {
 clearTimeout(timer);
}

//    div                  
function getWarp(){
 var warp = document.getElementById('warp');
 untilEvent.addEvent(warp,"mouseout",play);
 untilEvent.addEvent(warp,"mouseover",stop);
}
//    ,        ,        ,                    ,li             
function scrollEvent(){
 untilEvent.addEvent(window,"resize",function(){
 throttle(setListHeight);
 });
}
function throttle(method,context){
 clearTimeout(method.Tid);
 method.Tid = setTimeout(method,70);
}
addLoadEvent(scrollEvent);
addLoadEvent(setListHeight);
addLoadEvent(setLiIndex);
addLoadEvent(btnClick);
addLoadEvent(play);
addLoadEvent(getWarp);
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기