인프런 커뮤니티 질문&답변

기쁜 도미님의 프로필 이미지
기쁜 도미

작성한 질문수

초보자도 만들 수 있는 스크롤 인터렉션. 1편 자바스크립트

4-4 [바닐라JS로 바꾸기] 스크롤 인터렉션 스크립트 작성하기(패럴럭스, 배경전환)

죄송합니다만 해당 프로젝트를 리엑트로 수정해서 만들어보고있는중에 질문드립니다.

해결된 질문

작성

·

329

·

수정됨

1

코드로보시면 간단합니다.

왠만한건 다돌아가기 때문에 해석할 필요는 없으실겁니다.

테일윈드

backgroundImage 를 단축어로설정하여 bg-sky2 를사용하면 사진이 불러와집니다. 모든것이 정상 작동잘됍니다.

 

아래는 제가 작성한 코드중 일부분입니다.

  <div
        className={`${
          scrollPercent >= 25 && scrollPercent < 50
            ? "opacity-100 "
            : "opacity-0 "
        } block absolute  h-full bg-sky2 transition-opacity duration-500`}
      ></div>

이때 absolute 를 사용하였을떄 bg-sky2 이미지가 안보이게됍니다.

일부분 버그인줄 알았습니다. 그래서 다른 백그라운드 색상을 바꾸어보았습니다.

bg-sky2 ==>(교체) bg-red-400 

동일하게 안보입니다.

하지만

absolute 를 사용하지 않으면 4개가 스택처럼 쌓이지만 정상적이게 원하는퍼 센테이지에 올떄 없어지고 생성됍니다.

고민중

이미지로 만들었는데 정상작동 하였습니다.하지만 저는

backgroundImage 로넣는것이 필터다 backgroundFixed 등 여러가지 활용이 된다고 생각하여 질문드립니다.

 

 <img
        className={`${
          scrollPercent >= 75 && scrollPercent < 102
            ? "opacity-100 "
            : "opacity-0  "
        }block  absolute h-full  transition-opacity duration-500`}
        src="/images2/motion_sky4.gif"
        alt="motion_moon"
      />

 

요약

absolute을 사용하면 다돌아가던것이 왜인지 안돌아갑니다.

개발환경은 next.js tailwind 입니다.(취업못하고 공부용입니다.)

 

전체코드는 다음과같습니다

"use client";
import React, { useRef, useEffect, useState } from "react";
import motion_sky1 from "@/../../public/images2/motion_sky1.gif";

function Page() {
  const [scrollPercent, setScrollPercent] = useState(0);
  const scrollBody = useRef(null);
  console.log(scrollPercent);
  useEffect(() => {
    const handleScroll = () => {
      const scrollRealHeight =
        document.documentElement.scrollHeight - window.innerHeight;
      const scrollTop = window.scrollY;
      const percentScroll = Math.round((scrollTop / scrollRealHeight) * 100);
      setScrollPercent(percentScroll);
    };

    window.addEventListener("scroll", handleScroll);

    return () => {
      window.removeEventListener("scroll", handleScroll);
    };
  }, []);

  return (
    <div ref={scrollBody} className="relative  left-0 top-0 h-6000 w-full ">
      <div>내용</div>

      {/* <img
        className={`${
          scrollPercent < 25 ? "opacity-100 " : "opacity-0 "
        }block absolute   h-full bg-black transition-opacity duration-500 `}
        src="/images2/motion_sky1.gif"
        alt="motion_moon"
      />
      <img
        className={`${
          scrollPercent >= 25 && scrollPercent < 50
            ? "opacity-100 "
            : "opacity-0 "
        } block absolute  h-full bg-teal-500 transition-opacity duration-500`}
        src="/images2/motion_sky2.gif"
        alt="motion_moon"
      />
      <img
        className={`${
          scrollPercent >= 50 && scrollPercent < 75
            ? "opacity-100 "
            : "opacity-0  "
        }block  absolute h-full bg-red-400 transition-opacity duration-500`}
        src="/images2/motion_sky3.gif"
        alt="motion_moon"
      />
      <img
        className={`${
          scrollPercent >= 75 && scrollPercent < 102
            ? "opacity-100 "
            : "opacity-0  "
        }block  absolute h-full bg-blue-500 transition-opacity duration-500`}
        src="/images2/motion_sky4.gif"
        alt="motion_moon"
      /> */}

      <div
        className={`${
          scrollPercent < 25 ? "opacity-100 " : "opacity-0 "
        }block absolute  Fixed z-50 h-full bg-sky1 transition-opacity duration-500 `}
      ></div>
      <div
        className={`${
          scrollPercent >= 25 && scrollPercent < 50
            ? "opacity-100 "
            : "opacity-0 "
        } block absolute  h-full bg-sky2 transition-opacity duration-500`}
      ></div>
      <div
        className={`${
          scrollPercent >= 50 && scrollPercent < 75
            ? "opacity-100 "
            : "opacity-0  "
        }block  absolute h-full bg-red-400 transition-opacity duration-500`}
      ></div>
      <div
        className={`${
          scrollPercent >= 75 && scrollPercent < 102
            ? "opacity-100 "
            : "opacity-0  "
        }block  absolute h-full bg-blue-500 transition-opacity duration-500`}
      ></div>

      <div className="motion_ggang">
        <figure className="ch_body">
          {/* 몸 */}
          <img
            className="fixed h-40 w-32 top-12 left-7"
            src="/images2/motion_body2.png"
            alt="motion_body2"
          />
        </figure>
        {/* 손 */}
        <figure className="ch_hand_right">
          <img
            className="fixed h-40 w-32 top-12 left-7"
            src="/images2/motion_hand_right.png"
            alt="motion_hand_right"
          />
        </figure>
      </div>
      {/* 달 */}
      <figure className="motion_moon">
        <img
          className="fixed h-40 w-32 top-12 right-3"
          src="/images2/motion_moon.png"
          alt="motion_moon"
        />
      </figure>
    </div>
  );
}

