Skip to content
Home » Html 스크롤 애니메이션 | 자바스크립트로 8분만에 신박한 Svg 스크롤 애니메이션 마스터하기 25017 명이 이 답변을 좋아했습니다

Html 스크롤 애니메이션 | 자바스크립트로 8분만에 신박한 Svg 스크롤 애니메이션 마스터하기 25017 명이 이 답변을 좋아했습니다

당신은 주제를 찾고 있습니까 “html 스크롤 애니메이션 – 자바스크립트로 8분만에 신박한 svg 스크롤 애니메이션 마스터하기“? 다음 카테고리의 웹사이트 https://hu.taphoamini.com 에서 귀하의 모든 질문에 답변해 드립니다: https://hu.taphoamini.com/photos/. 바로 아래에서 답을 찾을 수 있습니다. 작성자 맛있는 코딩 yummy coding 이(가) 작성한 기사에는 조회수 3,245회 및 좋아요 180개 개의 좋아요가 있습니다.

Table of Contents

html 스크롤 애니메이션 주제에 대한 동영상 보기

여기에서 이 주제에 대한 비디오를 시청하십시오. 주의 깊게 살펴보고 읽고 있는 내용에 대한 피드백을 제공하세요!

d여기에서 자바스크립트로 8분만에 신박한 svg 스크롤 애니메이션 마스터하기 – html 스크롤 애니메이션 주제에 대한 세부정보를 참조하세요

프론트 엔드가 꼭 알아두어야 할 기술 스텍 네번째 시리즈!
자바스크립트와 svg를 이용해서 간단하게 마우스로 웹페이지를 스크롤할 때 마치 연필로 그리듯 svg path를 스크롤 위치에 따라 그려주는 svg 스크롤 애니메이션에 관한 영상입니다.
이를 활용하면 나를 어필할 수 있는 포트폴리오 웹사이트나 다른 회사 등의 페이지를 한 줄의 시간의 흐름의 스토리텔링 형식으로 응용할 수 있는데요
다양한 곳에서 쓸 수 있는 멋진 효과 위주로 다루는 네번 째 영상입니다.
많은 관심과 사랑 부탁드리겠습니다 🙂
코드펜 작업물 체험링크: https://codepen.io/rudtjd2548/details/XWVKJmZ
관련 사이트 링크: https://dashgo.com/
Git 소스코드: https://github.com/rudtjd2548/yummy-coding/tree/master/04.%20svg-scroll-animation
#자바스크립트 #CSS #SVG #스크롤 애니메이션 #frontend #html #프론트엔드 #scroll animation

html 스크롤 애니메이션 주제에 대한 자세한 내용은 여기를 참조하세요.

[javascript] 스크롤에 따라 부드러운 애니메이션 구현하기

코드도 함께 나와있습니다. 아마 컴퓨터로 보는 게 더 잘 보일거예요. HTML; SCSS; JS. Result; Skip Results Iframe.

+ 더 읽기

Source: elvanov.com

Date Published: 6/28/2021

View: 3998

순수 JavaScript + CSS 스크롤 애니메이션 (샘플 코드) – 수아뎁

순수 JavaScript와 CSS로 작성되었습니다. 웹 페이지에서 아래로 스크롤하면, 정해진 타이밍에 HTML 요소가 서서히 나타나는 ‘페이드 인’ 효과는 요즈음 …

+ 여기를 클릭

Source: joshua-dev-story.blogspot.com

Date Published: 2/19/2021

View: 7790

67 Scroll Animation Design Inspiration – CodeMyUI

Handpicked collection of scroll animation design inspiration. ✓ GIF preview ✓ HTML CSS copy paste code.

+ 여기에 자세히 보기

Source: codemyui.com

Date Published: 4/21/2021

View: 5567

페이지 스크롤 다운 애니메이션 (feat. Animation of scroll)

css는 head태그 안에 script는 body태그 끝나기 전에 선언해주어야 하니 아래 처럼 넣어주도록 하겠습니다.  …

+ 여기에 자세히 보기

Source: twojobui.tistory.com

Date Published: 12/9/2021

View: 8563

Psd To Html 31 [ Scroll Based Animation Part 3/6 ] 효율적으로 …

주제를 살펴보자 “css 스크롤 – PSD TO HTML 31 [ Scroll Based Animation part 3/6 ] 효율적으로 CSS ANIMATION 작성하기, 스크롤 애니메이션, …

+ 여기에 더 보기

Source: ko.nataviguides.com

Date Published: 11/21/2022

View: 2229

[AOS] 스크롤 애니메이션 사용법 – Animate On Scroll

시간 투자 대비 가성비는 모든 스크롤 애니메이션 라이브러리 중 최고 라고 평가 받는다. … HTML; CSS; JS. Result; Skip Results Iframe.

+ 여기에 자세히 보기

Source: inpa.tistory.com

Date Published: 7/15/2021

View: 2634

주제와 관련된 이미지 html 스크롤 애니메이션

주제와 관련된 더 많은 사진을 참조하십시오 자바스크립트로 8분만에 신박한 svg 스크롤 애니메이션 마스터하기. 댓글에서 더 많은 관련 이미지를 보거나 필요한 경우 더 많은 관련 기사를 볼 수 있습니다.

자바스크립트로 8분만에 신박한 svg 스크롤 애니메이션 마스터하기
자바스크립트로 8분만에 신박한 svg 스크롤 애니메이션 마스터하기

