inflearn logo
강의

Khóa học

Chia sẻ kiến thức

Bản sao tương tác trang web của Apple!

Áp dụng hoạt ảnh cuộn thời gian cụ thể

특정 타이밍 스크롤 애니메이션 적용하기 섹션 수강중입니다.

455

woojae sim

1 câu hỏi đã được viết

0

초반부 messageA_opacity_in 을 콘솔로 찍었는데요,

partScrollStart보다 currentYOffset이 작을때는

rv에 values[0] 즉 '0'을 리턴해야하는데,

그러지 않고 -1부터 0까지 쭉 커지다가 css가 적용되는 구간부터 1로 점점 커집니다...

const sceneInfo = [
    {
      //0
      type:'sticky',
      heightNum:5,//브라우저 높이의 배수 세팅
      scrollHeight:0, //각 씬의 스크롤 높이
      objs:{
        container: document.querySelector('#scroll-section-0'),
        messageA: document.querySelector('#scroll-section-0 .main-message.a'),
        messageB: document.querySelector('#scroll-section-0 .main-message.b'),
        messageC: document.querySelector('#scroll-section-0 .main-message.c'),
        messageD: document.querySelector('#scroll-section-0 .main-message.d')
      },
      values:{
        messageA_opacity: [0, 1, { start: 0.1, end: 0.2}],
        messageB_opacity: [0, 1, { start: 0.3, end: 0.4}]
      }
    },
    {
      //1
      type:'normal',
      heightNum:5,//브라우저 높이의 배수 세팅
      scrollHeight:0, //각 씬의 스크롤 높이
      objs:{
        container: document.querySelector('#scroll-section-1')
      }
    },
    {
      //2
      type:'sticky',
      heightNum:5,//브라우저 높이의 배수 세팅
      scrollHeight:0, //각 씬의 스크롤 높이
      objs:{
        container: document.querySelector('#scroll-section-2')
      }
    },
    { 
      //3
      type:'sticky',
      heightNum:5,//브라우저 높이의 배수 세팅
      scrollHeight:0, //각 씬의 스크롤 높이
      objs:{
        container: document.querySelector('#scroll-section-3')
      }
    }
  ];
function calcValues(values, currentYOffset){
    let rv;
    const scrollHeight = sceneInfo[currentScene].scrollHeight
    const scrollRatio = currentYOffset / scrollHeight
    if(values.length === 3){
      // start ~ end 사이의 애니메이션 실행
      const partScrollStart = values[2].start * scrollHeight;
      const partScrollEnd = values[2].end * scrollHeight;
      const partScrollHeight = partScrollEnd - partScrollStart;

      if(currentYOffset => partScrollStart && currentYOffset <= partScrollEnd){
        rv = (currentYOffset - partScrollStart) / partScrollHeight * (values[1] - values[0]) + values[0];
      } else if (currentYOffset < partScrollStart){
        rv = values[0];
      } else if (currentYOffset > partScrollEnd){
        rv = values[1];
      }
    } else {
      rv = scrollRatio * (values[1] - values[0]) + values[0];
    }
    

    return rv;
  }

  function playAnimation(){
    const objs = sceneInfo[currentScene].objs;
    const values = sceneInfo[currentScene].values;
    const currentYOffset = yOffset - prevScrollHeight;
    
    switch (currentScene){
      case 0:
        let messageA_opacity_in = calcValues(values.messageA_opacity, currentYOffset)
        objs.messageA.style.opacity = messageA_opacity_in
        console.log(messageA_opacity_in)    
        break;
      case 1:
        break;
      case 2:
        break;
      case 3:
        break;
    }
  }
  

도와주세요 ㅠ

 

 

HTML/CSS javascript 웹-디자인 svg 인터랙티브-웹 클론코딩

Câu trả lời 2

1

communityai8509

안녕하세요 Woojae Sim님, 인프런 AI 인턴이에요.

현재 코드를 살펴보니, calcValues 함수에서 문제가 발생한 것 같습니다.

현재 코드에서는 부등호(>=<=)의 순서를 잘못 작성하셨습니다.

현재 코드: if(currentYOffset => partScrollStart && currentYOffset <= partScrollEnd)

수정된 코드: if(currentYOffset >= partScrollStart && currentYOffset <= partScrollEnd)

정확한 비교 연산을 위해, >= 연산자를 사용하여 비교해야 합니다. 수정 후에 다시 확인해보시면 제대로 작동할 것입니다.

수정된 코드:

if(currentYOffset >= partScrollStart && currentYOffset <= partScrollEnd){
  rv = (currentYOffset - partScrollStart) / partScrollHeight * (values[1] - values[0]) + values[0];
} else if (currentYOffset < partScrollStart){
  rv = values[0];
} else if (currentYOffset > partScrollEnd){
  rv = values[1];
}

이렇게 수정하고 코드를 실행해보세요. 원하시는 결과를 얻을 수 있을 것입니다. 추가로 질문이 있으면 언제든지 물어보세요!

0

studiomeal

AI인턴님 이야기대로 중간에

if(currentYOffset => partScrollStart && currentYOffset <= partScrollEnd)

이 부분에 >=를 =>로 잘못쓰셔서 그런게 아닐까 싶습니다!

이미지 배경 문의

0

67

1

[크로스브라우징] safari에서 동영상 영역 미노출

0

107

1

항상 궁금했는데 크림슨 컬러 선택하셨을때 활용했던 사이트 좀 알려주세요~

0

109

2

vue강의는안하시나요?!

0

101

1

스크롤 속도에 따른 messageA_opacity_out

0

116

1

drawImage(objs.videoImages[sequence], 0, 0); error

0

89

1

선생님 캔버스 width 크기는 이미지 크기에맞게 해줘야하나요?

0

127

0

선생님 안녕하세요. 혹시 메인개발(?)분야가 뭔지 궁금합니다.

0

207

1

React에서 load 상태를 어떻게 감지할 수 있을까요?

0

681

1

[섹션7-3: 버그수정 2] tempYOffset 오류

0

195

1

스크롤할 때 캔버스로 하신 이유가 있으신가요? 그냥 성능 떄문에 캔버스로 하신건가요?

0

313

2

게속 오류떠서 글 작성해봐요....

0

506

2

Vanilla JavaScript로 SPA 만드는 자료 혹은 선택 기준을 추천해주실 수 있으신가요?

1

488

1

[#svg, #이미지프레임과 텍스트 싱크] 스크롤 값에 움직이는 svg path, 이미지프레임과 텍스트 싱크 맞추는 것, 2가지 질문이 있습니다.

0

451

2

페이지가 처음 로딩 되었을 때 애니메이션 처리가 되지 않는 느낌입니다

0

432

1

섹션2 번째, opacity=0 되지 않고 잔상이 남습니다.

0

533

1

원래 쿼리셀렉터에서는 띄워쓰기 하면안되나요?

0

593

2

라이브러리 질문

1

412

2

translateY대신 애플에서 사용한 것 처럼 matrix로 scale의 크기를 주려고 하는데

0

409

1

[스크롤 높이 세팅] scrollHeight값이 3990아닌 4645로만 나오는데 뭐가 문제일까요? ㅠㅠ

0

598

2

scrollLoop 함수 질문

0

476

2

도메인 웹호스팅시 이미지가 안 뜨는데 누가 좀 알려주세요ㅠㅜ

0

1235

2

load 이벤트시 첫 비디오 이미지가 뜨네요.

0

506

2

마지막 강의 js파일로 바꿀 시 스크롤 프레임 렉? 버벅임?

0

1022

2