>  기사  >  웹 프론트엔드  >  D3 및 GSAP를 사용하여 춤추는 효과를 얻는 방법(소스 코드 첨부)

D3 및 GSAP를 사용하여 춤추는 효과를 얻는 방법(소스 코드 첨부)

不言
不言원래의
2018-09-26 17:22:552409검색

이 글의 내용은 D3와 GSAP를 사용하여 춤추는 효과를 얻는 방법에 관한 것입니다. (소스 코드 첨부) 도움이 필요한 친구들이 참고하면 좋겠습니다. 도움 당신이 도왔습니다.

효과 미리보기

D3 및 GSAP를 사용하여 춤추는 효과를 얻는 방법(소스 코드 첨부)

소스코드 다운로드

https://github .com/comehope/front-end-daily-challenges

코드 해석

dom 정의, 컨테이너에는 2개의 하위 컨테이너인 .horizontal이 포함되어 있습니다. 가로 선 세그먼트를 나타내고 .vertical은 세로 선 세그먼트를 나타내며 각 하위 컨테이너에는 4개의 하위 요소가 포함됩니다: .horizontal 代表水平的线段,.vertical 代表垂直的线段,每个子容器中包含 4 个子元素:

<div>
    <div>
        <span></span>
        <span></span>
        <span></span>
        <span></span>
    </div>
    <div>
        <span></span>
        <span></span>
        <span></span>
        <span></span>
    </div>
</div>

居中显示:

body {
    margin: 0;
    height: 100vh;
    display: flex;
    align-items: center;
    justify-content: center;
    background-color: skyblue;
}

设置容器尺寸,其中 --side-length 是方阵的每一边的元素数量:

.container {
    --side-length: 2;
    position: relative;
    width: calc(40px * calc(var(--side-length)));
    height: calc(40px * calc(var(--side-length)));
}

用 grid 布局排列子元素,4 个元素排列成 2 * 2 的方阵:

.container .horizontal,
.container .vertical {
    position: absolute;
    top: 0;
    left: 0;
    display: grid;
    grid-template-columns: repeat(var(--side-length), 1fr);
}

设置子元素的样式,.horizontal 内的子元素是横条,.vertical 内的子元素是竖条:

.container .horizontal span {
    width: 40px;
    height: 10px;
    background: #fff;
    margin: 15px 0;
}

.container .vertical span {
    width: 10px;
    height: 40px;
    background: #fff;
    margin: 0 15px;
}

至此,静态布局完成,接下来用 d3 批量处理子元素。
引入 d3 库:

<script></script>

删除掉 html 文件中的子元素 dom 节点,删除掉 css 文件中声明的 css 变量。
定义方阵每一边的元素数量,并把这个数值赋给 css 变量:

const SIDE_LENGTH = 2;

let container = d3.select('.container')
    .style('--side-length', SIDE_LENGTH);

定义一个添加 span 子元素的函数,分别添加横向和竖向的子元素:

function appendSpan(selector) {
    container.select(selector)
    .selectAll('span')
    .data(d3.range(SIDE_LENGTH * SIDE_LENGTH))
    .enter()
    .append('span');
}

appendSpan('.horizontal');
appendSpan('.vertical');

此时,布局已改为动态的,可以通过修改 SIDE_LENGTH 的值来创建不同边长的方阵,比如以下语句将创建 5 * 5 的方阵:

const SIDE_LENGTH = 5;

接下来用 GSAP 创建动画。(注:因 scrimba 在使用 gsap 时会崩溃,所以视频演示采用 css 动画,但 codepen 和 github 均采用 gsap 动画)
引入 GSAP 库:

<script></script>

声明动画变量 animation,声明代表 dom 元素的变量 $horizontalSpan$verticalSpan

let animation = new TimelineMax({repeat: -1});
let $horizontalSpan = '.container .horizontal span';
let $verticalSpan = '.container .vertical span';

先创建横条的动画,共分成 4 步,每个 to 语句的最后一个参数是步骤的名称:

