이 글의 내용은 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를 사용하여 하위 요소를 일괄 처리합니다.span
하위 요소를 추가하는 함수 정의 가로 요소와 세로 하위 요소 추가: #🎜🎜#rrreee#🎜🎜#이 시점에서 레이아웃은 동적으로 변경되었습니다. 값을 수정하여 변의 길이가 다른 정사각형 행렬을 만들 수 있습니다. SIDE_LENGTH
, 예: 다음과 같은 명령문은 5 * 5 정사각형 행렬을 생성합니다: #🎜🎜#rrreee#🎜🎜# 다음으로 GSAP를 사용하여 애니메이션을 만듭니다. (참고: gsap을 사용하면 scrimba가 충돌하기 때문에 비디오 데모에서는 CSS 애니메이션을 사용하지만 codepen과 github는 모두 gsap 애니메이션을 사용합니다.)animation
, DOM 요소 $horizontalSpan
및 $verticalSpan
을 나타내는 변수를 선언합니다. #🎜🎜#rrreee#🎜🎜#먼저 가로 막대의 애니메이션을 만듭니다. 총 4단계로 나누어지며, 각 to
문의 마지막 매개변수는 단계 이름입니다: #🎜🎜#rrreee#🎜🎜# 그런 다음 수직 막대 애니메이션인 to 문 단계 이름은 애니메이션을 가로 막대와 동기화하기 위해 가로 막대의 단계 이름과 동일합니다. #🎜🎜#rrreee#🎜🎜#애니메이션 끝 부분에 시간 척도 조정 기능을 사용하여 애니메이션 속도를 두 배로 늘립니다. #🎜🎜#rrreee# 🎜🎜#마지막으로 정사각형 배열의 변 길이를 10으로 변경합니다. 정사각형 배열이 클수록 더 강력해집니다. #🎜🎜#rrreee#🎜🎜 #끝났어요! #🎜🎜##🎜🎜##🎜🎜#
위 내용은 D3 및 GSAP를 사용하여 춤추는 효과를 얻는 방법(소스 코드 첨부)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!