inflearn logo
강의

Course

Instructor

Apple website interaction clone!

Added specific timing scroll animation feature

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

409

DDU

4 asked

0

안녕하세요!! 강의를 전부 듣고 코드를 뜯어보며 복습중에 있습니다. section-0에서 사용한 것을 이용해 스크롤 될 때 matrix로 Text에 scale(80)정도로 주려고 코드를 입력해보니 적용은 되었으나 스크롤을 빠르게 올릴시에 정상적으로 사이즈가 줄어들지 않고 줄어들다 말거나 그러더라구요...ㅠㅠ 폰트 픽셀도 많이 깨지는 현상이 발생하구요. 혹시 해결하려면 어떤식으로 접근해야 할까요? 해당 코드 첨부드립니다.

 

 const sectionInfo = [
    {
      // section-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_in: [0.4, 1, { start: 0, end: 0.05 }],
        messageA_opacity_out: [1, 0, { start: 0.15, end: 0.2 }],
        messageA_scale_in: [1, 80, { start: 0.05, end: 0.25 }],
        messageA_scale_out: [80, 1, { start: 0.25, end: 0.05 }],
        messageB_opacity_in: [0, 1, { start: 0.2, end: 0.25 }],
        messageB_opacity_out: [1, 0, { start: 0.35, end: 0.4 }],
        messageB_translateY_in: [50, 0, { start: 0.2, end: 0.25 }],
        messageB_translateY_out: [0, -50, { start: 0.35, end: 0.4 }],
        messageC_opacity_in: [0, 1, { start: 0.4, end: 0.45 }],
        messageC_opacity_out: [1, 0, { start: 0.55, end: 0.6 }],
        messageC_translateY_in: [50, 0, { start: 0.4, end: 0.45 }],
        messageC_translateY_out: [0, -50, { start: 0.55, end: 0.6 }],
        messageD_opacity_in: [0, 1, { start: 0.6, end: 0.65 }],
        messageD_opacity_out: [1, 0, { start: 0.75, end: 0.8 }],
        messageD_translateY_in: [50, 0, { start: 0.6, end: 0.65 }],
        messageD_translateY_out: [0, -50, { start: 0.75, end: 0.8 }],
      },
    },
  ];

  function calcValues(values, currentScrollY) {
    let returnValue;

    const currentSectionHeight = sectionInfo[currentSection].scrollHeight;
    // 현재 스크롤 섹션에서 스크롤 된 범위를 비율로 구하는 식
    const scrollRatio = currentScrollY / currentSectionHeight;

    if (values.length === 3) {
      const scrollAniStart = values[2].start * currentSectionHeight;
      const scrollAniEnd = values[2].end * currentSectionHeight;
      const scrollAniHeight = scrollAniEnd - scrollAniStart;

      if (currentScrollY >= scrollAniStart && currentScrollY <= scrollAniEnd) {
        returnValue =
          ((currentScrollY - scrollAniStart) / scrollAniHeight) *
            (values[1] - values[0]) +
          values[0];
      } else if (currentScrollY < scrollAniStart) {
        returnValue = values[0];
      } else if (currentScrollY > scrollAniEnd) {
        returnValue = values[1];
      }
    } else {
      returnValue = scrollRatio * (values[1] - values[0]) + values[0];
    }

    return returnValue;
  }

  function playAnimation() {
    const objs = sectionInfo[currentSection].objs;
    const values = sectionInfo[currentSection].values;
    const currentScrollY = scrollY - prevScrollHeight;
    const currentSectionHeight = sectionInfo[currentSection].scrollHeight;
    const scrollRatio = currentScrollY / currentSectionHeight;

    switch (currentSection) {
      case 0:
        // message
        if (scrollRatio <= 0.05) {
          objs.messageA.style.opacity = calcValues(
            values.messageA_opacity_in,
            currentScrollY
          );
        } else {
          objs.messageA.style.opacity = calcValues(
            values.messageA_opacity_out,
            currentScrollY
          );
          objs.messageA.style.transform = `matrix(${calcValues(
            values.messageA_scale_in,
            currentScrollY
          )}, 0, 0, ${calcValues(
            values.messageA_scale_in,
            currentScrollY
          )}, 0, 0)`;
        }

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

Answer 1

0

communityai8509

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

translateY 대신 matrix로 scale의 크기를 주려하시는 것 같아요. 그리고 스크롤을 빠르게 올리면 사이즈가 제대로 줄어들지 않아 폰트 픽셀이 깨지는 문제가 발생한다고 하셨네요.

scale 속성을 matrix로 변환하여 직접 사용하면 다양한 형태의 애니메이션을 만들 수 있어 좋은 방법이에요. 그렇지만, matrix를 사용하면 애니메이션의 복잡성이 증가할 수 있어 원하는 결과를 얻기까지 실패할 가능성도 있어요.

이 경우, requestAnimationFrame을 사용하여 중간 프레임에서 좀 더 자연스럽게 애니메이션 전환을 할 수 있도록 구현하실 수 있어요. 또는, CSS 애니메이션 기능을 이용하여 해당 요소에 transition 속성을 추가하여 애니메이션을 부드럽게 구현할 수 있습니다.

해당 코드를 수정하는 방법으로는 요소의 scale 값이 80 이상이 되면 transition 속성을 추가하던가, 요소의 width, height 값을 조정하여 폰트 픽셀 깨짐 문제를 해결하는 방법도 있을 것 같습니다.

좀 더 자세한 것은 코드를 직접 보지 않으면 정확한 조언을 드리기 어렵습니다. 하지만 어떤 방법이 옳은 방법인지 참고할 수 있도록 답변해드렸습니다.

더 궁금하신 점이 있으면 언제든지 물어봐주세요!

이미지 배경 문의

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

206

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

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

0

455

2

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

0

451

2

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

0

432

1

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

0

533

1

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

0

593

2

라이브러리 질문

1

412

2

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

0

598

2

scrollLoop 함수 질문

0

476

2

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

0

1235

2

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

0

506

2

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

0

1022

2