zdog实现玫瑰花朵生长动画效果代码

代码语言:html

所属分类:动画

代码描述:zdog实现玫瑰花朵生长动画效果代码

代码标签: zdog 玫瑰 花朵 生长 动画

下面为部分代码预览,完整代码请点击下载或在bfwstudio webide中打开

<!DOCTYPE html>
<html lang="en" >

<head>
  <meta charset="UTF-8">
  

  
  
  
  
<style>
* {
	box-sizing: border-box;
	padding: 0;
	margin: 0;
}

body {
	background: hsl(214 14% 10%);
	min-block-size: 100svb;
	display: grid;
	place-items: center;
	font-family: system-ui;
}
</style>

  
  
  
</head>

<body translate="no">
  <canvas style="display: block; inline-size: 100%; max-inline-size: 350px" width="350" height="520"></canvas>
<script type="text/javascript" src="//repo.bfw.wiki/bfwrepo/js/zdog.dist.js"></script>
      <script  >
const { Anchor, Shape, Ellipse, Cone, TAU } = Zdog;

(() => {
  const sineIn = t => {
    const v = Math.cos(t * Math.PI * 0.5);
    if (Math.abs(v) < 1e-14) return 1;else
    return 1 - v;
  };

  const backOut = t => {
    const s = 1.70158;
    return --t * t * ((s + 1) * t + s) + 1;
  };

  const colors = {
    snowflake: [
    { h: 209, s: 77, l: 43 },
    { h: 207, s: 91, l: 64 }],

    stem: [
    { h: 339, s: 69, l: 38 },
    { h: 339, s: 76, l: 59 }],

    petals: ["hsl(339 68% 45%)", "hsl(339 67% 52%)", "hsl(339 76% 59%)"],
    soil: "hsl(339 69% 38%)",
    particles: "hsl(336 100% 94%)" };


  const strokes = {
    snowflake: 3,
    stem: 2,
    petals: 3,
    soil: 2,
    particles: 1,
    spikes: 1 };


  const copies = {
    snowflake: 22,
    stem: 80,
    particles: 10,
    spikes: 4 };


  const indexes = {
    petals: copies.stem - 1,
    particles: Array(copies.particles).
    fill().
    map((_, i, { length }) =>
    Math.floor(copies.stem / (length + 1) * (i + 1))),

    spikes: Array(copies.spikes).
    fill().
    map((_, i, { length }) =>
    Math.floor(copies.stem / (length + 1) * (i + 1))) };



  const diagonal = (55 ** 2 + 60 ** 2) ** 0.5;
  const ds = [
  "M 0 -10 -7.5 -20 0 -30 7.5 -20",
  "M 7.5 -5 15 -15 27.5 -15 20 -5",
  "M 7.5 5 15 15 27.5 15 20 5",
  "M 0 10 -7.5 20 0 30 7.5 20",
  "M -7.5 -5 -15 -15 -27.5 -15 -20 -5",
  "M -7.5 5 -15 15 -27.5 15 -20 5"];


  const d = "M 0 0 C 10 25 -10 55 0 80";

  const path = document.createElementNS("http://www.w3.org/2000/svg", "path");

  const { h: h1, s: s1, l: l1 } = colors.snowflake[0];
  const { h: h2, s: s2, l: l2 } = colors.snowflake[1];

  const paths = ds.map(d => {
    path.setAttribute("d", d);
    const totalLength = path.getTotalLength();

    const points = Array(copies.snowflake).
    fill().
    map((_, i, { length }) => {
      const distance = totalLength / length * i;
      const { x, y } = path.getPointAtLength(distance);

      const offset = ((x + 27.5) ** 2 + (y + 30) ** 2) ** 0.5 / diagonal;
      const h = Math.floor(h1 + (h2 - h1) * offset);
      const s = Math.floor(s1 + (s2 - s1) * offset);
      const l = Math.floor(l1 + (l2 - l1) * offset);
      const color = `hsl(${h} ${s}% ${l}%)`;

      return { x, y, color };
    });

    return points;
  });

  path.setAttribute("d", d);
  const totalLength = path.getTotalLength();

  const { h: h3, s: s3, l: l3 } = colors.stem[0];
  const { h: h4, s: s4, l: l4 } = colors.stem[1];

  const points = Array(copies.stem).
  fill().
  map((_, i, { length }) => {
    const distance = totalLength / length * i;
    const { x, y } = path.getPointAtLength(distance);

    const offset = distance / totalLength;
    const h = Math.floor(h3 + (h4 - h3) * offset);
    const s = Math.floor(s3 + (s4 - s3) * offset);
    const l = Math.floor(l3 + (l4 - l3) * offset);
    const color = `hsl(${h} ${s}% ${l}%)`;

    return { x, y: y * -1, color };
  });

  const root = new Anchor();

  const snowflake = new Anchor({
    addTo: root,
    rotate: {
      x: TAU / 4 * -1 } });



  for (const points of paths) {
    for (let i = 0; i < points.length; i++) {
      const { x: x1, y: y1, color } = points[i];
      const { x: x2, y: y2 } = points[(i + 1) % points.length];
      new Shape({
        addTo: snowflake,
        color,
        stroke: strokes.snowflake,
        path: [
        { x: x1, y: y1 },
        { x: x2, y: y2 }] });


    }
  }

  new Ellipse({
    addTo: root,
    color: colors.soil,
    diameter: 4,
    stroke: strokes.soil,
    fill: true,
    rotate: {
      x: TAU / 4 * -1 } });
.........完整代码请登录后点击上方下载按钮下载查看

网友评论0