uiux 20일차

이명진·2024년 12월 10일

<마우스 휠 할 때 페이지가 한 페이지씩 넘겨갈 때>

// for문과 비슷한 'each'
// 모든 page 클래스를 가진 요소를 순화하며 각각에 대해 하나씩 처리

$('.page').each(function(){
  // 각 page 요소에 마우스 휠 이벤트 추가
  
  $(this).on("mouseheel DOWNScroll",function(e){
    // 브라우저의 기본 동작을 막고 커스텀 스크롤 동작으로 대체
    e.preventDefault();
    
    var delta = 0; 
    // 마우스 휠 이동 방향과 크기를 지정하기 위한 변수
    
    if (!event) event = window.event;
    // 이벤트 객체가 존재하지 않을 경우
    // window.event로 설정{브라우저 호환성을 위해 사용}
    
    if (event.wheelDelta){
      delta = event.wheelDelta / 120;
       // 크롬, IE 중에서는 event.wheelDelta 를 이용해 휠 방향과 크기를 가져옴
      // 120=한 번 휠 이동단위-opera
      if(window.opera) delta = -delta;
      // opera 브라우저의 경우 방향을 반대로 처리
    }
    
   
    else if (event.detail){
     // 파이어 폭스 등에서는 event.detail 값을 사용하여 방향과 크기를 계산
      delta = -event.detail / 3;
       // 값이 음수이므로 부호를 반전하고 3으로 나눠 표준화
      // 3-파이어폭스 기본값
      
      // 브라우저마다 다르기 때문에 if문을 쓴 것
    }
    
    var moveTop = null;
    // 스크롤 이동 위치를 지정할 변수
    if(delta < 0){
      // 마우스 휠이 아래로 움직인 경우
      if($(this).next() !=undefined){
        // 현재 .page 요소의 다음 형제 요소가 존재하는지 확인
        moveTop = $(this).next().offset().top;
        // 다음 요소의 offset().top 값을 가져와 이동 위치(movetop)로 설정
      }
    }
    // 마우스 휠이 위로 움직인 경우 
    else {
      if ($(this).next() !=undefined){
        // 현재 .page 요소의 다음 형제 요소가 존재하는지 확인
        moveTop = $(this).prev().offset().top;
        // 다음 요소의 offset().top 값을 가져와 이동 위치(movetop)로 설정
      }
    }
    
    $('html,body')
    // 화면을 지정된 위치로 부드럽게 스크롤
    .stop()
    // 현재 실행 중인 다른 스크롤 애니메애션을 중단
    .animate({
      scrollTop:moveTop + 'PX'
    },
            300
             // 애니메애션 지속 시간
        );
  });
});

<주석 없는 버전>


$('.page').each(function(){
  $(this).on("mouseheel DOWNScroll",function(e){
    e.preventDefault();
    var delta = 0; 
    if (!event) event = window.event;

 
    if (event.wheelDelta){
      delta = event.wheelDelta / 120;
      if(window.opera) delta = -delta;
    }
    
    else if (event.detail){
      delta = -event.detail / 3;
    }
    
    var moveTop = null;
 
    if(delta < 0){
      
      if($(this).next() !=undefined){
        
        moveTop = $(this).next().offset().top;
     
      }
    }
   
    else {
      if ( $(this).next() !=undefined){
        moveTop = $(this).prev().offset().top;
       
      }
    }
    
    $('html,body')
    .stop()
    .animate({
      scrollTop:moveTop + 'PX'
    },
            300
           
            );
  });
});

<마우스 휠 페이지 이동 2>

console.clear();

var pages__noWorking = false;
// 현재 스크롤 애니메이션이 실행 중인지 확인