주제에 대한 기사 평가 html 스크롤 애니메이션

  • Author: 맛있는 코딩 yummy coding
  • Views: 조회수 3,245회
  • Likes: 좋아요 180개
  • Date Published: 2022. 3. 20.
  • Video Url link: https://www.youtube.com/watch?v=dxOmU_1n7wc

[javascript] 스크롤에 따라 부드러운 애니메이션 구현하기 – Under The Pencil

들어가기 전에

영감을 받은 사이트는 애플의 iPhone SE 를 소개하는 페이지였습니다. 저 부드러운 텍스트를 꼭 구현해보고 싶다!! 그런 생각을 했습니다. 하지만 정확한 스크롤 위치에 따른 부드러운 애니메이션을 구현하는 라이브러리는 찾기가 힘들었지요. 스크롤 애니메이션과 관련된 것들은 스크롤 하면서 콘텐츠가 화면상에 나타날 때 부드럽게 서서히 나타나도록 하는 애니메이션(AOS)이 주를 이루었지만 그게 원하는 것은 아니었지요. 그래서 직접 만들기로 했습니다.

본 글은 vue 나 다른 라이브러리 등을 사용하기는 하지만, 깊게 이용하지는 않습니다. 그러므로 CSS와 자바스크립트에 대한 이해만 있다면 크게 어렵지 않으리라 생각합니다. 또한 본 글은 튜토리얼 성격이 아닙니다. 결과물은 최적화할 여지가 충분히 많은 코드입니다. 이 코드의 특징과 한계를 이 글 내내 계속해서 말씀드리니까 그냥 아, 이 사람은 이렇게 구현했구나 정도로 참고 삼아 봐주시면 감사하겠습니다.

결과물

한국인의 특징은 빨리빨리 이므로 결과적으로 이게 뭐가 되냐? 라는 걸 먼저 보여드립니다. 코드도 함께 나와있습니다. 아마 컴퓨터로 보는 게 더 잘 보일거예요.

CodePen Embed Fallback

설계

고려해야 할 것

우선 고려해야 할 것들을 정리해봅시다.

우선 요소들은 현재 배치된 상대적인 위치가 아니라 절대적으로 정해진 위치, 즉 스크롤 높이에 따라서 애니메이션이 시작되고 진행되고 멈춰야 했습니다. 특정 요소가 화면 상에 나타나는지의 여부는 전혀 중요하지 않았으므로 Intersection Observer API 와 같은 기술은 전혀 고려사항이 아니었습니다.

또한 스크롤 위치가 바뀔 때마다 애니메이션이 진행되어야 했으므로 브라우저의 scroll 이벤트를 활용해야 했습니다. scroll 이벤트는 짧은 시간에 아주 많이 발생되는 이벤트이므로 성능과 관련된 부분을 신경써야 했습니다.

애니메이션이 가능한 요소들은 기본적으로 화면의 가운데를 기준으로 두어 움직여야 했습니다. 절대적인 위치를 잡아버리면 기기마다 화면의 크기가 다름으로 인해서 애니메이션이 시작되고 끝날 때 의도된 위치에서 한참 벗어날 가능성이 있었습니다. 그래서 애니메이션을 정의할 때에는 정확한 x, y ( top , left ) 값이 아닌 중심으로부터 떨어진 거리( translateY 등)로 설정하도록 했습니다.

마지막으로 애니메이션은 부드럽게 보여야 했습니다. 사실 이를 위해 직접 코드를 짜겠다 발벗고 나선 거니까요. 어떤 요소가 나타나거나 없어질 때에는 빠르게 움직이다가 애니메이션의 중간 단계에서는 천천히 움직이는 등의 속도 조절이 필요했습니다. 이를 위해서 조금만 더 생각해봅시다. 어떤 애니메이션의 진행률은 그 스크롤 높이 변화에 따라 정비례하는 관계를 가지고 있을 겁니다. 즉 linear 하게 애니메이션이 진행될 수 밖에 없습니다. 이를 부드럽게 바뀌도록 하기 위한 장치가 필요합니다. 그 장치는 바로 easing function 이 될 겁니다. 아래 표는 완성된 애니메이션에서 실제로 적용한 bezierEasing(0, 0.7, 1, 0.3); 함수가 0(0%) ~ 1(100%) 사이에서 그 결과값이 어떻게 변하는지에 관한 표와 그림입니다.

진행률 변형된 진행률 0% 0% 10% 30.1% 20% 38.3% 30% 43.3% 40% 47.0% 50% 50.0% 60% 53.0% 70% 56.7% 80% 61.7% 90% 70.0% 100% 100% 애니메이션을 부드럽게 만들기 위해 진행률을 변형시키기

linear 애니메이션 (파란색 빈 원)과 easing 이 적용된 애니메이션 ( 노란색 작은 원)

뭐 표를 봐도 감이 잘 안오시죠? 실제 애니메이션(Preview & compare – Go 를 클릭하면 애니메이션을 확인할 수 있습니다)을 보면서 어떤지 감을 익히시면 좋을 것 같습니다. 대충 원래의 진행률과 달리 변형된 진행률에는 50%에서 부드럽게 움직이고, 0%와 100%에서 급격하게 움직인다는 것을 확인할 수 있습니다. 이렇게 이상하게 움직이는 Easing Function 이 있는가 하면, 우리가 css animation 에서 일상적으로 사용하는 ease, ease-in, ease-out 등으로 이름 붙여져 있는 것들도 모두 Easing Function 이 될 것입니다. 이에 관한 더 자세한 이야기는 K. Joon Cho 님의 Easing Function 글을 보면 더 좋을 것 같네요.