export default Page;

 

답변 3

0

기쁜 도미님의 프로필 이미지
기쁜 도미
질문자

감사합니다 알고보니 width 를인식이 안돼서 문제가생겼네요 absolute가안돼서 fixed 로 변경했는데 부모뷰가 전체뷰라서 둘다정상작동하네요.

"use client";
import React, { useRef, useEffect, useState } from "react";
import motion_sky1 from "@/../../public/images2/motion_sky1.gif";

function Page() {
  const [scrollPercent, setScrollPercent] = useState(0);
  const scrollBody = useRef(null);
  console.log(scrollPercent);
  useEffect(() => {
    const handleScroll = () => {
      const scrollRealHeight =
        document.documentElement.scrollHeight - window.innerHeight;
      const scrollTop = window.scrollY;
      const percentScroll = Math.round((scrollTop / scrollRealHeight) * 100);
      setScrollPercent(percentScroll);
    };

    window.addEventListener("scroll", handleScroll);

    return () => {
      window.removeEventListener("scroll", handleScroll);
    };
  }, []);

  return (
    <div ref={scrollBody} className="relative  left-0 top-0 h-6000 w-full ">
      <div>내용</div>


      <div
        className={`${
          scrollPercent < 25 ? "opacity-100 " : "opacity-0 "
        }  top-0 left-0 absolute h-6000 w-full bg-black transition-opacity duration-500 `}
      ></div>
      <div
        className={`${
          scrollPercent >= 25 && scrollPercent < 50
            ? "opacity-100 "
            : "opacity-0 "
        }  absolute top-0 left-0 h-6000 w-full bg-blue-400 transition-opacity duration-500`}
      ></div>
      <div
        className={`${
          scrollPercent >= 50 && scrollPercent < 75
            ? "opacity-100 "
            : "opacity-0  "
        }  absolute h-6000 top-0 left-0 w-full bg-red-400 transition-opacity duration-500`}
      ></div>
      <div
        className={`${
          scrollPercent >= 75 && scrollPercent < 102
            ? "opacity-100 "
            : "opacity-0  "
        }  absolute h-6000 top-0 left-0 w-full bg-yellow-500 transition-opacity duration-500`}
      ></div>

      <div className="motion_ggang">
        <figure className="ch_body">
          {/* 몸 */}
          <div className="bg-blue-600 fixed h-40 w-32 top-12 left-7"></div>
        </figure>
        {/* 손 */}
        <figure className="ch_hand_right">
          <div className="bg-red-600  fixed h-40 w-32 top-12 left-14"></div>
        </figure>
      </div>
      {/* 달 */}
      <figure className="motion_moon">
        <div className="bg-yellow-600 fixed h-40 w-32 top-12 right-3"></div>
      </figure>
    </div>
  );
}

export default Page;

 

0

깡코딩님의 프로필 이미지
깡코딩
지식공유자

안녕하세요~! 먼저 해당 수업 자료를 다른곳에 올리면 안 됩니다~!

그리고 수업 외 다른 라이브러리를 사용한 질문은 받지 않습니다.

또한 말씀 하신 질문 내용이 이해하기가 조금 힘든데요

제가 이해한 바로는 background-attachment: fixed; 를 사용하고 싶다는 말씀인가요?

해당 수업에서는 이미지를 fixed화면에 고정해두고 Javascript로 위치를 이동시키는 방식으로 구현되어 있습니다.

따라서 fixed를 absolute로 변경하면 화면에 고정된게 아니라 부모 엘리먼트 기준으로 위치가 정해지기 때문에

absolute로 변경하면 제대로 작동하지 않을겁니다.

또한 background-attachment: fixed; 로 구현이 가능하다면 background-attachment: fixed; 를 이용해 구현해도 무방합니다.

코드를 작성할 때 정해진 건 없습니다. 본인이 생각하는대로 작성해 나가며 문제를 해결하는게 코딩의 재미 아닐까 하는 생각이 드네요~!

마지막으로 수강생님의 질문을 정확히 이해한건지 잘 모르겠지만 제가 생각한게 맞다면 css기초가 부족해 보입니다. css기초 부분을 다시한번 학습해 보시면 도움이 될 것 같아요 :)

absolute, fixed 등의 정확한 차이점을 다시 한번 학습해 보시면 좋을 것 같습니다.

 

 

 

0

기쁜 도미님의 프로필 이미지
기쁜 도미
질문자

혹시 okky 인가 거기다가 질문해봐도됄까요?

기쁜 도미님의 프로필 이미지
기쁜 도미

작성한 질문수

질문하기