gsap 사용 중 특정 div 안에 마우스가 들어가면 해당 div의 스크롤이 우선적으로 실행되게 하기

gsap 사용 중 특정 div 안에 마우스가 들어가면 해당 div의 스크롤이 우선적으로 실행되게 하기

QA

gsap 사용 중 특정 div 안에 마우스가 들어가면 해당 div의 스크롤이 우선적으로 실행되게 하기

답변 2

본문

안녕하세요 현재 gsap 사용해서 홈페이지 제작 중인데요 ㅜㅜ

마우스휠 스크롤 도중 특정 div 안에 마우스가 들어갈 경우 전체 스크롤을 멈추고

해당 div 내의 스크롤이 우선적으로 실행되게 한 다음

div의 스크롤이 끝에 도달하면 다시 전체 스크롤이 작동되게 하고 싶은데요

코드를 넣었는데 실행이 안 되는 것 같습니다...ㅠㅠ 도와주세요...

 

코드는 아래와 같습니다..

 

    <section class="mainSec mainSec5 portfolio">

      <div class="portfolio-contents-wrap">

        <div class="portfolio-contents-inner">

          <article class="portfolio-work">

            <div class="work-contents">

              <div class="work-thum" data-img="#img1">

                <figure class="img-box">

                  <img src="/img/portfolio-img01.png" alt>

                </figure>

              </div>

                <div class="work-tit">

                  <p>테스트제목</p>

                </div>

              <div class="work-txtwrap">

                <ul>

                  <li>

                    <div class="work-solution">

                      <p>솔루션</p>

                    </div>

                    <div class="work-desc">

                      <span class="work-wordpress">WordPress</span>

                    </div>

                  </li>

                  <li>

                    <div class="work-solution">

                      <p>작업범위</p>

                    </div>

                    <div class="work-desc">

                      <span class="work-main">메인</span>

                      <span class="work-sub">서브</span>

                      <span class="work-sub-design">서브디자인</span>

                    </div>

                  </li>

                  <li>

                    <div class="work-solution">

                      <p>작업기여도</p>

                    </div>

                    <div class="work-desc">

                      <span class="work-contribution">100%</span>

                    </div>

                  </li>

                </ul>

              </div>

              <div class="portfolio-contents-btn">

                <a href="#">사이트 이동</a>

                <a href="#">자세히 보기</a>

              </div>

            </div>

          </article>

          <article class="portfolio-work">

            <div class="work-contents">

              <div class="work-thum" data-img="#img2">

                <figure class="img-box">

                  <img src="/img/portfolio-img01.png" alt>

                </figure>

              </div>

                <div class="work-tit">

                  <p>테스트제목</p>

                </div>

              <div class="work-txtwrap">

                <ul>

                  <li>

                    <div class="work-solution">

                      <p>솔루션</p>

                    </div>

                    <div class="work-desc">

                      <span class="work-wordpress">WordPress</span>

                    </div>

                  </li>

                  <li>

                    <div class="work-solution">

                      <p>작업범위</p>

                    </div>

                    <div class="work-desc">

                      <span class="work-main">메인</span>

                      <span class="work-sub">서브</span>

                      <span class="work-sub-design">서브디자인</span>

                    </div>

                  </li>

                  <li>

                    <div class="work-solution">

                      <p>작업기여도</p>

                    </div>

                    <div class="work-desc">

                      <span class="work-contribution">100%</span>

                    </div>

                  </li>

                </ul>

              </div>

              <div class="portfolio-contents-btn">

                <a href="#">사이트 이동</a>

                <a href="#">자세히 보기</a>

              </div>

            </div>

          </article>

          <article class="portfolio-work">

            <div class="work-contents">

              <div class="work-thum" data-img="#img3">

                <figure class="img-box">

                  <img src="/img/portfolio-img01.png" alt>

                </figure>

              </div>

                <div class="work-tit">

                  <p>테스트제목</p>

                </div>

              <div class="work-txtwrap">

                <ul>

                  <li>

                    <div class="work-solution">

                      <p>솔루션</p>

                    </div>

                    <div class="work-desc">

                      <span class="work-wordpress">WordPress</span>

                    </div>

                  </li>

                  <li>

                    <div class="work-solution">

                      <p>작업범위</p>

                    </div>

                    <div class="work-desc">

                      <span class="work-main">메인</span>

                      <span class="work-sub">서브</span>

                      <span class="work-sub-design">서브디자인</span>

                    </div>

                  </li>

                  <li>

                    <div class="work-solution">

                      <p>작업기여도</p>

                    </div>

                    <div class="work-desc">

                      <span class="work-contribution">100%</span>

                    </div>

                  </li>

                </ul>

              </div>

              <div class="portfolio-contents-btn">

                <a href="#">사이트 이동</a>

                <a href="#">자세히 보기</a>

              </div>

            </div>

          </article>

          <article class="portfolio-work">

            <div class="work-contents">

              <div class="work-thum" data-img="#img4">

                <figure class="img-box">

                  <img src="/img/portfolio-img01.png" alt>

                </figure>

              </div>

                <div class="work-tit">

                  <p>테스트제목</p>

                </div>

              <div class="work-txtwrap">

                <ul>

                  <li>

                    <div class="work-solution">

                      <p>솔루션</p>

                    </div>

                    <div class="work-desc">

                      <span class="work-wordpress">WordPress</span>

                    </div>

                  </li>

                  <li>

                    <div class="work-solution">

                      <p>작업범위</p>

                    </div>

                    <div class="work-desc">

                      <span class="work-main">메인</span>

                      <span class="work-sub">서브</span>

                      <span class="work-sub-design">서브디자인</span>

                    </div>

                  </li>

                  <li>

                    <div class="work-solution">

                      <p>작업기여도</p>

                    </div>

                    <div class="work-desc">

                      <span class="work-contribution">100%</span>

                    </div>

                  </li>

                </ul>

              </div>

              <div class="portfolio-contents-btn">

                <a href="#">사이트 이동</a>

                <a href="#">자세히 보기</a>

              </div>

            </div>

          </article>

          <article class="portfolio-work">

            <div class="work-contents">

              <div class="work-thum" data-img="#img5">

                <figure class="img-box">

                  <img src="/img/portfolio-img01.png" alt>

                </figure>

              </div>

                <div class="work-tit">

                  <p>테스트제목</p>

                </div>

              <div class="work-txtwrap">

                <ul>

                  <li>

                    <div class="work-solution">

                      <p>솔루션</p>

                    </div>

                    <div class="work-desc">

                      <span class="work-wordpress">WordPress</span>

                    </div>

                  </li>

                  <li>

                    <div class="work-solution">

                      <p>작업범위</p>

                    </div>

                    <div class="work-desc">

                      <span class="work-main">메인</span>

                      <span class="work-sub">서브</span>

                      <span class="work-sub-design">서브디자인</span>

                    </div>

                  </li>

                  <li>

                    <div class="work-solution">

                      <p>작업기여도</p>

                    </div>

                    <div class="work-desc">

                      <span class="work-contribution">100%</span>

                    </div>

                  </li>

                </ul>

              </div>

              <div class="portfolio-contents-btn">

                <a href="#">사이트 이동</a>

                <a href="#">자세히 보기</a>

              </div>

            </div>

          </article>

          <article class="portfolio-work">

            <div class="work-contents">

              <div class="work-thum" data-img="#img6">

                <figure class="img-box">

                  <img src="/img/portfolio-img01.png" alt>

                </figure>

              </div>

                <div class="work-tit">

                  <p>테스트제목</p>

                </div>

              <div class="work-txtwrap">

                <ul>

                  <li>

                    <div class="work-solution">

                      <p>솔루션</p>

                    </div>

                    <div class="work-desc">

                      <span class="work-wordpress">WordPress</span>

                    </div>

                  </li>

                  <li>

                    <div class="work-solution">

                      <p>작업범위</p>

                    </div>

                    <div class="work-desc">

                      <span class="work-main">메인</span>

                      <span class="work-sub">서브</span>

                      <span class="work-sub-design">서브디자인</span>

                    </div>

                  </li>

                  <li>

                    <div class="work-solution">

                      <p>작업기여도</p>

                    </div>

                    <div class="work-desc">

                      <span class="work-contribution">100%</span>

                    </div>

                  </li>

                </ul>

              </div>

              <div class="portfolio-contents-btn">

                <a href="#">사이트 이동</a>

                <a href="#">자세히 보기</a>

              </div>

            </div>

          </article>

        </div>

      </div>

    </section>

 

 