성능 이슈

앞서 말했듯이 scroll 이벤트를 사용하려면 성능을 신경써야 합니다. 성능과 관련된 이슈는 다음과 같이 처리하려고 했습니다.

웹 퍼포먼스 – Reflow / Layout Shift 최소화하기 글(영문)에 따르면, 변경이 자주 일어나는 요소에 position: absolute 적용을 고려해보라고 합니다. 그래서 그렇게 했습니다.

적용을 고려해보라고 합니다. 그래서 그렇게 했습니다. 애니메이션이 활성화된 요소와 그렇지 않은 요소를 구별하여, 활성화되지 않은 요소에게는 display: none 처리를 하고 별도의 연산을 없애 성능 최적화를 꾀했습니다.

처리를 하고 별도의 연산을 없애 성능 최적화를 꾀했습니다. 최소한의 성능을 신경쓰고자 jQuery 와 같은 DOM 라이브러리를 가급적 사용하지 않았습니다.

쓰로틀링과 디바운싱은 고려하지 않았습니다. 성능을 생각한다면 충분히 고려해볼만하나, 더 이상 머리가 돌아가지 않아 포기했습니다.

아무리 최적화해도 모바일에서는 부드러운 애니메이션을 위한 최소한의 연산 자체가 버거운 경우가 많습니다.

Map 을 쓰는 게 좋은 환경이라면 Map을 쓸 수 있도록 합시다. (JavaScript ES6 Map vs Object Performance 비교 글 참조)

설계를 하지 않은 것

우선순위가 별로 중요하지 않거나 시간상 충분히 고려하지 못한 점은 다음과 같습니다.

작성한 코드는 애니메이션의 수정이 편리하지 않습니다.

디바이스 화면의 크기에 따라 애니메이션이 다르게 보일 수 있습니다. 왜냐하면 애니메이션 기준점에 대한 생각을 깊이 못했기 때문입니다. 일단 작성된 코드는 기준이 화면의 가운데입니다.

애니메이션 원리

우선 애니메이션을 정리하기 전에 CSS 의 position: sticky 속성을 주목합시다. 여기서는 sticky 에 대한 자세한 설명은 하지 않을게요. 인터넷을 찾아보면 많이 나오니깐요. 레진 기술 블로그를 참조해도 좋을 것 같습니다.

대략적인 HTML 구조

크게 4개의 요소가 있습니다.

Sticky Container 요소입니다. 가장 바깥쪽에 위치합니다. 이 요소의 역할은 자식으로 가질 Sticky 요소가 자유롭게 뛰어 놀 공간을 부여해주는 겁니다. 위 그림에서는 position 속성이 relative 라고 했는데, 전혀 필요없는 부분입니다. 처음엔 sticky 요소가 작동이 될 때 offset 기준이 해당 요소와 가장 가까운 relative / absolute 부모인 줄 알았는데, 그게 아니라 가장 가까운 스크롤되는(scrollable) 부모였습니다. 두둥! 하여튼 이 요소에는 스크롤을 가장 아래로 내렸을 때에 모든 애니메이션이 딱 맞게 완료되도록 height 를 충분한 값으로 설정해줍니다. Sticky 요소를 끝내고 새로운 Sticky 요소가 시작되려고 하면 이 Sticky Container 를 여러 개 만들어 사용하면 됩니다.

속성이 라고 했는데, 전혀 필요없는 부분입니다. 처음엔 요소가 작동이 될 때 offset 기준이 해당 요소와 가장 가까운 / 부모인 줄 알았는데, 그게 아니라 가장 가까운 스크롤되는(scrollable) 부모였습니다. 두둥! 하여튼 이 요소에는 스크롤을 가장 아래로 내렸을 때에 모든 애니메이션이 딱 맞게 완료되도록 를 충분한 값으로 설정해줍니다. Sticky 요소를 끝내고 새로운 Sticky 요소가 시작되려고 하면 이 Sticky Container 를 여러 개 만들어 사용하면 됩니다. Sticky 요소입니다. position 속성은 sticky 값을 갖습니다. 화면에 딱 맞게 하기 위해 height 는 100vh 로 설정하고, top 오프셋을 0 으로 설정합니다. top 과 같은 기준점이 없다면 sticky 요소는 올바르게 동작하지 않습니다.

속성은 값을 갖습니다. 화면에 딱 맞게 하기 위해 는 로 설정하고, 오프셋을 으로 설정합니다. 과 같은 기준점이 없다면 sticky 요소는 올바르게 동작하지 않습니다. Slide Container 요소입니다. 자식으로 가질 Slide 요소들의 정렬을 맡습니다. 여기서는 display: flex 를 통해서 자식들의 위치를 조정합니다.

를 통해서 자식들의 위치를 조정합니다. Slide 요소입니다. position 속성은 absolute 값을 갖습니다. 애니메이션의 가장 핵심인 요소입니다. 활성화되거나 비활성화될 때마다 enabled , disabled 클래스 추가/제거를 통해 display 속성을 제어하며, 스크롤 위치에 따라 transform: translate(…) 속성이 변경되어 실제 애니메이션을 보여주는 역할을 가지고 있습니다. Sticky Container 하나에 Sticky 하나, Slide Contianer 하나로 구조를 잡아놨는데 이 Slide 는 position 이 abslute 이므로 여러 개를 두어도 모두 화면 가운데에 위치합니다. 보여주는 순서만 잘 설정하여 Slide 를 여러 개 만들어봅시다.

