해결된 질문
23.06.23 03:04 작성
·
324
·
수정됨
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
2023. 06. 23. 19:04
감사합니다 알고보니 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
2023. 06. 23. 10:42
안녕하세요~! 먼저 해당 수업 자료를 다른곳에 올리면 안 됩니다~!
그리고 수업 외 다른 라이브러리를 사용한 질문은 받지 않습니다.
또한 말씀 하신 질문 내용이 이해하기가 조금 힘든데요
제가 이해한 바로는 background-attachment: fixed; 를 사용하고 싶다는 말씀인가요?
해당 수업에서는 이미지를 fixed로 화면에 고정해두고 Javascript로 위치를 이동시키는 방식으로 구현되어 있습니다.
따라서 fixed를 absolute로 변경하면 화면에 고정된게 아니라 부모 엘리먼트 기준으로 위치가 정해지기 때문에
absolute로 변경하면 제대로 작동하지 않을겁니다.
또한 background-attachment: fixed; 로 구현이 가능하다면 background-attachment: fixed; 를 이용해 구현해도 무방합니다.
코드를 작성할 때 정해진 건 없습니다. 본인이 생각하는대로 작성해 나가며 문제를 해결하는게 코딩의 재미 아닐까 하는 생각이 드네요~!
마지막으로 수강생님의 질문을 정확히 이해한건지 잘 모르겠지만 제가 생각한게 맞다면 css기초가 부족해 보입니다. css기초 부분을 다시한번 학습해 보시면 도움이 될 것 같아요 :)
absolute, fixed 등의 정확한 차이점을 다시 한번 학습해 보시면 좋을 것 같습니다.
0