.portfolio { overflow: hidden; width: 100vw; height: 100vh; }

.portfolio .portfolio-contents-wrap { position: absolute; left: 0; bottom: -300vh; display: flex; align-items: center; width: 100vw; height: 100vh; background-color: rgba(255, 255, 255, 0.5); -webkit-backdrop-filter: blur(5px); backdrop-filter: blur(5px); }

.portfolio-contents-inner { overflow-y: scroll; display: flex; align-items: center; flex-wrap: wrap; gap: 40px; height: calc(100vh - 300px); max-width: 1300px; padding: 0 20px; margin: 0 auto; }

.portfolio-work { width: calc((100% - 40px) / 2); padding: 30px; border-radius: 20px; background-color: rgba(255, 255, 255, 0.5); }

.work-thum { width: 100%; height: 250px; margin-bottom: 20px; background-color: #f90; }

.work-tit { margin-bottom: 5px; font-size: 25px; }

.work-txtwrap ul li { display: flex; align-items: center; gap: 20px; padding: 5px 0; }

.work-desc span { display: inline-block; padding: 3px 5px; border-radius: 3px; background-color: #000; color: #fff; }

 

.img-box { overflow: hidden; height: 100%; }

.img-box img { width: 100%; }

 

$.fn.extend({

  mouse_wheel: function() {

    $(this).on('mousewheel DOMMouseScroll', function(e) {

      e.preventDefault(); // 기본 스크롤 방지

 

      var delta = e.originalEvent.wheelDelta || -e.originalEvent.detail;

      var $this = $(this);

 

      // 현재 스크롤 위치

      var scrollTop = $this.scrollTop();

      var scrollHeight = $this[0].scrollHeight;

      var height = $this.outerHeight();

 

      // 상단에 도달했지만 이전 스크롤은 상단에 도달하지 않은 경우

      if (delta > 0 && scrollTop <= 0 && scrollHeight > height) {

        $this.scrollTop(scrollTop - delta);

        return false; // 상위 스크롤로 넘어가지 않음

      }

 

      // 하단에 도달했지만 이전 스크롤은 하단에 도달하지 않은 경우

      if (delta < 0 && scrollTop + height >= scrollHeight && scrollHeight > height) {

        $this.scrollTop(scrollTop - delta);

        return false; // 상위 스크롤로 넘어가지 않음

      }

 

      // 영역 내부 스크롤 처리

      $this.scrollTop(scrollTop - delta);

    });

  }

});

 

$('.portfolio-contents-inner').mouse_wheel();

 

 

감사합니다 ㅠㅠ

이 질문에 댓글 쓰기 :

답변 2

아래의 코드를 참고해 보시겠어요..

 

-JavaScript 수정

 

$(document).ready(function () {
  const $portfolioInner = $('.portfolio-contents-inner');

  // 전체 스크롤을 비활성화하는 함수
  function disableScroll() {
    $('body').css('overflow', 'hidden');
  }

  // 전체 스크롤을 활성화하는 함수
  function enableScroll() {
    $('body').css('overflow', 'auto');
  }

  // mouse wheel 이벤트를 처리하는 함수
  $.fn.extend({
    mouse_wheel: function () {
      $(this).on('mousewheel DOMMouseScroll', function (e) {
        e.preventDefault(); // 기본 스크롤 방지

        let delta = e.originalEvent.wheelDelta || -e.originalEvent.detail;
        let $this = $(this);
        let scrollTop = $this.scrollTop();
        let scrollHeight = $this[0].scrollHeight;
        let height = $this.outerHeight();

        // 상단에 도달했지만 이전 스크롤은 상단에 도달하지 않은 경우
        if (delta > 0 && scrollTop <= 0 && scrollHeight > height) {
          $this.scrollTop(scrollTop - delta);
          return false; // 상위 스크롤로 넘어가지 않음
        }

        // 하단에 도달했지만 이전 스크롤은 하단에 도달하지 않은 경우
        if (delta < 0 && scrollTop + height >= scrollHeight && scrollHeight > height) {
          $this.scrollTop(scrollTop - delta);
          return false; // 상위 스크롤로 넘어가지 않음
        }

        // 영역 내부 스크롤 처리
        $this.scrollTop(scrollTop - delta);
      });
    }
  });

  // 포트폴리오 콘텐츠 내부에서 마우스가 들어갈 때
  $portfolioInner.on('mouseenter', function () {
    disableScroll(); // 전체 스크롤 비활성화
  });

  // 포트폴리오 콘텐츠 내부에서 마우스가 나갈 때
  $portfolioInner.on('mouseleave', function () {
    enableScroll(); // 전체 스크롤 활성화
  });

  $portfolioInner.mouse_wheel(); // 마우스 휠 이벤트 적용
});
 

 

 

 

 

답변을 작성하시기 전에 로그인 해주세요.
QA 내용 검색
질문등록
전체 2,661
© SIRSOFT
현재 페이지 제일 처음으로