그렇다면 자바스크립트에서 어떻게 애니메이션을 실시간으로 갱신하도록 할까요?

애니메이션에 필요한 초기 데이터를 세팅합니다. 데이터를 세팅하는 법은 전적으로 여러분에게 달려있습니다. 좀 더 고민을 하여 효율적인 구조를 꾀할 수도 있고, 시간이 부족해서 대충 빠르게 구조를 잡아야 했다면 필자처럼 구조가 나올 수도 있습니다. 어떤 데이터를 세팅하느냐는 아래에서 계속 이야기를 나눠보겠습니다. 먼저 Sticky Container 의 height 를 설정합니다. 모든 애니메이션이 담길 만큼 충분한 스크롤 높이가 필요하므로, 이는 애니메이션을 만들 때마다 수동으로 설정해줄 수도 있고 애니메이션의 양에 따라 동적으로 변화시킬 수도 있겠습니다. 현재 높이를 계산하여 특정 요소(Element)가 활성화될지 말지를 판단합니다. 이를 위해서 특정 요소마다 상한선과 하한선이 필요합니다. 이는 초기 데이터를 세팅할 때 설정하도록 합니다. 활성화되어 있다가 이제 막 비활성화된 요소에게는 위쪽에서 벗어났다면 시작 상태로 되돌리고 아래쪽에서 벗어났다면 끝 상태로 정확하게 설정합니다. 활성화된 요소에 한해 현재 높이에서 특정 애니메이션이 진행중인지 아닌지를 판단합니다. 하나의 요소 안에도 여러 가지의 애니메이션이 들어갈 수 있기 때문에 각 애니메이션마다 상/하한선도 따로 설정해줬습니다. 마찬가지로 초기 데이터를 세팅할 때 설정합니다. 위와 마찬가지로 특정 애니메이션이 진행중이다가 끝나야 하는 상황이라면, 그 위쪽으로 벗어났을 땐 시작점으로 되돌려주고 아래쪽에서 벗어났을 땐 끝나는 값으로 정확하게 설정합니다. 현재 진행중인 애니메이션의 진행률을 계산하고, 더 나아가 Easing Function 으로 변형된 진행률 값을 산출합니다. element.style 로 스타일 객체에 접근하여 변형된 진행률만큼 애니메이션을 적용합니다.

실제 코딩된 것 설명

HTML

HTML 파일을 먼저 살펴봅시다.

안녕하세요.

… 중략

앞서 HTML 구조에 대해 설명할 때 4개의 큰 요소로 나눈 것처럼 sticky-container , sticky , slide-container , slide 4개의 클래스로 요소로 나누었습니다. 가장 안쪽 div 는 스타일링을 위해 그냥 하나 추가한거니 가볍게 패스합시다. 동적으로 높이를 설정하기 위해 DOM 에 접근해야 하니, .sticky-container 요소에 ref 속성을 설정했습니다. 마찬가지로 애니메이션을 적용해야 하는 각 .slice 요소도 ref 속성을 추가했습니다. 이 ref 값을 요소의 id 값처럼 사용할 예정입니다. 만약 vue.js 를 사용하지 않는다면, 각 요소에 ref 속성 대신 id 속성을 넣은 후 추후에 사용하고자 할 때 document.getElementById(‘아이디값’); 등으로 DOM 에 접근할 수 있을 것입니다.

CSS

이제 CSS를 살펴봅시다.

.sticky { position: sticky; top: 0; width: 100%; height: 100vh; } .slide-container { position: relative; display: flex; align-items: center; justify-content: center; width: 100%; height: 100%; } .slide { position: absolute; display: none; z-index: 0; } .slide.enabled { display: block; }

.sticky-contianer 는 특별히 적용할 스타일이 없습니다. 높이는 자바스크립트에서 동적으로 설정됩니다.

.sticky 요소에 대해서 position: sticky 를 적용했습니다. top 과 height 도 화면에 꽉차도록 설정했습니다.

.slide-container 는 하위 항목들을 absolute 로 유지시킬 수 있도록 position: relative 로 설정했습니다. 그리고 flex-box 및 기본 정렬을 설정하여 하위 자식들이 좀 더 편하게 배치하도록 했습니다. 이 요소는 화면에 꽉차있어야 하므로 width: 100% , height: 100% , 로 설정했습니다.

.slide 는 기본적으로 애니메이션의 기본 요소이며, 모든 .slide 는 서로의 영향을 무시한 채 정해진 높이와 오프셋만으로 움직이기 때문에 position 속성을 absolute 로 두었습니다. .slide 는 기본적으로 보이지 않으며 .slide.enabled 여야 화면에 나타납니다. ( display: none → display: block ) .slide 간 화면에 나타나는 순서를 조절하기 위해 z-index 속성을 활용할 수도 있습니다.

Javascript

이제 가장 복잡한 자바스크립트 내용을 체크해봅시다. 우선 세팅 값에 관한 것입니다. 이 값을 담는 변수를 def 로 정하고 작성해봤습니다.