//해당 페이지로 부드럽게 가기 위함
function pages__goToScroll() {
  if (pages__noWorking) {
    return false;
    // 이미 스크롤 애니메이션 중이라면 중복 실행 방지
  }
  pages__noWorking = true;
  // 애니메이션 시작

  $("html,body")
    .stop()
    .animate(
      { scrollTop: top }, //스크롤 이동 위치 설정
      500, //애니메이션 지속 시간
      function () {
        pages__noWorking = false; // 애니메이션 종료 후 초기화
      }
    );
}

//특정 페이지(index)로 이동하는 함수
function Pages__goTo(index) {
  var $page = $("pages>div"); //모든 페이지 요소를 가져옴

  if (index < 0) {
    index = 0; //첫 페이지
  } else if (index >= $page.length) {
    index = $page.length - 1; //마지막 페이지(0~4 니까 -1을 한 것)
  }

  var top = $(".page > div").eq(index).attr("data-offsetTop");
  pages__goToScroll(top); //해당 페이지로 스크롤
}

var pages__activeMenuItem = -1;

//메뉴 항목 활성화 함수
function pages__activeMenuItem(index) {
  if (pages__activeMenuItem == index) {
    return false; // 이미 활성화 된 메뉴라면 처리하지 않음
  }

  pages__activeMenuItem = index; // 현재 활성화 된 메뉴 업데이트
  $(".top-bar > .pages-menu > ul> li.active").removeClass("active"); // 기존 활성화 제거
  $(".top-bar > .pages-menu > ul> li").eq(index).addClass("active"); // 새로운 활성화 설정
}

//페이지 크기 및 위치 정보 업데이트
function pages__updatePageShapeInfo() {
  $(".pages > div").each(function (index) {
    var width = $(this).width(); //페이지 너비
    var height = $(this).height(); //페이지 높이
    var offsetTop = $(this).offset().top; //페이지 상단 위치

    $(this).attr("data-width", width); //너비 지정
    $(this).attr("data-height", height); //높이 지정
    $(this).attr("data-offsetTop", offsetTop); //상단 위치 지정
  });
}

//초기화 함수
function Pages__init() {
  //메뉴 클릭시 해당 페이지로 이동
  $(".top-bar> .pages-menu > ul> li").click(function () {
    var index = $(this).index(); //클릭된 메뉴의 index 가져오기
    var top = parseInt($("pages > div").eq(index).attr("data-offsetTop")); //문자를 숫자로 바꿔줌(parseInt)
    pages_goToScroll(top); // 해당 위치로 이동
  });

  //페이지에서 마우스 휠 이벤트 처리
  $(".pages>div").on("mousewheel DOMMouseScroll", function (e) {
    var index = $(this).index();
    var E = e.originalEvent; //원래 이벤트 객체(묶음?) 가져오기
    var delta = E.delta ? E.delta * -40 : E.wheelDelta; 
    // 방향과 크기 계산(공식).삼항연산자 ㅁ(얘가) ? ㅁ(true일때 실행) : ㅁ(false일 때 실행)

    
    
    if (delta > 0) {
      Pages__goTo(index - 1); //이전 페이지로 이동
    } else {
      Pages__goTo(index + 1); //다음 페이지로 이동
    }
    return false; //기본 동작 막기
  });
  
  //스크롤 이벤트 처리
  $(window).scroll(function(){
    var scrollTop = $(this).scrollTop(); //현재 스크롤 위치
    $ ('.pages>div').each(function(index){
      var offsetTop = parseInt($(this).attr('data-offsetTop')); //페이지 상단 위치
      if (scrollTop <= offsetTop){
         pages__activeMenuItem(index); // 해당 페이지 메뉴 활성화
        return false; //첫 번째로 일치하는 페이지에서 종료
      }
        
    });
  });
  
  //창 크기 변경 시 페이지 정보 업데이트
  $(window).resize(function(){
    pages__updatePageShapeInfo(); //페이지 크기와 위치 정보 갱신
    $(window).scroll(); //스크롤 이벤트 재설정
  })
  .resize(); //초기실행
}

Pages__init();

attr 은 속성이다
href src와 같은

0개의 댓글