animation.to($horizontalSpan, 1, {rotation: 45}, 'step1')
    .to($horizontalSpan, 1, {x: '-10px', y: '-10px'}, 'step2')
    .to($horizontalSpan, 1, {rotation: 0, x: '0', y: '0', scaleY: 2, scaleX: 0.5}, 'step3')
    .to($horizontalSpan, 1, {rotation: 90, scaleY: 1, scaleX: 1}, 'step4')

再创建竖条的动画,to

animation.to($verticalSpan, 1, {rotation: 45}, 'step1')
    .to($verticalSpan, 1, {x: '10px', y: '10px'}, 'step2')
    .to($verticalSpan, 1, {x: '0', y: '0', scaleX: 2, scaleY: 0.5}, 'step3')
    .to($verticalSpan, 1, {rotation: 90, scaleX: 1, scaleY: 1}, 'step4');
가운데 표시:

animation.timeScale(2);
컨테이너 크기를 설정합니다. 여기서 --side-length는 정사각형 행렬의 각 측면에 있는 요소 수입니다.

const SIDE_LENGTH = 10;
그리드 레이아웃을 사용하여 하위 요소 정렬, 4개 요소 2 * 2 정사각형 행렬로 배열됩니다:

rrreee

하위 요소의 스타일을 설정합니다. .horizontal 내의 하위 요소는 가로 막대이고 .vertical은 수직 막대입니다:

rrreee

이 시점에서 정적 레이아웃이 완성되고 d3를 사용하여 하위 요소를 일괄 처리합니다.
d3 라이브러리 소개: #🎜🎜#rrreee#🎜🎜#html 파일에서 하위 요소 dom 노드를 삭제하고 css 파일에 선언된 CSS 변수를 삭제합니다.
정사각 행렬의 각 변에 있는 요소 수를 정의하고 이 값을 CSS 변수에 할당합니다. #🎜🎜#rrreee#🎜🎜#span 하위 요소를 추가하는 함수 정의 가로 요소와 세로 하위 요소 추가: #🎜🎜#rrreee#🎜🎜#이 시점에서 레이아웃은 동적으로 변경되었습니다. 값을 수정하여 변의 길이가 다른 정사각형 행렬을 만들 수 있습니다. SIDE_LENGTH, 예: 다음과 같은 명령문은 5 * 5 정사각형 행렬을 생성합니다: #🎜🎜#rrreee#🎜🎜# 다음으로 GSAP를 사용하여 애니메이션을 만듭니다. (참고: gsap을 사용하면 scrimba가 충돌하기 때문에 비디오 데모에서는 CSS 애니메이션을 사용하지만 codepen과 github는 모두 gsap 애니메이션을 사용합니다.)
GSAP 라이브러리 소개: #🎜🎜#rrreee#🎜🎜#애니메이션 변수 선언animation, DOM 요소 $horizontalSpan$verticalSpan을 나타내는 변수를 선언합니다. #🎜🎜#rrreee#🎜🎜#먼저 가로 막대의 애니메이션을 만듭니다. 총 4단계로 나누어지며, 각 to 문의 마지막 매개변수는 단계 이름입니다: #🎜🎜#rrreee#🎜🎜# 그런 다음 수직 막대 애니메이션인 to 문 단계 이름은 애니메이션을 가로 막대와 동기화하기 위해 가로 막대의 단계 이름과 동일합니다. #🎜🎜#rrreee#🎜🎜#애니메이션 끝 부분에 시간 척도 조정 기능을 사용하여 애니메이션 속도를 두 배로 늘립니다. #🎜🎜#rrreee# 🎜🎜#마지막으로 정사각형 배열의 변 길이를 10으로 변경합니다. 정사각형 배열이 클수록 더 강력해집니다. #🎜🎜#rrreee#🎜🎜 #끝났어요! #🎜🎜##🎜🎜##🎜🎜#

위 내용은 D3 및 GSAP를 사용하여 춤추는 효과를 얻는 방법(소스 코드 첨부)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.