const def = { height: 7100, // 총 높이 elements: { // 애니메이션이 적용될 요소들을 먼저 정리함. sl1: { // ref 이름 top: 500, // 시작점 bottom: 1900, // 끝점 topStyle: { // 해당 요소의 위쪽에서 시작하고자 할 때 초기화되는 스타일 opacity: 0, translateY: -60 // 기본 위치는 중앙이므로 중심에서 떨어진 거리를 뜻하게 됨. (기타 속성들) }, bottomStyle: { // 해당 요소의 아래쪽에서 끝날 때 마무리되는 스타일 opacity: 0, translateY: 60 } }, // 중략, 기타 다른 요소들 }, animations: { sl1: [ // 애니메이션을 적용할 요소. 애니메이션은 여러 개가 될 수 있기 때문에 배열로 처리함. { top: 500, // 이 애니메이션의 시작점 bottom: 1900, // 이 애니메이션의 끝점 easing: midSlow, // 가운데를 느려지게 하는 Easing Function styles: { // 적용할 스타일들 translateY: { // 적용할 스타일 topValue: 60, // 시작점일 때의 값 bottomValue: -60 // 끝점일 때의 값 } } }, { top: 500, // 반복… bottom: 800, easing: ease, styles: { opacity: { topValue: 0, bottomValue: 1 } } }, ], // 중략, 애니메이션을 적용할 다른 요소들을 추가 } }

height : Sticky Contianer 의 높이를 결정해줍니다.

: Sticky Contianer 의 높이를 결정해줍니다. elements : 애니메이션을 적용할 elements 에 관한 내용을 적어줍니다. 애니메이션을 적용할 요소의 ref 이름을 그리고 해당 요소의 상한선과 그에 해당하는 스타일을 설정하고, 하한선도 마찬가지로 설정했습니다.

: 애니메이션을 적용할 elements 에 관한 내용을 적어줍니다. 애니메이션을 적용할 요소의 ref 이름을 그리고 해당 요소의 상한선과 그에 해당하는 스타일을 설정하고, 하한선도 마찬가지로 설정했습니다. aminations : 해당 요소에 적용시킬 애니메이션을 정의합니다. 각 애니메이션에도 상한선과 하한선이 존재하는데, 이 범위가 요소의 상/하한선을 벗어난다면 그냥 자연스레 무시될 것입니다. 왜냐하면 애니메이션보다 요소(Element)에 대한 범위가 먼저 계산되고, 그에 따라 enabled , disabled 로 갈리게 되고, disabled 는 모든 스타일이 초기화된 채로 아무 행동도 하지 않기 때문입니다.

이 사전 세팅 변수의 특징으로는, 모든 높이를 절대 높이 기준으로 했다는 것입니다. 이는 명백한 설계 미스입니다. 왜냐하면 가운데 있는 요소의 높이를 수정하면 그 뒤에 있는 모든 요소의 높이를 그만큼 올리고 낮추고 해줘야 하기 때문입니다. 수가 많지 않은 애니메이션을 다룬다면 조금 수정하고 말고 할 테지만, 수가 점점 많아진다면 일일히 값을 수정하는 노동을 즐겨야 할 수 있습니다. 사전 세팅을 relative 한 값으로 설정해놓고 나중에 실제로 이용할 때 absolute 한 값으로 계산한다면 좀 더 나은 설계가 될 수 있을 거예요.

Map의 읽기 성능은 Object 보다 더 뛰어나다는 평가가 있습니다. 그에 따라 모든 key-value 형태는 Map 으로 하면 좋을 것 같지만, 초기에 작업했던 코드는 모두 Object 기반이어서, 실제 애니메이션 계산 시 가장 먼저 접근하게 되는, 활성화된 요소와 비활성화된 요소를 저장하는 enabled , disabled 변수만 new Map(); 으로 리팩토링 했습니다. 다음 코드를 참조해주세요.

let enabled = new Map(); let disabled = new Map();

그 다음 쉬운 헬퍼 함수들을 먼저 만들어줍니다.

const applyStyle = (element, styleName, value, unit = “px”) => { if (styleName === “translateY”) { // eslint-disable-next-line no-param-reassign element.style.transform = `translateY(${value}${unit})`; return; } if (styleName === “translateX”) { // eslint-disable-next-line no-param-reassign element.style.transform = `translateX(${value}${unit})`; return; } // eslint-disable-next-line no-param-reassign element.style[styleName] = value; };

이 applyStyle 함수는 스타일을 적용하기 쉽도록 도와주는 함수입니다. element 요소의 styleName 스타일에 대해 value 를 적용시키는 간단한 함수입니다. 단위는 unit 을 쓰구요. translateX 혹은 translateY 는 실제로는 스타일 속성의 이름이 아니라 transform 함수 안에 적절히 함수처럼 들어가야 하는 아이이지만, 좀 더 일관적으로 사용하게 하기 위해서 로직에 포함시켰습니다.

본래 eslint 는 매개 변수의 요소에 대입을 하여 순수 함수의 특성을 해치는 행동을 금지합니다. 근데 // eslint-disable-next-line no-param-reassign 와 같이 주석을 달면 해당 규칙을 무시해줍니다. 여기서는 뭐 순수 함수가 전혀 중요한 쟁점이 아니기 때문에 저렇게 eslint 기능 하나를 해제했습니다.

이제 이 applyStyle 함수를 호출하는 applyStyles 함수를 확인해봅시다.

// .. 중략 export default = { // .. 중략 methods: { // .. 중략 applyStyles(currentPos, refname, styles, r, unit = “px”) { for (const style of Object.keys(styles)) { const { topValue, bottomValue } = styles[style]; const calc = (bottomValue – topValue) * r + topValue; applyStyle(this.$refs[refname], style, calc, unit); } }, }, };

applyStyles 함수는 methods 안에 구현되어 있습니다. 각 스타일을 실제 요소에 적용해야 하므로 $refs 객체를 불러와야 하는데, 그래서 이 함수는 Vue Instance 내부에 구현되었습니다. 내용은 간단합니다. 모든 스타일마다 거기에 해당하는 진행률 등을 간단히 계산하고 $refs 객체와 unit 등을 전달하는 역할입니다.

이제 onScroll 에서 실제로 호출하는 applyAllAnimation 함수를 살펴보겠습니다.

// .. 중략 export default = { // .. 중략 methods: { // .. 중략 applyAllAnimation(currentPos, refname) { const animations = def.animations[refname]; if (!animations) return; for (const animation of animations) { const { top: a_top, bottom: a_bottom, easing, styles } = animation; const isIn = isAmong(currentPos, a_top, a_bottom); // 만약 애니메이션이 새롭게 들어갈 때 혹은 나갈때 enabled 설정 if (isIn) { if (!animation.enabled) animation.enabled = true; } else if (!isIn && animation.enabled) { if (currentPos <= a_top) { this.applyStyles(currentPos, refname, styles, 0); } else if (currentPos >= a_bottom) { this.applyStyles(currentPos, refname, styles, 1); } // eslint-disable-next-line no-param-reassign animation.enabled = false; } // 애니메이션이 enabled 라면, 애니메이션 적용. if (animation.enabled) { const r = easing((currentPos – a_top) / (a_bottom – a_top)); // eslint-disable-next-line no-param-reassign this.applyStyles(currentPos, refname, styles, r); } } }, }, };

우선 해당 애니메이션이 실제로 적용할 애니메이션인지 아닌지를 판단합니다. 이는 해당 요소(Element)를 활성화할 것인가와는 다릅니다. 우선 요소가 활성화된 다음 거기에 연결되어 있는 하나하나의 애니메이션을 체크하는 것입니다. 이 또한 현재 스크롤의 위치가 담겨있는 currentPos 변수를 기준으로 합니다. 만약 애니메이션이 비활성 상태였는데 이제 막 활성 상태로 바뀐다면, 애니메이션이 시작점에서 시작하는지 (스크롤이 위에서 아래로 내려오고 있는지) 아니면 끝점에서 시작하는지 (스크롤이 아래에서 위로 올라오고 있는지)를 알아야 합니다. 거기에 맞춰서 애니메이션 값들을 초기화해줍니다.

이제 초기화하는 함수를 알아봅시다.

mounted() { this.init(); // 이벤트 리스너 추가 window.addEventListener(“scroll”, this.onScroll); }, beforeDestroy() { // 이벤트 리스너 삭제 window.removeEventListener(“scroll”, this.onScroll); }, methods: { init() { this.initAnimation(); }, // 애니메이션 초기화 initAnimation() { // Sticky Conainer 의 높이를 설정함. this.$refs[“sticky-container”].style.height = `${def.height}px`; // disabled, enabled 를 비움. disabled.clear(); enabled.clear(); // 모든 요소를 disabled 에 넣음. for (const refname of Object.keys(def.elements)) { disabled.set(refname, def.elements[refname]); } // 각 애니메이션을 enabled == false 로 만듬. for (const refname of Object.keys(def.animations)) { for (const animation of def.animations[refname]) { animation.enabled = false; } } // 초기 스타일 적용 disabled.forEach((obj, refname) => { Object.keys(obj.topStyle).forEach((styleName) => { const pushValue = obj.topStyle[styleName]; this.$refs[refname].style[styleName] = pushValue; }); }); // 이미 요소의 범위 및 애니메이션의 범위에 있는 것들을 렌더링하기 위해 // 임의로 스크롤 이벤트 핸들러를 한 번 실행시킴. this.onScroll(); }, // (중략…) 다른 메소드들 },

초기화는 처음에 해줍니다. initAnimation 함수는 초기화를 합니다. this.$refs 만 vue.js 와 관련된 코드입니다. 앞서 이야기했듯 직접 스타일을 수정하기 위하여 DOM을 가져옵니다. 나머지는 이벤트 리스너를 추가하고 삭제하는 과정입니다. 이벤트 리스너를 추가할 이벤트는 scroll 이벤트 밖에 없습니다.

마지막으로 onScroll 을 확인해봅시다.

onScroll() { // 현재 스크롤 위치 파악 const scrollTop = window.scrollY || window.pageYOffset; const currentPos = scrollTop + window.innerHeight / 2; // disabled 순회하며 활성화할 요소 찾기. disabled.forEach((obj, refname) => { // 만약 칸에 있다면 해당 요소 활성화 if ( isAmong(currentPos, obj.top, obj.bottom) ) { enabled.set(refname, obj); this.$refs[refname].classList.remove(“disabled”); this.$refs[refname].classList.add(“enabled”); disabled.delete(refname); } }); // enabled 순회하면서 헤제할 요소를 체크 enabled.forEach((obj, refname) => { const { top, bottom, topStyle, bottomStyle } = obj; // console.log(`${top}, ${bottom}, ${topStyle}, ${bottomStyle}`); // 범위 밖에 있다면 if (!isAmong(currentPos, top, bottom)) { // 위로 나갔다면 시작하는 스타일 적용 if (currentPos <= top) { Object.keys(topStyle).forEach((styleName) => { applyStyle(this.$refs[refname], styleName, topStyle[styleName]); }); } // 아래로 나갔다면 끝나는 스타일적용 else if (currentPos >= bottom) { Object.keys(bottomStyle).forEach((styleName) => { applyStyle( this.$refs[refname], styleName, bottomStyle[styleName] ); // this.$refs[refname].style[styleName] = bottomStyle[styleName]; }); } // 리스트에서 삭제하고 disabled로 옮김. disabled.set(refname, obj); this.$refs[refname].classList.remove(“enabled”); this.$refs[refname].classList.add(“disabled”); enabled.delete(refname); } // enable 순회중, 범위 내부에 제대로 있다면 각 애니메이션 적용시키기. else { this.applyAllAnimation(currentPos, refname); } }); }

여기서 enabled 와 disabled 는 어떤 요소(Element) 가 활성화된 상태인지를 판단하기 위해 있습니다. 현재 스크롤 높이에 따라서 enabled 인지 disabled 인지 구분해주고 해당 요소의 classList 에 접근하여 클래스를 수정함으로써 현재 상태를 DOM 에 알려줍니다. (이로써 나중에 css 로 커스터마이징할 수도 있습니다.)

마치며

아마도 위 구현 내용이 최적의 구현은 절대 아닐 것입니다. 지금 보아도 구조가 상당히 난잡하고 이해하기 어렵게 되어 있는 것 같습니다. 위 코드를 하나하나 따져가며 어떻게 동작하는지를 알아내는 과정은 노력의 낭비일 수 있을 것 같습니다. 하지만 부드럽고 고급진 애니메이션을 만들고 싶으신 분들께 조금이나마의 영감과 도움이 되었으면 하는 마음에서 글을 작성하게 되었네요. 큰 줄기만 알아도 큰 도움이 되시리라 믿습니다. 모두 즐거운 코딩합시다!

67 Scroll Animation Design Inspiration

Loading Animations / Preloaders / Spinners Some say, in an ideal world Preloaders should not exist. But in an ideal scenario, you want to inform your visitors that the web page is loading the resources it needs to show the web page in all its glory to the visitor. It’s more common in complex web apps as opposed to websites. From SVG animation to CSS only there are a lot of loading animations out there to draw inspiration from, we have picked out some of our favourite ones for your viewing pleasure.

페이지 스크롤 다운 애니메이션 (feat. Animation of scroll)

반응형

오늘은 페이지 스크롤 다운 애니메이션을 어떻게 만드는지에 대해서 알아보려고 합니다.

페이지 스크롤 다운 애니메이션이 뭘까?

이것처럼 스크롤을 내릴 때 효과를 줘서 fadein, slidein, slideup 과 같은 동작을 할 수 있게 하는 애니메이션 입니다.

직접 자바스크립트를 사용해서 개발할 수 도 있지만 똑똑하신 분들이 만들어 놓은 라이브러리가 굉장히 많기 때문에 오늘은 그 라이브러리를 사용하는 방법에 대해서 정리해보려고 합니다.

페이지 스크롤 다운 애니메이션 라이브러리

WOW.js

Animate.css

* AOS

* AOS kissui

scrolltrigger

여기서 AOS를 사용하는 방법을 정리해보겠습니다.

사이트를 가보면 아래와 같이 다양한 페이지 스크롤 다운 애니메이션 종류들을 확인하실 수 있습니다.

아래로 내려서 사용법을 확인해보겠습니다.

다운로드 받아서 사용할 수도 있고 npm,yarn을 통해 패키지를 받아서 사용할 수도 있네요.

하지만 더욱 쉽게 사용할 수 있는 CDN을 사용해서 페이지 스크롤 다운 애니메이션을 구현해보도록 하겠습니다.

css와 script를 추가해주라고 하네요. css는 head태그 안에 script는 body태그 끝나기 전에 선언해주어야 하니 아래 처럼 넣어주도록 하겠습니다.

AOS

위 이미지 처럼 초기화를 해주라고 하니 해주도록 하겠습니다. 이 스크립트 코드도 body태그가 끝나기 전에 추가해주시면 됩니다.

AOS

아니 근데 다음에는 어떻게 하라는지 왜 안알려주는거죠?

모든 것은 github에 있으니 위에 버튼중에 github을 눌러서 github으로 가줍니다.

how to useit

~

어떻게 사용하는지 바로 나와 있네요.

똑같이 따라 해줍니다.

AOS

너무 쉽게 구현해버렸습니다. 하지만 좀 다 같은 페이지 스크롤 애니메이션을 사용하니 좀 밋밋한 느낌이 있는 것 같죠?

조금만 바꿔볼게요

드디어 현란한 페이지 스크롤 다운 애니메이션을 구현했습니다. 라이브러리를 사용하면 쉽게 구현할 수 있기 때문에 직접하는 것보다 잘 만들어진 라이브러리를 사용하는 능력도 필요할 것 같아요.

라이브러리별로 기능이 다르기 때문에 문서를 확인해본 후에 필요한 기능에 맞춰서 라이브러리를 선택하시면 좋을 것 같습니다. 감사합니다.

Psd To Html 31 [ Scroll Based Animation Part 3/6 ] 효율적으로 Css Animation 작성하기, 스크롤 애니메이션, 이미지가 슈욱 나타나기 | css 스크롤 오늘 업데이트

We are using cookies to give you the best experience on our website.

You can find out more about which cookies we are using or switch them off in settings.

[AOS] 📚 스크롤 애니메이션 사용법 – Animate On Scroll

AOS.js (Animate On Scroll)

기본적으로 스크롤 움직임에 따라 개체에 움직임을 주는 애니메이션의 경우, AOS 라이브러리를 사용하면 쉽게 애니메이션 을 줄 수 있다.

AOS 라이브러리는 자바스크립트를 깊게 몰라도 쉽게 사용할 수 있다는 장점 이 있다.

시간 투자 대비 가성비는 모든 스크롤 애니메이션 라이브러리 중 최고 라고 평가 받는다.

AOS – Installation

AOS – 사용방법

See the Pen AOS Animate On Scroll Library by Oltika (@oltika) on CodePen.

data-aos 옵션 속성

data-aos 사용할 애니메이션 효과명 data-aos-easing 애니메이션 시간흐름에 따른 속도설정 옵션 (default: ease) data-aos-anchor 특정한 객체에 anchor를 설정하여,

어떤 객체를 기준으로 애니메이션이 시작 될지를 설정 data-aos-delay 애니메이션 재생 대기시간 설정(default: 0) data-aos-offset 애니메이션 효과가 시작될 객체의 위치 설정 data-aos-duration 애니메이션의 재생시간 설정(default: 400) data-aos-anchor-placement 애니메이션이 어느 위치에서부터 적용될지 설정(default: top-bottom) data-aos-once 스크롤 할때마다 애니매이션이 재생될지를 설정(default: false)

※ delay와 duration은 0부터 3000까지 최대값을 설정할 수 있고, 50 단위로 설정 변경이 가능하다.

data-aos : 애니메이션 효과 종류

Fade animations: fade fade-up fade-down fade-left fade-right fade-up-right fade-up-left fade-down-right fade-down-left

Flip animations: flip-up flip-down flip-left flip-right

Slide animations: slide-up slide-down slide-left slide-right

Zoom animations: zoom-in zoom-in-up zoom-in-down zoom-in-left zoom-in-right zoom-out zoom-out-up zoom-out-down zoom-out-left zoom-out-right

data-aos-anchor-placement : 애니메이션 시작 위치 속성 종류

top-bottom

top-center

top-top

center-bottom

center-center

center-top

bottom-bottom

bottom-center

bottom-top

data-aos-easing : 애니메이션 재생 속도 종류

그래프에서 볼수 있듯이, 애니메이션이 재생하는데 매끄럽게 재생하거나 아니면 약간 break를 걸어서 뭔가 재생하는 느낌 등을 설정하는 속성이라고 보면 된다.

직접 하나하나 적용해봐서 차이를 눈으로 느껴보기를 권장한다.

linear

ease

ease-in

ease-out

ease-in-out

ease-in-back

ease-out-back

ease-in-out-back

ease-in-sine

ease-out-sine

ease-in-out-sine

ease-in-quad

ease-out-quad

ease-in-out-quad

ease-in-cubic

ease-out-cubic

ease-in-out-cubic

ease-in-quart

ease-out-quart

ease-in-out-quart

키워드에 대한 정보 html 스크롤 애니메이션

다음은 Bing에서 html 스크롤 애니메이션 주제에 대한 검색 결과입니다. 필요한 경우 더 읽을 수 있습니다.

이 기사는 인터넷의 다양한 출처에서 편집되었습니다. 이 기사가 유용했기를 바랍니다. 이 기사가 유용하다고 생각되면 공유하십시오. 매우 감사합니다!

사람들이 주제에 대해 자주 검색하는 키워드 자바스크립트로 8분만에 신박한 svg 스크롤 애니메이션 마스터하기

  • css
  • html
  • 프론트엔드
  • front-end
  • portfolio
  • 포트폴리오
  • 웹사이트
  • website
  • 홈페이지
  • hompage
  • csseffect
  • javascript
  • 자바스크립트
  • JS
  • svg
  • svg scroll
  • svg 스크롤
  • svg 스크롤 애니메이션
  • svg scroll animation
  • svg path
  • svg path drawing
  • svg 그리기
  • 스크롤
  • 스크롤 애니메이션
  • 자바스크립트 스크롤
  • javascript scrolling
  • javascript scroll animation
  • javascript scroll svg animation

자바스크립트로 #8분만에 #신박한 #svg #스크롤 #애니메이션 #마스터하기


YouTube에서 html 스크롤 애니메이션 주제의 다른 동영상 보기

주제에 대한 기사를 시청해 주셔서 감사합니다 자바스크립트로 8분만에 신박한 svg 스크롤 애니메이션 마스터하기 | html 스크롤 애니메이션, 이 기사가 유용하다고 생각되면 공유하십시오, 매우 감사합니다.

See also  에 딩거 맥주 | 홈플러스 최고의 밀맥주(바이젠)는? 바이젠 왕위쟁탈전 - 명품맥덕 답을 믿으세요

Leave a Reply

Your email address will not be published. Required fields are marked *