圣诞节马上就要到了,不知道给自己喜欢的人准备什么样的惊喜吗?作为一名程序员,当然是用编程制作专属于她or他的圣诞树!


目录

🎄圣诞树

✨3D圣诞树

代码块

打开方式

修改位置

效果展示

✨音乐律动圣诞树

代码块

打开方式

效果展示

✨灯光圣诞树

代码块

修改位置

效果展示

🎁圣诞贺卡

🎊祝福绘制圣诞贺卡

代码块

修改位置

效果展示

🎊雪橇雪人圣诞贺卡

代码块

效果展示

🎊祝福语圣诞贺卡

代码块

修改位置

效果展示

🧧源码获取方式


        一年一度的圣诞节马上就要到了,看到好多程序员小伙伴已经开始炫耀自己制作的圣诞树了。今天就跟大家分享多种不同风格的圣诞树和圣诞贺卡,附上完整代码,拿来即用可以按照自己的喜好来去运行使用哦。

🎄圣诞树

✨3D圣诞树

代码块

<!DOCTYPE HEML PUBLIC>

<html>

<head>

<meta charset="utf-8">

<style>

html, body

{

width: 100%;

height: 100%;

margin: 0;

padding: 0;

border: 0;

}

div

{

margin: 0;

padding: 0;

border: 0;

}



.nav

{

position: absolute;

top: 0;

left: 0;

width: 100%;

height: 27px;

background-color: white;

color: black;

text-align: center;

line-height: 25px;

}



a

{

color: black;

text-decoration: none;

border-bottom: 1px dashed black;

}



a:hover

{

border-bottom: 1px solid red;

}



.previous

{

float: left;

margin-left: 10px;

}



.next

{

float: right;

margin-right: 10px;

}



.green

{

color: green;

}



.red

{

color: red;

}



textarea

{

width: 100%;

height: 100%;

border: 0;

padding: 0;

margin: 0;

padding-bottom: 20px;

}



.block-outer

{

float: left;

width: 22%;

height: 100%;

padding: 5px;

border-left: 1px solid black;

margin: 30px 3px 3px 3px;

}



.block-inner

{

height: 68%;

}



.one

{

border: 0;

}

</style>

</head>

<body marginwidth="0" marginheight="0">

<canvas id="c" height="356" width="446">

<script>

var collapsed = true;

function toggle()

{

var fs = top.document.getElementsByTagName('frameset')[0];

var f = fs.getElementsByTagName('frame');

if (collapsed)

{

fs.rows = '250px,*';

fs.noResize = false;

f[0].noResize = false;

f[1].noResize = false;

}



else

{

fs.rows = '30px,*';

fs.noResize = true;

f[0].noResize = true;

f[1].noResize = true;

}

collapsed = !collapsed;

}

</script>



<script>

var b = document.body;

var c = document.getElementsByTagName('canvas')[0];

var a = c.getContext('2d');

document.body.clientWidth;

</script>



<script>

M=Math;

Q=M.random;J=[];

U=16;

T=M.sin;

E=M.sqrt;

for(O=k=0;x=z=j=i=k<200;)

with(M[k]=k?c.cloneNode(0):c)

{

width=height=k?32:W=446;

with(getContext('2d'))

if(k>10|!k)



for(

font='60px Impact',

V='rgba(';I=i*U,fillStyle=k?k==13?V+'205,205,215,.15)':

V+(147+I)+','+(k%2?128+I:0)+','+I+',.5)':'#cca',i<7;)



beginPath(fill(arc(U-i/3,24-i/2,k==13?4-(i++)/2:8-i++,0,M.PI*2,1)));



else for(;

x=T(i),

y=Q()*2-1,

D=x*x+y*y,

B=E(D-x/.9-1.5*y+1),

R=67*(B+1)*(L=k/9+.8)>>1,

i++<W;

)



if(D<1)

beginPath(strokeStyle=V+R+','+(R+B*L>>0)+',40,.1)'),

moveTo(U+x*8,U+y*8),

lineTo(U+x*U,U+y*U),

stroke();



for(

y=H=k+E(k++)*25,

R=Q()*W;

P=3,j<H;)

J[O++]=[

x+=T(R)*P+Q()*6-3,y+=Q()*U-8,

z+=T(R-11)*P+Q()*6-3,

j/H*20+((j+=U)>H&Q()>.8?Q(P=9)*4:0)>>1]

}



setInterval(function G(m,l)

{

A=T(D-11);

if(l)



return(

m[2]-l[2])*A+(l[0]-m[0])*T(D);

a.clearRect(0,0,W,W);

J.sort(G);



for(

i=0;

L=J[i++];

a.drawImage(M[L[3]+1],207+L[0]*A+L[2]*T(D)>>0,L[1]>>1))

{

if(i==2e3)

a.fillText
//修改引号内的内容
('Happy Christmas!',U,345);

//例如:  ('猪猪圣诞快乐!',U,345);



if(!(i%7))

a.drawImage(M[13],

((157*(i*i)+T(D*5+i*i)*5)%W)>>0,

((113*i+(D*i)/60)%(290+i/99))>>0);

}

D+=.02

},1)

</script>

</body>

</html>

打开方式

新建文本文档----→将代码粘贴后保存----→将文件后缀改为html打开即可

注意事项:用记事本输入代码,然后更改格式为html,有些人的电脑会默认隐藏文件格式,这时候你要在此电脑的查看选项中,把已知文件类型的扩展名这个选项的✓给打开,这样就会显示你每个文件的具体格式了。

修改位置

//修改引号内的内容
('Happy Christmas!',U,345);

//例如:  ('猪猪圣诞快乐!',U,345);


源代码中已标注

效果展示

✨音乐律动圣诞树

代码块

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

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

 <title></title>

 <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/normalize/5.0.0/normalize.min.css">

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


  body 
  {
   margin: 0;
   height: 100vh;
   overflow: hidden;
   display: flex;
   align-items: center;
   justify-content: center;
   background: #161616;
   color: #c5a880;
   font-family: sans-serif;
  }


  label
  {
   display: inline-block;
   background-color: #161616;
   padding: 16px;
   border-radius: 0.3rem;
   cursor: pointer;
   margin-top: 1rem;
   width: 300px;
   border-radius: 10px;
   border: 1px solid #c5a880;
   text-align: center;
  }


  ul 
  {
   list-style-type: none;
   padding: 0;
   margin: 0;
  }


  .btn
  {
   background-color: #161616;
   border-radius: 10px;
   color: #c5a880;
   border: 1px solid #c5a880;
   padding: 16px;
   width: 300px;
   margin-bottom: 16px;
   line-height: 1.5;
   cursor: pointer;
  }
  .separator
  {
   font-weight: bold;
   text-align: center;
   width: 300px;
   margin: 16px 0px;
   color: #a07676;
  }


  .title 
  {
   color: #a07676;
   font-weight: bold;
   font-size: 1.25rem;
   margin-bottom: 16px;
  }


  .text-loading 
  {
   font-size: 2rem;
  }
 </style>

 <script>
  window.console = window.console || function(t) {};
 </script>

 <script>
  if (document.location.search.match(/type=embed/gi)) {
   window.parent.postMessage("resize", "*");
  }
 </script>


</head>

<body translate="no" >
 <script src="https://cdn.jsdelivr.net/npm/three@0.115.0/build/three.min.js"></script>
 <script src="https://cdn.jsdelivr.net/npm/three@0.115.0/examples/js/postprocessing/EffectComposer.js"></script>
 <script src="https://cdn.jsdelivr.net/npm/three@0.115.0/examples/js/postprocessing/RenderPass.js"></script>
 <script src="https://cdn.jsdelivr.net/npm/three@0.115.0/examples/js/postprocessing/ShaderPass.js"></script>
 <script src="https://cdn.jsdelivr.net/npm/three@0.115.0/examples/js/shaders/CopyShader.js"></script>
 <script src="https://cdn.jsdelivr.net/npm/three@0.115.0/examples/js/shaders/LuminosityHighPassShader.js"></script>
 <script src="https://cdn.jsdelivr.net/npm/three@0.115.0/examples/js/postprocessing/UnrealBloomPass.js"></script>

 <div id="overlay">
  <ul>
   <li class="title">请选择音乐</li>
   <li>
    <button class="btn" id="btnA" type="button">
     Snowflakes Falling Down by Simon Panrucker
    </button>
   </li>
   <li><button class="btn" id="btnB" type="button">This Christmas by Dott</button></li>
   <li><button class="btn" id="btnC" type="button">No room at the inn by TRG Banks</button></li>
   <li><button class="btn" id="btnD" type="button">Jingle Bell Swing by Mark Smeby</button></li>
   <li class="separator">或者</li>
   <li>
    <input type="file" id="upload" hidden />
    <label for="upload">Upload File</label>
   </li>
  </ul>
 </div>

 <script id="rendered-js" >
  const { PI, sin, cos } = Math;
  const TAU = 2 * PI;

  const map = (value, sMin, sMax, dMin, dMax) => {
   return dMin + (value - sMin) / (sMax - sMin) * (dMax - dMin);
  };

  const range = (n, m = 0) =>
  Array(n).
  fill(m).
  map((i, j) => i + j);

  const rand = (max, min = 0) => min + Math.random() * (max - min);
  const randInt = (max, min = 0) => Math.floor(min + Math.random() * (max - min));
  const randChoise = arr => arr[randInt(arr.length)];
  const polar = (ang, r = 1) => [r * cos(ang), r * sin(ang)];

  let scene, camera, renderer, analyser;
  let step = 0;
  const uniforms = {
   time: { type: "f", value: 0.0 },
   step: { type: "f", value: 0.0 } };

   const params = {
    exposure: 1,
    bloomStrength: 0.9,
    bloomThreshold: 0,
    bloomRadius: 0.5 };

    let composer;

    const fftSize = 2048;
    const totalPoints = 4000;

    const listener = new THREE.AudioListener();

    const audio = new THREE.Audio(listener);

    document.querySelector("input").addEventListener("change", uploadAudio, false);

    const buttons = document.querySelectorAll(".btn");
    buttons.forEach((button, index) =>
     button.addEventListener("click", () => loadAudio(index)));


    function init() {
     const overlay = document.getElementById("overlay");
     overlay.remove();

     scene = new THREE.Scene();
     renderer = new THREE.WebGLRenderer({ antialias: true });
     renderer.setPixelRatio(window.devicePixelRatio);
     renderer.setSize(window.innerWidth, window.innerHeight);
     document.body.appendChild(renderer.domElement);

     camera = new THREE.PerspectiveCamera(
      60,
      window.innerWidth / window.innerHeight,
      1,
      1000);

     camera.position.set(-0.09397456774197047, -2.5597086635726947, 24.420789670889008);
     camera.rotation.set(0.10443543723052419, -0.003827152981119352, 0.0004011488708739715);

     const format = renderer.capabilities.isWebGL2 ?
     THREE.RedFormat :
     THREE.LuminanceFormat;

     uniforms.tAudioData = {
      value: new THREE.DataTexture(analyser.data, fftSize / 2, 1, format) };


      addPlane(scene, uniforms, 3000);
      addSnow(scene, uniforms);

      range(10).map(i => {
       addTree(scene, uniforms, totalPoints, [20, 0, -20 * i]);
       addTree(scene, uniforms, totalPoints, [-20, 0, -20 * i]);
      });

      const renderScene = new THREE.RenderPass(scene, camera);

      const bloomPass = new THREE.UnrealBloomPass(
       new THREE.Vector2(window.innerWidth, window.innerHeight),
       1.5,
       0.4,
       0.85);

      bloomPass.threshold = params.bloomThreshold;
      bloomPass.strength = params.bloomStrength;
      bloomPass.radius = params.bloomRadius;

      composer = new THREE.EffectComposer(renderer);
      composer.addPass(renderScene);
      composer.addPass(bloomPass);

      addListners(camera, renderer, composer);
      animate();
     }

     function animate(time) {
      analyser.getFrequencyData();
      uniforms.tAudioData.value.needsUpdate = true;
      step = (step + 1) % 1000;
      uniforms.time.value = time;
      uniforms.step.value = step;
      composer.render();
      requestAnimationFrame(animate);
     }

     function loadAudio(i) {
      document.getElementById("overlay").innerHTML =
      '<div class="text-loading">正在下载音乐,请稍等...</div>';
      const files = [
      "https://files.freemusicarchive.org/storage-freemusicarchive-org/music/no_curator/Simon_Panrucker/Happy_Christmas_You_Guys/Simon_Panrucker_-_01_-_Snowflakes_Falling_Down.mp3",
      "https://files.freemusicarchive.org/storage-freemusicarchive-org/music/no_curator/Dott/This_Christmas/Dott_-_01_-_This_Christmas.mp3",
      "https://files.freemusicarchive.org/storage-freemusicarchive-org/music/ccCommunity/TRG_Banks/TRG_Banks_Christmas_Album/TRG_Banks_-_12_-_No_room_at_the_inn.mp3",
      "https://files.freemusicarchive.org/storage-freemusicarchive-org/music/ccCommunity/Mark_Smeby/En_attendant_Nol/Mark_Smeby_-_07_-_Jingle_Bell_Swing.mp3"];

      const file = files[i];

      const loader = new THREE.AudioLoader();
      loader.load(file, function (buffer) {
       audio.setBuffer(buffer);
       audio.play();
       analyser = new THREE.AudioAnalyser(audio, fftSize);
       init();
      });


     }


     function uploadAudio(event) {
      document.getElementById("overlay").innerHTML =
      '<div class="text-loading">请稍等...</div>';
      const files = event.target.files;
      const reader = new FileReader();

      reader.onload = function (file) {
       var arrayBuffer = file.target.result;

       listener.context.decodeAudioData(arrayBuffer, function (audioBuffer) {
        audio.setBuffer(audioBuffer);
        audio.play();
        analyser = new THREE.AudioAnalyser(audio, fftSize);
        init();
       });
      };

      reader.readAsArrayBuffer(files[0]);
     }

     function addTree(scene, uniforms, totalPoints, treePosition) {
      const vertexShader = `
      attribute float mIndex;
      varying vec3 vColor;
      varying float opacity;
      uniform sampler2D tAudioData;

      float norm(float value, float min, float max ){
       return (value - min) / (max - min);
      }
      float lerp(float norm, float min, float max){
       return (max - min) * norm + min;
      }

      float map(float value, float sourceMin, float sourceMax, float destMin, float destMax){
       return lerp(norm(value, sourceMin, sourceMax), destMin, destMax);
      }


      void main() {
       vColor = color;
       vec3 p = position;
       vec4 mvPosition = modelViewMatrix * vec4( p, 1.0 );
       float amplitude = texture2D( tAudioData, vec2( mIndex, 0.1 ) ).r;
       float amplitudeClamped = clamp(amplitude-0.4,0.0, 0.6 );
       float sizeMapped = map(amplitudeClamped, 0.0, 0.6, 1.0, 20.0);
       opacity = map(mvPosition.z , -200.0, 15.0, 0.0, 1.0);
       gl_PointSize = sizeMapped * ( 100.0 / -mvPosition.z );
       gl_Position = projectionMatrix * mvPosition;
      }
      `;
      const fragmentShader = `
      varying vec3 vColor;
      varying float opacity;
      uniform sampler2D pointTexture;
      void main() {
       gl_FragColor = vec4( vColor, opacity );
       gl_FragColor = gl_FragColor * texture2D( pointTexture, gl_PointCoord ); 
      }
      `;
      const shaderMaterial = new THREE.ShaderMaterial({
       uniforms: {
        ...uniforms,
        pointTexture: {
         value: new THREE.TextureLoader().load(`https://assets.codepen.io/3685267/spark1.png`) } },


         vertexShader,
         fragmentShader,
         blending: THREE.AdditiveBlending,
         depthTest: false,
         transparent: true,
         vertexColors: true });


      const geometry = new THREE.BufferGeometry();
      const positions = [];
      const colors = [];
      const sizes = [];
      const phases = [];
      const mIndexs = [];

      const color = new THREE.Color();

      for (let i = 0; i < totalPoints; i++) {
       const t = Math.random();
       const y = map(t, 0, 1, -8, 10);
       const ang = map(t, 0, 1, 0, 6 * TAU) + TAU / 2 * (i % 2);
       const [z, x] = polar(ang, map(t, 0, 1, 5, 0));

       const modifier = map(t, 0, 1, 1, 0);
       positions.push(x + rand(-0.3 * modifier, 0.3 * modifier));
       positions.push(y + rand(-0.3 * modifier, 0.3 * modifier));
       positions.push(z + rand(-0.3 * modifier, 0.3 * modifier));

       color.setHSL(map(i, 0, totalPoints, 1.0, 0.0), 1.0, 0.5);

       colors.push(color.r, color.g, color.b);
       phases.push(rand(1000));
       sizes.push(1);
       const mIndex = map(i, 0, totalPoints, 1.0, 0.0);
       mIndexs.push(mIndex);
      }

      geometry.setAttribute(
       "position",
       new THREE.Float32BufferAttribute(positions, 3).setUsage(
        THREE.DynamicDrawUsage));


      geometry.setAttribute("color", new THREE.Float32BufferAttribute(colors, 3));
      geometry.setAttribute("size", new THREE.Float32BufferAttribute(sizes, 1));
      geometry.setAttribute("phase", new THREE.Float32BufferAttribute(phases, 1));
      geometry.setAttribute("mIndex", new THREE.Float32BufferAttribute(mIndexs, 1));

      const tree = new THREE.Points(geometry, shaderMaterial);

      const [px, py, pz] = treePosition;

      tree.position.x = px;
      tree.position.y = py;
      tree.position.z = pz;

      scene.add(tree);
     }

     function addSnow(scene, uniforms) {
      const vertexShader = `
      attribute float size;
      attribute float phase;
      attribute float phaseSecondary;

      varying vec3 vColor;
      varying float opacity;


      uniform float time;
      uniform float step;

      float norm(float value, float min, float max ){
       return (value - min) / (max - min);
      }
      float lerp(float norm, float min, float max){
       return (max - min) * norm + min;
      }

      float map(float value, float sourceMin, float sourceMax, float destMin, float destMax){
       return lerp(norm(value, sourceMin, sourceMax), destMin, destMax);
      }
      void main() {
       float t = time* 0.0006;

       vColor = color;

       vec3 p = position;

       p.y = map(mod(phase+step, 1000.0), 0.0, 1000.0, 25.0, -8.0);

       p.x += sin(t+phase);
       p.z += sin(t+phaseSecondary);

       opacity = map(p.z, -150.0, 15.0, 0.0, 1.0);

       vec4 mvPosition = modelViewMatrix * vec4( p, 1.0 );

       gl_PointSize = size * ( 100.0 / -mvPosition.z );

       gl_Position = projectionMatrix * mvPosition;

      }
      `;

      const fragmentShader = `
      uniform sampler2D pointTexture;
      varying vec3 vColor;
      varying float opacity;

      void main() {
       gl_FragColor = vec4( vColor, opacity );
       gl_FragColor = gl_FragColor * texture2D( pointTexture, gl_PointCoord ); 
      }
      `;
      function createSnowSet(sprite) {
       const totalPoints = 300;
       const shaderMaterial = new THREE.ShaderMaterial({
        uniforms: {
         ...uniforms,
         pointTexture: {
          value: new THREE.TextureLoader().load(sprite) } },


          vertexShader,
          fragmentShader,
          blending: THREE.AdditiveBlending,
          depthTest: false,
          transparent: true,
          vertexColors: true });


       const geometry = new THREE.BufferGeometry();
       const positions = [];
       const colors = [];
       const sizes = [];
       const phases = [];
       const phaseSecondaries = [];

       const color = new THREE.Color();

       for (let i = 0; i < totalPoints; i++) {
        const [x, y, z] = [rand(25, -25), 0, rand(15, -150)];
        positions.push(x);
        positions.push(y);
        positions.push(z);

        color.set(randChoise(["#f1d4d4", "#f1f6f9", "#eeeeee", "#f1f1e8"]));

        colors.push(color.r, color.g, color.b);
        phases.push(rand(1000));
        phaseSecondaries.push(rand(1000));
        sizes.push(rand(4, 2));
       }

       geometry.setAttribute(
        "position",
        new THREE.Float32BufferAttribute(positions, 3));

       geometry.setAttribute("color", new THREE.Float32BufferAttribute(colors, 3));
       geometry.setAttribute("size", new THREE.Float32BufferAttribute(sizes, 1));
       geometry.setAttribute("phase", new THREE.Float32BufferAttribute(phases, 1));
       geometry.setAttribute(
        "phaseSecondary",
        new THREE.Float32BufferAttribute(phaseSecondaries, 1));


       const mesh = new THREE.Points(geometry, shaderMaterial);

       scene.add(mesh);
      }
      const sprites = [
      "https://assets.codepen.io/3685267/snowflake1.png",
      "https://assets.codepen.io/3685267/snowflake2.png",
      "https://assets.codepen.io/3685267/snowflake3.png",
      "https://assets.codepen.io/3685267/snowflake4.png",
      "https://assets.codepen.io/3685267/snowflake5.png"];

      sprites.forEach(sprite => {
       createSnowSet(sprite);
      });
     }

     function addPlane(scene, uniforms, totalPoints) {
      const vertexShader = `
      attribute float size;
      attribute vec3 customColor;
      varying vec3 vColor;

      void main() {
       vColor = customColor;
       vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );
       gl_PointSize = size * ( 300.0 / -mvPosition.z );
       gl_Position = projectionMatrix * mvPosition;

      }
      `;
      const fragmentShader = `
      uniform vec3 color;
      uniform sampler2D pointTexture;
      varying vec3 vColor;

      void main() {
       gl_FragColor = vec4( vColor, 1.0 );
       gl_FragColor = gl_FragColor * texture2D( pointTexture, gl_PointCoord );

      }
      `;
      const shaderMaterial = new THREE.ShaderMaterial({
       uniforms: {
        ...uniforms,
        pointTexture: {
         value: new THREE.TextureLoader().load(`https://assets.codepen.io/3685267/spark1.png`) } },


         vertexShader,
         fragmentShader,
         blending: THREE.AdditiveBlending,
         depthTest: false,
         transparent: true,
         vertexColors: true });


      const geometry = new THREE.BufferGeometry();
      const positions = [];
      const colors = [];
      const sizes = [];

      const color = new THREE.Color();

      for (let i = 0; i < totalPoints; i++) {
       const [x, y, z] = [rand(-25, 25), 0, rand(-150, 15)];
       positions.push(x);
       positions.push(y);
       positions.push(z);

       color.set(randChoise(["#93abd3", "#f2f4c0", "#9ddfd3"]));

       colors.push(color.r, color.g, color.b);
       sizes.push(1);
      }

      geometry.setAttribute(
       "position",
       new THREE.Float32BufferAttribute(positions, 3).setUsage(
        THREE.DynamicDrawUsage));


      geometry.setAttribute(
       "customColor",
       new THREE.Float32BufferAttribute(colors, 3));

      geometry.setAttribute("size", new THREE.Float32BufferAttribute(sizes, 1));

      const plane = new THREE.Points(geometry, shaderMaterial);

      plane.position.y = -8;
      scene.add(plane);
     }

     function addListners(camera, renderer, composer) {
      document.addEventListener("keydown", e => {
       const { x, y, z } = camera.position;
       console.log(`camera.position.set(${x},${y},${z})`);
       const { x: a, y: b, z: c } = camera.rotation;
       console.log(`camera.rotation.set(${a},${b},${c})`);
      });

      window.addEventListener(
       "resize",
       () => {
        const width = window.innerWidth;
        const height = window.innerHeight;

        camera.aspect = width / height;
        camera.updateProjectionMatrix();

        renderer.setSize(width, height);
        composer.setSize(width, height);
       },
       false);

     }
</script>

</body>

</html>

打开方式

新建文本文档----→将代码粘贴后保存----→将文件后缀改为html打开即可

 

注意事项:用记事本输入代码,然后更改格式为html,有些人的电脑会默认隐藏文件格式,这时候你要在此电脑的查看选项中,把已知文件类型的扩展名这个选项的✓给打开,这样就会显示你每个文件的具体格式了。

效果展示

✨灯光圣诞树

代码块

html

<!DOCTYPE html>
<html lang='zh-CN'>
<head>
    <meta character = 'UTF-8'>
    <meta http-equiv="X-UA-Compatible" content='IE=edge'>
    <meta name="viewport" conetent="width=device.width, initial-scale=1.0">

    <title>猪猪 ♥ 圣诞快乐 </title>
    <link rel="stylesheet" href="tree.css">
    <!--引入vue-->
    <script src ='https://cdn.staticfile.org/vue/2.2.2/vue.min.js'></script>
</head>
<body>
    <div>
    <div class="tree">
        <div class='tree-light' v-for="(item,index) in 50" :style="
        {'--appear':index,'--y':2*index,'--rotate':1440-28.8*index,
        '--radius':12.5-0.25*index,'--speed':index*0.1,
        '--delay':index*0.05}"></div>   
        <!--星星--> 
        <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 113.32 108.44" class="tree-star" style="--delay:50;">
            <path d="M90.19 104.33L57.12 87.38 24.4 105l5.91-36.69L3.44 42.65l36.72-5.72 16.1-33.5L73.06 36.6l36.83 4.97-26.35 26.21z"
             fill="none" stroke-width="6.88" stroke-linecap="round"
            stroke-linejoin="round"></path>
        </svg>
    </div>
    <div class="wish">

        <span>猪猪 ♥ 圣诞快乐   修改文字部分即可</span>
    </div>
</div>
</body>
</html>

<script>
    new Vue({
        el: '.tree',
        data:{}
    })
</script>

CSS 

*{
    margin: 0;
    padding:0;
}
body{
    height:100vh;
    display:flex;
    justify-content:center;
    align-items: center;
    background-color: #233343;
    overflow:hidden;
    transform-style: preserve-3d;
    perspective: 1200px;
}
.tree{
    /* border:1px solid red; */
    width:1200px;
    height: 716px;
    position:relative;
    transform-style: preserve-3d;
    animation:spin 1s linear infinite
}
.tree-light{
    transform-style: preserve-3d;
    position:absolute;
    width: 8px;
    height:8px;
    border-radius:50%;
    left:50%;
    bottom:calc(var(--y)*1%);
    transform: translate(-50%,50%) rotateY(calc(var(--rotate,0)*1deg)) 
    translate3d(0,0,calc(var(--radius,0)*25px));
    animation: flash calc(var(--speed) * 0.5s) calc(var(--delay)*0.5s) infinite, appear 0.5s calc(var(--appear)*0.05s);

}
.tree-star{
    stroke:#f5e0a3;
    stroke-dasharray: 1000 1000;
    width: 50px;
    height: 50px;
    filter:drop-shadow(0 0 10px #fcf1cf);
    position: absolute;
    left:50%;
    bottom:100%;
    transform: translate(-50%,0);
    animation: stroke 1s calc((var(--delay)*0.95)*0.02s) backwards;
}
.wish{
    stroke:#f5e0a3;
    stroke-dasharray: 1000 1000;
    position:absolute;
    left:50%;
    transform: translate(-20%,20%);
    width:1000px;
    height:300px;
    justify-content:center;
    align-items: center;
    color:#faebd7;
    font-size: 50px;

}

@keyframes appear {
    from{
        opacity:0;
    }
}
@keyframes flash {
    0%,100%{
        background-color:#4f60f6;
    }
    20%{
        background-color: #f64f4f;
    }
    40%{
        background: #4fecf6;
    }
    60%{
        background-color: #f6db4f;
    }
    80%{
        background-color: #f64fe5;
    }
}

@keyframes spin {
    to{
        transform: rotateY(360deg);
    }
}

@keyframes stroke{
    from{
        stroke-dashoffset: -1000;
    }
}

修改位置

   <span>猪猪 ♥ 圣诞快乐   修改文字部分即可</span>


源代码中已标注

效果展示

🎁圣诞贺卡

🎊祝福绘制圣诞贺卡

代码块

HTML

<!DOCTYPE html>
<html lang="en" >
<head>
  <meta charset="UTF-8">
  <title>CodePen - Merry Christmas</title>
  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/normalize/5.0.0/normalize.min.css">
<link rel="stylesheet" href="./src/style.css">

</head>
<body>
<!-- partial:index.partial.html -->
<svg viewport="0 0 300 300">
  <text class="Merry" x="150" y="50">Merry</text>
  <text class="Christmas" x="150" y="120">Christmas</text>
</svg>
<div class="Snow">
  <div class="Snow-flake"></div>
  <div class="Snow-flake"></div>
  <div class="Snow-flake"></div>
  <div class="Snow-flake"></div>
  <div class="Snow-flake"></div>
  <div class="Snow-flake"></div>
  <div class="Snow-flake"></div>
  <div class="Snow-flake"></div>
  <div class="Snow-flake"></div>
  <div class="Snow-flake"></div>
  <div class="Snow-flake"></div>
  <div class="Snow-flake"></div>
  <div class="Snow-flake"></div>
  <div class="Snow-flake"></div>
  <div class="Snow-flake"></div>
  <div class="Snow-flake"></div>
  <div class="Snow-flake"></div>
  <div class="Snow-flake"></div>
  <div class="Snow-flake"></div>
  <div class="Snow-flake"></div>
  <div class="Snow-flake"></div>
  <div class="Snow-flake"></div>
  <div class="Snow-flake"></div>
  <div class="Snow-flake"></div>
  <div class="Snow-flake"></div>
  <div class="Snow-flake"></div>
  <div class="Snow-flake"></div>
  <div class="Snow-flake"></div>
  <div class="Snow-flake"></div>
  <div class="Snow-flake"></div>
  <div class="Snow-flake"></div>
  <div class="Snow-flake"></div>
  <div class="Snow-flake"></div>
  <div class="Snow-flake"></div>
  <div class="Snow-flake"></div>
  <div class="Snow-flake"></div>
  <div class="Snow-flake"></div>
  <div class="Snow-flake"></div>
  <div class="Snow-flake"></div>
  <div class="Snow-flake"></div>
  <div class="Snow-flake"></div>
  <div class="Snow-flake"></div>
  <div class="Snow-flake"></div>
  <div class="Snow-flake"></div>
  <div class="Snow-flake"></div>
  <div class="Snow-flake"></div>
  <div class="Snow-flake"></div>
  <div class="Snow-flake"></div>
  <div class="Snow-flake"></div>
  <div class="Snow-flake"></div>
  <div class="Snow-flake"></div>
  <div class="Snow-flake"></div>
  <div class="Snow-flake"></div>
  <div class="Snow-flake"></div>
  <div class="Snow-flake"></div>
</div>
<div class="Love">
  <div class="Love-heart">❤</div>
  <div class="Love-text">猪猪圣诞快乐</div>
</div>
<!-- partial -->
  <script src='https://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.min.js'></script>
  <script  src="./src/script.js"></script>

</body>
</html>

JS

$('text').each(function () {
  const el = $(this);
  const text = el.html().split('');
  el.html(`<tspan>${text.join('</tspan><tspan>')}</tspan>`);
});

CSS

@import url(https://fonts.googleapis.com/css?family=Calligraffitti);
@-webkit-keyframes s {
  0% {
    stroke-dasharray: 0 300;
  }
  100% {
    stroke-dasharray: 300 0;
  }
}
@keyframes s {
  0% {
    stroke-dasharray: 0 300;
  }
  100% {
    stroke-dasharray: 300 0;
  }
}
@-webkit-keyframes f {
  0% {
    transform: translateY(-40px);
    opacity: 0.5;
  }
  50% {
    transform: scale(1.5);
    opacity: 0.1;
  }
  100% {
    transform: translateY(50vh);
    opacity: 0;
  }
}
@keyframes f {
  0% {
    transform: translateY(-40px);
    opacity: 0.5;
  }
  50% {
    transform: scale(1.5);
    opacity: 0.1;
  }
  100% {
    transform: translateY(50vh);
    opacity: 0;
  }
}
html {
  height: 100%;
}

body {
  background: #a32300;
  font-family: "Calligraffitti";
  height: 100%;
  text-align: center;
}

svg {
  margin-top: calc(50vh - 75px);
  width: 300px;
}

.Merry, .Christmas {
  fill: none;
  stroke: #fff;
  text-shadow: 0 0 14px #a32300;
  stroke-width: 4;
  stroke-dasharray: 0 100;
  text-anchor: middle;
}

.Merry {
  font-size: 44px;
}
.Merry tspan:nth-child(1) {
  -webkit-animation: s 2s 1s linear forwards;
          animation: s 2s 1s linear forwards;
}
.Merry tspan:nth-child(2) {
  -webkit-animation: s 2s 2s linear forwards;
          animation: s 2s 2s linear forwards;
}
.Merry tspan:nth-child(3) {
  -webkit-animation: s 2s 3s linear forwards;
          animation: s 2s 3s linear forwards;
}
.Merry tspan:nth-child(4) {
  -webkit-animation: s 2s 4s linear forwards;
          animation: s 2s 4s linear forwards;
}
.Merry tspan:nth-child(5) {
  -webkit-animation: s 2s 5s linear forwards;
          animation: s 2s 5s linear forwards;
}

.Christmas {
  font-size: 64px;
  stroke-width: 6;
}
.Christmas tspan:nth-child(1) {
  -webkit-animation: s 2s 6s linear forwards;
          animation: s 2s 6s linear forwards;
}
.Christmas tspan:nth-child(2) {
  -webkit-animation: s 2s 7s linear forwards;
          animation: s 2s 7s linear forwards;
}
.Christmas tspan:nth-child(3) {
  -webkit-animation: s 2s 8s linear forwards;
          animation: s 2s 8s linear forwards;
}
.Christmas tspan:nth-child(4) {
  -webkit-animation: s 2s 9s linear forwards;
          animation: s 2s 9s linear forwards;
}
.Christmas tspan:nth-child(5) {
  -webkit-animation: s 2s 10s linear forwards;
          animation: s 2s 10s linear forwards;
}
.Christmas tspan:nth-child(6) {
  -webkit-animation: s 2s 11s linear forwards;
          animation: s 2s 11s linear forwards;
}
.Christmas tspan:nth-child(7) {
  -webkit-animation: s 2s 12s linear forwards;
          animation: s 2s 12s linear forwards;
}
.Christmas tspan:nth-child(8) {
  -webkit-animation: s 2s 13s linear forwards;
          animation: s 2s 13s linear forwards;
}
.Christmas tspan:nth-child(9) {
  -webkit-animation: s 2s 14s linear forwards;
          animation: s 2s 14s linear forwards;
}

.Snow {
  position: absolute;
  filter: blur(1px);
  top: 0;
  left: 0;
  width: 100%;
  font-size: 0;
  height: 100%;
  overflow: hidden;
}
.Snow-flake {
  -webkit-animation: f 4s linear infinite;
          animation: f 4s linear infinite;
  display: inline-block;
  border-radius: 50%;
  background: #fff;
  margin: 0 10px 0;
  width: 10px;
  height: 10px;
  transform: translateY(-40px);
  opacity: 0.5;
}
.Snow-flake:nth-child(1) {
  -webkit-animation-delay: -3.6793681361s;
          animation-delay: -3.6793681361s;
}
.Snow-flake:nth-child(2) {
  -webkit-animation-delay: -0.4661163393s;
          animation-delay: -0.4661163393s;
}
.Snow-flake:nth-child(3) {
  -webkit-animation-delay: -3.4905253225s;
          animation-delay: -3.4905253225s;
}
.Snow-flake:nth-child(4) {
  -webkit-animation-delay: -2.7553831417s;
          animation-delay: -2.7553831417s;
}
.Snow-flake:nth-child(5) {
  -webkit-animation-delay: -0.7750134007s;
          animation-delay: -0.7750134007s;
}
.Snow-flake:nth-child(6) {
  -webkit-animation-delay: -2.5446368156s;
          animation-delay: -2.5446368156s;
}
.Snow-flake:nth-child(7) {
  -webkit-animation-delay: -1.5677614822s;
          animation-delay: -1.5677614822s;
}
.Snow-flake:nth-child(8) {
  -webkit-animation-delay: -2.3025289221s;
          animation-delay: -2.3025289221s;
}
.Snow-flake:nth-child(9) {
  -webkit-animation-delay: -2.2273608114s;
          animation-delay: -2.2273608114s;
}
.Snow-flake:nth-child(10) {
  -webkit-animation-delay: -2.8704051936s;
          animation-delay: -2.8704051936s;
}
.Snow-flake:nth-child(11) {
  -webkit-animation-delay: -3.1400586948s;
          animation-delay: -3.1400586948s;
}
.Snow-flake:nth-child(12) {
  -webkit-animation-delay: -0.3667266026s;
          animation-delay: -0.3667266026s;
}
.Snow-flake:nth-child(13) {
  -webkit-animation-delay: -1.7854983938s;
          animation-delay: -1.7854983938s;
}
.Snow-flake:nth-child(14) {
  -webkit-animation-delay: -0.3196037779s;
          animation-delay: -0.3196037779s;
}
.Snow-flake:nth-child(15) {
  -webkit-animation-delay: -1.964419289s;
          animation-delay: -1.964419289s;
}
.Snow-flake:nth-child(16) {
  -webkit-animation-delay: -2.791841093s;
          animation-delay: -2.791841093s;
}
.Snow-flake:nth-child(17) {
  -webkit-animation-delay: -2.0680800485s;
          animation-delay: -2.0680800485s;
}
.Snow-flake:nth-child(18) {
  -webkit-animation-delay: -1.3058220809s;
          animation-delay: -1.3058220809s;
}
.Snow-flake:nth-child(19) {
  -webkit-animation-delay: -3.4707126316s;
          animation-delay: -3.4707126316s;
}
.Snow-flake:nth-child(20) {
  -webkit-animation-delay: -0.6200169916s;
          animation-delay: -0.6200169916s;
}
.Snow-flake:nth-child(21) {
  -webkit-animation-delay: -1.3589008464s;
          animation-delay: -1.3589008464s;
}
.Snow-flake:nth-child(22) {
  -webkit-animation-delay: -3.2398063322s;
          animation-delay: -3.2398063322s;
}
.Snow-flake:nth-child(23) {
  -webkit-animation-delay: -2.6176651192s;
          animation-delay: -2.6176651192s;
}
.Snow-flake:nth-child(24) {
  -webkit-animation-delay: -3.8524291697s;
          animation-delay: -3.8524291697s;
}
.Snow-flake:nth-child(25) {
  -webkit-animation-delay: -0.4768476793s;
          animation-delay: -0.4768476793s;
}
.Snow-flake:nth-child(26) {
  -webkit-animation-delay: -3.4299640078s;
          animation-delay: -3.4299640078s;
}
.Snow-flake:nth-child(27) {
  -webkit-animation-delay: -2.3016890045s;
          animation-delay: -2.3016890045s;
}
.Snow-flake:nth-child(28) {
  -webkit-animation-delay: -0.5442387221s;
          animation-delay: -0.5442387221s;
}
.Snow-flake:nth-child(29) {
  -webkit-animation-delay: -0.0972386453s;
          animation-delay: -0.0972386453s;
}
.Snow-flake:nth-child(30) {
  -webkit-animation-delay: -3.7545507289s;
          animation-delay: -3.7545507289s;
}
.Snow-flake:nth-child(31) {
  -webkit-animation-delay: -2.6359017685s;
          animation-delay: -2.6359017685s;
}
.Snow-flake:nth-child(32) {
  -webkit-animation-delay: -3.5004651428s;
          animation-delay: -3.5004651428s;
}
.Snow-flake:nth-child(33) {
  -webkit-animation-delay: -3.0667933556s;
          animation-delay: -3.0667933556s;
}
.Snow-flake:nth-child(34) {
  -webkit-animation-delay: -3.8334187764s;
          animation-delay: -3.8334187764s;
}
.Snow-flake:nth-child(35) {
  -webkit-animation-delay: -3.4092893657s;
          animation-delay: -3.4092893657s;
}
.Snow-flake:nth-child(36) {
  -webkit-animation-delay: -3.0679398153s;
          animation-delay: -3.0679398153s;
}
.Snow-flake:nth-child(37) {
  -webkit-animation-delay: -0.5319986551s;
          animation-delay: -0.5319986551s;
}
.Snow-flake:nth-child(38) {
  -webkit-animation-delay: -0.2151432213s;
          animation-delay: -0.2151432213s;
}
.Snow-flake:nth-child(39) {
  -webkit-animation-delay: -3.1537248027s;
          animation-delay: -3.1537248027s;
}
.Snow-flake:nth-child(40) {
  -webkit-animation-delay: -3.2429406902s;
          animation-delay: -3.2429406902s;
}
.Snow-flake:nth-child(41) {
  -webkit-animation-delay: -1.4561511317s;
          animation-delay: -1.4561511317s;
}
.Snow-flake:nth-child(42) {
  -webkit-animation-delay: -2.5445790184s;
          animation-delay: -2.5445790184s;
}
.Snow-flake:nth-child(43) {
  -webkit-animation-delay: -1.5814941713s;
          animation-delay: -1.5814941713s;
}
.Snow-flake:nth-child(44) {
  -webkit-animation-delay: -3.0079767172s;
          animation-delay: -3.0079767172s;
}
.Snow-flake:nth-child(45) {
  -webkit-animation-delay: -0.1491416773s;
          animation-delay: -0.1491416773s;
}
.Snow-flake:nth-child(46) {
  -webkit-animation-delay: -0.0382036011s;
          animation-delay: -0.0382036011s;
}
.Snow-flake:nth-child(47) {
  -webkit-animation-delay: -1.3252301845s;
          animation-delay: -1.3252301845s;
}
.Snow-flake:nth-child(48) {
  -webkit-animation-delay: -0.5701800381s;
          animation-delay: -0.5701800381s;
}
.Snow-flake:nth-child(49) {
  -webkit-animation-delay: -0.0226088033s;
          animation-delay: -0.0226088033s;
}
.Snow-flake:nth-child(50) {
  -webkit-animation-delay: -3.028402928s;
          animation-delay: -3.028402928s;
}
.Snow-flake:nth-child(51) {
  -webkit-animation-delay: -0.9428044719s;
          animation-delay: -0.9428044719s;
}
.Snow-flake:nth-child(52) {
  -webkit-animation-delay: -1.4180933824s;
          animation-delay: -1.4180933824s;
}
.Snow-flake:nth-child(53) {
  -webkit-animation-delay: -1.1818536686s;
          animation-delay: -1.1818536686s;
}
.Snow-flake:nth-child(54) {
  -webkit-animation-delay: -1.8777931193s;
          animation-delay: -1.8777931193s;
}
.Snow-flake:nth-child(55) {
  -webkit-animation-delay: -1.1268303298s;
          animation-delay: -1.1268303298s;
}

.Love {
  position: absolute;
  background: #fff;
  bottom: 0;
  height: 44px;
  width: 100%;
  left: 0;
  color: #a32300;
}
.Love-heart, .Love-text {
  display: inline-block;
  font-family: sans-serif;
  line-height: 44px;
}

修改位置

//修改文字部分
  <div class="Love-text">猪猪圣诞快乐</div>

效果展示

🎊雪橇雪人圣诞贺卡

代码块

HTML

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>2022圣诞快乐 ♥ 猪猪</title>
    <link rel="stylesheet" href="style.css">
    <script src="./js/animation.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/3.9.1/gsap.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/3.9.1/ScrollTrigger.min.js"></script>
</head>
<body>
    <div class="box">
        <svg viewBox="0 0 800 596.74">
          <g id="merry">
            <path fill="#f2adab" d="M0 0h800v596.74H0z" />
            <path style="mix-blend-mode: multiply" id="shadow" fill="#eaeaea" d="M575.92 325.27L418 234.08l2.67-41.29-43.79 17.55-37.22-21.49a22.2 22.2 0 00-22.24 0L206.34 253c-13.39 2.93-29.72 7.25-32 8.17-3 1.24-40.93 33.92-58.91 37.29-12.35 2.31-28.09 18.51-36.75 28.45a21.87 21.87 0 00-6.43 7.78 22.5 22.5 0 00-2.19 11.89 22 22 0 0011 17.25L317.4 500.22a22 22 0 0014.6 2.69l.35.29 69.07-13.71 1.68-25.93 172.82-99.76a22.25 22.25 0 000-38.53z" />
            <g id="box1">
              <path fill="#eaeaea" style="mix-blend-mode: multiply" d="M178.66 204.15l-.8.17c-4-.57-10.11-.87-12.69 1.9a8.76 8.76 0 00-.8 1l-18.18 3.93-4.64 14.11-.64.32c-3.33 1.8-3 5.4-2.15 8.16l-.34 1L133 251.4l9.33 6.19 3.67-.8 1.28.85 30 19.87 19.21-4.15 9.66-2.09 22.85-4.94 5.45-16.64 2.29-7 4.51-13.78-30-19.87-1.24-.82.95-2.87-9.33-6.18z" />
              <path fill="#d36666" d="M280.62 236.01l-51.31-22.16V154.6l51.31 29.63v51.78z" />
              <path fill="#af5555" d="M177.99 236.03l51.31-22.16v-59.25l-51.31 29.62v51.79z" />
              <path fill="#db6a6a" d="M229.31 213.86v51.8l-22.69-13.1-9.59-5.53-19.04-11v-51.8l19.04 11 9.59 5.53 22.68 13.09.01.01z" />
              <path fill="#e87979" d="M280.62 184.23v51.79l-51.31 29.63v-51.79l51.31-29.63z" />
              <path fill="#e6e6e6" d="M280.62 181.38v9.69l-51.31 29.62v-9.68l51.31-29.63zM229.3 211v9.69l-51.31-29.62v-9.69L229.3 211z" style="mix-blend-mode: multiply" />
              <path fill="#ed8d8d" d="M229.3 218.76l-54.95-31.7v-14.03l22.81-13.13 9.59-5.52 22.86-13.18 22.61 13.05 9.58 5.53 22.76 13.17v13.99l-55.26 31.82z" />
              <path fill="#ed8e8e" d="M284.56 172.95l-22.87 13.15-9.57 5.53-22.82 13.15-28.54-16.49-6.19-3.57-20.22-11.69 22.81-13.13 9.59-5.52 22.86-13.18 22.61 13.05 9.58 5.53 22.76 13.17z" />
              <path fill="#e87979" d="M229.31 218.76l55.25-31.82v-13.99l-55.25 31.82v13.99z" />
              <path fill="#db6a6a" d="M174.35 173.06l54.95 31.71v13.99l-54.95-31.7v-14z" />
              <path fill="#ffcb8e" d="M261.8 159.81l-55.18 31.86-9.59-5.53 55.19-31.86 9.58 5.53z" />
              <path fill="#ffcb8e" d="M261.72 186.14l-9.57 5.53-.03-.01-54.96-31.73 9.59-5.52 54.94 31.72.03.01z" />
              <path fill="#ffcb8e" d="M261.72 246.95V186.13l-9.57 5.53V252.47l9.57-5.52zM206.62 191.66v60.9l-9.59-5.53v-60.9l9.59 5.53z" />
              <path fill="#e6e6e6" style="mix-blend-mode: multiply" d="M191.65 183.07a14.58 14.58 0 00-3.68 7.08c6.36-2.5 9.82 5 9.82 5-.17-3 3-6.86 3-6.86 11.92-11.78 20.38-11 20.38-11-7.31-5.7-26.27 3.47-29.52 5.78z" />
              <path fill="#ffcb8e" d="M222.65 171.51s-25.62-4.69-38.37 12.72c0 0 8.13-.49 10.22 6.22 0 0 12.9-14.8 27.14-13.07z" />
              <path fill="#e6e6e6" style="mix-blend-mode: multiply" d="M257.94 184.56s6.07 4.86 6.51 8.82c-6.45-1.71-11.56 5.36-11.56 5.36a24.63 24.63 0 00-1.52-6.68c-3.84-10.68-18-16-18-16 7.7-5.06 21.54 5.94 24.57 8.5z" />
              <path fill="#ffcb8e" d="M232.32 170.17s24.33-.66 35.56 17.76a13.4 13.4 0 00-12.56 5.45s-6.67-16.25-22.49-17.28z" />
              <path fill="#e6e6e6" style="mix-blend-mode: multiply" d="M233.75 173.68s20.83 4.22 24.41 1c2.22-2 1-17.37-9-14s-15.41 13-15.41 13z" />
              <path fill="#ffcb8e" d="M263.09 163.18s-5.84-13.35-13.71-12c-9.63 1.64-20.07 16.23-20.07 16.23l4.44 6.28z" />
              <path fill="#eab783" d="M233.75 173.68s25.57-19.82 29.34-10.5c4.68 11.59-29.34 10.5-29.34 10.5z" />
              <path fill="#e6e6e6" style="mix-blend-mode: multiply" d="M225 174.7s-29.38 3.34-30.44.75c-2.69-6.53 2.09-10.24 2.09-10.24s24.78-1.81 28.35 9.49z" />
              <path fill="#ffcb8e" d="M195.68 164.2s5.83-13.35 13.7-12c9.63 1.65 20.07 16.23 20.07 16.23L225 174.7z" />
              <path fill="#eab783" d="M225 174.7s-25.57-19.81-29.33-10.5C191 175.79 225 174.7 225 174.7z" />
            </g>
            <g id="box2">
              <path fill="#eaeaea" style="mix-blend-mode: multiply" d="M501.48 170.24l-.79.17c-4-.57-10.12-.87-12.69 1.9a7.8 7.8 0 00-.8 1l-18.2 3.95-4.64 14.11-.65.32c-3.32 1.79-3 5.4-2.14 8.16l-.34 1-5.47 16.61 9.33 6.18 3.67-.79 1.27.85 30 19.87 19.21-4.15 9.67-2.09 22.89-5 5.45-16.64 2.28-7 4.53-13.69-30-19.87-1.24-.82.94-2.87-9.33-6.19z" />
              <path fill="#d36666" d="M603.45 202.1l-51.32-22.16v-59.25l51.32 29.62v51.79z" />
              <path fill="#af5555" d="M500.81 202.12l51.32-22.16V120.7l-51.32 29.63v51.79z" />
              <path fill="#db6a6a" d="M552.14 179.95v51.8l-22.7-13.11-9.58-5.53-19.05-10.99v-51.8l19.05 11 9.58 5.53 22.68 13.09.02.01z" />
              <path fill="#e87979" d="M603.45 150.32v51.79l-51.31 29.63v-51.79l51.31-29.63z" />
              <path fill="#e6e6e6" d="M603.45 147.47v9.69l-51.31 29.61v-9.67l51.31-29.63zM552.12 177.09v9.68l-51.31-29.61v-9.69l51.31 29.62z" style="mix-blend-mode: multiply" />
              <path fill="#ed8d8d" d="M552.13 184.85l-54.96-31.71v-14.02l22.82-13.14 9.58-5.51 22.87-13.18 22.6 13.04 9.58 5.54 22.77 13.17v13.99l-55.26 31.82z" />
              <path fill="#ed8e8e" d="M607.39 139.04l-22.87 13.15-9.57 5.53-22.83 13.15-28.53-16.49-6.2-3.57-20.22-11.69 22.82-13.14 9.58-5.51 22.87-13.18 22.6 13.04 9.58 5.54 22.77 13.17z" />
              <path fill="#e87979" d="M552.13 184.85l55.26-31.82v-13.99l-55.26 31.81v14z" />
              <path fill="#db6a6a" d="M497.17 139.15l54.96 31.7v14l-54.96-31.71v-13.99z" />
              <path fill="#ffcb8e" d="M584.62 125.9l-55.18 31.86-9.58-5.53 55.18-31.87 9.58 5.54z" />
              <path fill="#ffcb8e" d="M584.54 152.23l-9.56 5.53-.03-.01-54.96-31.74 9.58-5.51 54.95 31.72.02.01z" />
              <path fill="#ffcb8e" d="M584.54 213.03v-60.81l-9.56 5.53v60.8l9.56-5.52zM529.44 157.75v60.89l-9.58-5.53v-60.89l9.58 5.53z" />
              <path fill="#e6e6e6" style="mix-blend-mode: multiply" d="M514.48 149.16a14.56 14.56 0 00-3.69 7.08c6.37-2.5 9.83 5 9.83 5-.17-3 3-6.86 3-6.86 11.91-11.78 20.38-11 20.38-11-7.31-5.71-26.27 3.47-29.52 5.78z" />
              <path fill="#ffcb8e" d="M545.47 137.6s-25.61-4.69-38.36 12.72c0 0 8.12-.49 10.22 6.21 0 0 12.9-14.79 27.14-13.06z" />
              <path fill="#e6e6e6" style="mix-blend-mode: multiply" d="M580.77 150.65s6.06 4.86 6.5 8.82c-6.45-1.71-11.56 5.36-11.56 5.36a24.45 24.45 0 00-1.51-6.68c-3.85-10.68-18-16-18-16 7.7-5.08 21.53 5.92 24.57 8.5z" />
              <path fill="#ffcb8e" d="M555.15 136.26s24.33-.67 35.56 17.76a13.42 13.42 0 00-12.57 5.45s-6.66-16.26-22.49-17.29z" />
              <path fill="#e6e6e6" style="mix-blend-mode: multiply" d="M556.58 139.77s20.83 4.22 24.41 1c2.22-2 1-17.37-9-14s-15.41 13-15.41 13z" />
              <path fill="#ffcb8e" d="M585.91 129.27s-5.83-13.36-13.7-12c-9.63 1.64-20.07 16.22-20.07 16.22l4.44 6.29z" />
              <path fill="#eab783" d="M556.58 139.77s25.57-19.82 29.33-10.5c4.69 11.59-29.33 10.5-29.33 10.5z" />
              <path fill="#e6e6e6" style="mix-blend-mode: multiply" d="M547.84 140.79s-29.39 3.34-30.45.75c-2.68-6.53 2.09-10.24 2.09-10.24s24.78-1.81 28.36 9.49z" />
              <path fill="#ffcb8e" d="M518.5 130.29s5.84-13.35 13.71-12c9.63 1.64 20.07 16.23 20.07 16.23l-4.44 6.28z" />
              <path fill="#eab783" d="M547.84 140.79s-25.57-19.79-29.34-10.5c-4.68 11.59 29.34 10.5 29.34 10.5z" />
            </g>
            <g id="box3">
              <path fill="#eaeaea" style="mix-blend-mode: multiply" d="M563.73 216.32l-.73.16c-3.73-.53-9.35-.81-11.73 1.76a7.46 7.46 0 00-.74.94l-16.8 3.63-4.29 13.05c-.21.09-.41.19-.6.29-3.07 1.66-2.79 5-2 7.54l-.32.95-5 15.35 8.62 5.71 3.39-.73 1.18.78 27.71 18.37 17.76-3.84 8.93-1.93 21.16-4.57 5-15.38 2.12-6.44 4.17-12.73-27.7-18.37-1.15-.76.88-2.65-8.59-5.71z" />
              <path fill="#d36666" d="M657.98 245.78l-47.43-20.49v-54.77l47.43 27.39v47.87z" />
              <path fill="#af5555" d="M563.12 245.79l47.43-20.48v-54.77l-47.43 27.38v47.87z" />
              <path fill="#db6a6a" d="M610.55 225.3v47.88l-20.97-12.11-8.86-5.12-17.61-10.16v-47.88l17.61 10.17 8.86 5.11 20.96 12.1.01.01z" />
              <path fill="#e87979" d="M657.98 197.91v47.87l-47.43 27.39V225.3l47.43-27.39z" />
              <path fill="#e6e6e6" d="M657.98 195.28v8.95l-47.43 27.38v-8.94l47.43-27.39zM610.54 222.66v8.95l-47.43-27.38v-8.95l47.43 27.38z" style="mix-blend-mode: multiply" />
              <path fill="#ed8d8d" d="M610.55 229.83l-50.8-29.31V187.56l21.09-12.14 8.86-5.1 21.13-12.18 20.89 12.06 8.86 5.11 21.04 12.18v12.93l-51.07 29.41z" />
              <path fill="#ed8e8e" d="M661.62 187.49l-21.14 12.15-8.84 5.11-21.1 12.16-26.38-15.25-5.72-3.29-18.69-10.81 21.09-12.14 8.86-5.1 21.13-12.18 20.89 12.06 8.86 5.11 21.04 12.18z" />
              <path fill="#e87979" d="M610.55 229.83l51.07-29.41v-12.93l-51.07 29.4v12.94z" />
              <path fill="#db6a6a" d="M559.75 187.59l50.8 29.3v12.94l-50.8-29.31v-12.93z" />
              <path fill="#ffcb8e" d="M640.58 175.34l-51 29.45-8.86-5.11 51-29.45 8.86 5.11z" />
              <path fill="#ffcb8e" d="M640.51 199.68l-8.85 5.11-.02-.01-50.8-29.33 8.86-5.1 50.78 29.31.03.02z" />
              <path fill="#ffcb8e" d="M640.51 255.88v-56.22l-8.85 5.12V260.98l8.85-5.1zM589.58 204.78v56.29l-8.86-5.12v-56.29l8.86 5.12z" />
              <path fill="#e6e6e6" style="mix-blend-mode: multiply" d="M575.75 196.84a13.45 13.45 0 00-3.41 6.55c5.88-2.32 9.08 4.64 9.08 4.64-.16-2.75 2.74-6.34 2.74-6.34 11-10.89 18.84-10.2 18.84-10.2-6.73-5.27-24.25 3.22-27.25 5.35z" />
              <path fill="#ffcb8e" d="M604.39 186.16s-23.67-4.34-35.46 11.75c0 0 7.51-.45 9.45 5.75 0 0 11.92-13.68 25.08-12.08z" />
              <path fill="#e6e6e6" style="mix-blend-mode: multiply" d="M637 198.22s5.6 4.49 6 8.15c-6-1.58-10.68 4.95-10.68 4.95a22.83 22.83 0 00-1.4-6.17c-3.56-9.87-16.68-14.8-16.68-14.8 7.18-4.68 19.97 5.48 22.76 7.87z" />
              <path fill="#ffcb8e" d="M613.34 184.91s22.49-.61 32.86 16.42a12.4 12.4 0 00-11.61 5s-6.16-15-20.79-16z" />
              <path fill="#e6e6e6" style="mix-blend-mode: multiply" d="M614.66 188.16s19.25 3.9 22.56 1c2-1.81.93-16-8.36-13s-14.2 12-14.2 12z" />
              <path fill="#ffcb8e" d="M641.77 178.45s-5.39-12.34-12.67-11.1c-8.9 1.52-18.55 15-18.55 15l4.11 5.81z" />
              <path fill="#eab783" d="M614.66 188.16s23.63-18.32 27.11-9.71c4.33 10.72-27.11 9.71-27.11 9.71z" />
              <path fill="#e6e6e6" style="mix-blend-mode: multiply" d="M606.58 189.1s-27.16 3.09-28.14.69a8 8 0 011.93-9.46s22.9-1.67 26.21 8.77z" />
              <path fill="#ffcb8e" d="M579.47 179.4s5.39-12.34 12.67-11.1c8.89 1.52 18.55 15 18.55 15l-4.11 5.8z" />
              <path fill="#eab783" d="M606.58 189.1s-23.63-18.31-27.11-9.7c-4.33 10.71 27.11 9.7 27.11 9.7z" />
            </g>
            <g>
              <path fill="#f3fbff" id="ground" d="M658.44 298.43a22 22 0 01-11 17.25L411.13 452.09a22.21 22.21 0 01-22.24 0l-236.3-136.41a22.26 22.26 0 010-38.53l236.3-136.43a22.21 22.21 0 0122.24 0l236.28 136.43a22.06 22.06 0 0111.03 21.28z" />
              <path fill="#e1f4fc" d="M658.44 332.84a21.94 21.94 0 01-11 17.25L411.13 486.5a22.21 22.21 0 01-22.24 0l-236.3-136.41a22 22 0 01-11-17.25 21.39 21.39 0 010-3.92l-.1-30.49h.1a22 22 0 0011 17.25l236.3 136.41a22.21 22.21 0 0022.24 0l236.28-136.41a22 22 0 0011-17.25v30.38a22.6 22.6 0 01.03 4.03z" />
              <path fill="#f3fbff" d="M144.62 284.94s20.63-41.22 70.88-37c0 0 22.21-12 25.67-20.42s17.92-20 25.43-22.74c10.23-3.77 15.1-12.21 23.94-15.68 11.61-4.55 21.22-2 31.76-5.89 8.26-3 46.43-45.43 73.72-38.75s27.52-2.81 39.29 0 24.85 20.79 36 23.61 45.13 11.64 49.52 19.42 23.71 32.29 39 33.2 32.39 10 40 14.85c23.57 15.14 52.1 45 52.1 45z" />
              <path fill="#e1f4fc" d="M379.25 365.8l-25.27-14.59 19.07-11.01 6.32 3.65-12.72 7.34 6.32 3.65 6.36-3.67 6.31 3.64-6.35 3.68 6.32 3.64 12.71-7.34 6.32 3.65-19.08 11.01-6.31-3.65zM341.26 358.55l6.32 3.65-.04 7.32-12.67.02-6.32-3.65-6.36 3.67 31.59 18.24 6.36-3.67-18.96-10.94 12.68-.02.04-7.32 18.95 10.94 6.36-3.67-31.59-18.24-6.36 3.67zM525.33 303.35l6.31 3.65-.04 7.31-12.67.03-6.32-3.65-6.36 3.67 31.59 18.24 6.36-3.67-18.95-10.94 12.67-.03.04-7.32 18.95 10.95 6.36-3.67-31.59-18.24-6.35 3.67zM398.48 325.52l-19.07 11L411 354.77l6.36-3.67-12.63-7.3h25.35l-6.32-3.65h-12.68l6.36-3.67zm6.28 11l-6.36 3.67-6.32-3.65 6.36-3.67zM436.14 354.61l-19.07 11 31.59 18.24 6.36-3.67-12.64-7.3 25.35-.05-6.32-3.64h-12.67l6.36-3.67zm6.28 11l-6.36 3.67-6.31-3.64 6.35-3.67zM423.91 310.84l-19.07 11 31.58 18.24 6.36-3.67-12.63-7.3h25.34l-6.31-3.65H436.5l6.36-3.67zm6.28 11l-6.36 3.68-6.32-3.65 6.36-3.67zM430.26 307.17l12.64 7.29 6.36-3.67 18.95 10.95 6.36-3.67-18.96-10.95 6.36-3.67-12.63-7.29-6.36 3.67 6.32 3.65-6.36 3.67-6.32-3.65-6.36 3.67zM385.49 384.09l-19.08 11.01L398 413.33l19.07-11.01-6.32-3.64-12.71 7.34-18.95-10.95 12.71-7.34-6.31-3.64zM391.84 380.42l31.59 18.23 6.36-3.67-12.64-7.29 6.36-3.67 12.63 7.29 6.36-3.67-31.58-18.24-6.36 3.67 12.63 7.3-6.36 3.67-12.63-7.29-6.36 3.67zM474.47 332.71l-19.07 11.01 18.95 10.95 12.71-7.35 6.32 3.65-12.71 7.34 6.31 3.65 19.07-11.01-18.95-10.94-12.71 7.34-6.32-3.65 12.72-7.34-6.32-3.65zM582.54 270.32l-19.07 11.01 18.95 10.94 12.71-7.34 6.32 3.65-12.71 7.34 6.32 3.64 19.07-11.01-18.96-10.94-12.71 7.34-6.32-3.65 12.72-7.34-6.32-3.64zM480.82 329.04l6.32 3.65 6.36-3.67 25.27 14.59 6.36-3.67-25.27-14.59 6.35-3.67-6.31-3.65-19.08 11.01zM538 296l31.59 18.24 6.35-3.67-12.63-7.3 6.36-3.67 12.63 7.29 6.36-3.67L557.11 285zm25.35-.05l-6.35 3.68-6.29-3.63 6.36-3.67z" />
              <path fill="#eaeaea" d="M328.55 365.89l6.32 3.65-.04 7.32-6.32-3.65.04-7.32zM347.54 369.52l-.02 3.66 6.34-.01.04-7.32 18.95 10.94 6.36-3.67-31.59-18.24-.04 7.32-.04 7.32zM341.18 373.19l18.96 10.94-6.36 3.67-12.64-7.29.04-7.32zM512.61 310.69l6.32 3.65-.04 7.31-6.32-3.64.04-7.32zM531.6 314.31l-.02 3.66 6.34-.01.04-7.32 18.95 10.95 6.36-3.67-31.59-18.24-.04 7.32-.04 7.31zM525.25 317.99l18.95 10.94-6.36 3.67-12.63-7.3.04-7.31zM366.65 351.19l6.32 3.65-.04 7.32-6.32-3.65.04-7.32zM379.29 358.49l6.32 3.64-.05 7.32-6.31-3.65.04-7.31zM398.32 354.79l6.32 3.65-6.36 3.67.04-7.32zM379.33 351.17l6.31 3.64-6.35 3.68.04-7.32zM373.05 340.2l6.32 3.65-6.36 3.67.04-7.32zM404.72 343.8l12.63 7.3-6.36 3.67-6.31-3.65.04-7.32zM430.15 329.12l12.63 7.3-6.36 3.67-6.31-3.65.04-7.32zM442.38 372.89l12.64 7.3-6.36 3.67-6.32-3.65.04-7.32zM430.07 343.76l-6.32-3.65-12.68.02 6.36-3.67-18.95-10.94-.04 7.32 6.32 3.65-.04 7.31 6.33-.01 19.02-.03zM455.5 329.08l-6.32-3.65-12.68.02 6.36-3.67-18.95-10.94-.04 7.32 6.32 3.65-.04 7.31 6.33-.01v-.01l19.02-.02zM467.73 372.85l-6.32-3.65-12.67.02 6.36-3.67-18.96-10.94-.03 7.32 6.31 3.64-.04 7.32 6.34-.01 19.01-.03zM398.4 340.16l-.04 7.31-6.32-3.64.04-7.32 6.32 3.65zM423.83 325.48l-.04 7.31-6.32-3.64.04-7.32 6.32 3.65zM436.06 369.24l-.04 7.32-6.31-3.65.04-7.31 6.31 3.64zM436.62 303.5l-.04 7.32 6.32 3.64.04-7.31-6.32-3.65zM455.61 307.12l6.36-3.67-12.63-7.29-.08 14.63 18.95 10.95 6.36-3.67-18.96-10.95zM582.54 270.32l-.04 7.31 6.36-3.67-6.32-3.64zM595.17 277.61l-.04 7.32 6.32 3.65-.04 7.31 12.72-7.34-18.96-10.94zM582.46 284.95l-.04 7.32-6.32-3.65.04-7.32 6.32 3.65zM557.11 285l-.04 7.32 6.32 3.64-.04 7.32 6.36-3.67 12.63 7.29 6.36-3.66L557.11 285zM557.03 299.63l-.04 7.32-6.32-3.65.04-7.31 6.32 3.64zM563.35 303.28l12.63 7.29-6.35 3.68-6.32-3.65.04-7.32zM499.9 318.03l-.04 7.32 6.35-3.67-6.31-3.65zM525.13 339.94l-6.36 3.67-19.1-10.94.19-7.32 25.27 14.59zM474.47 332.71l-.04 7.32 6.36-3.67-6.32-3.65zM474.39 347.35l-.04 7.32-6.32-3.65.04-7.32 6.32 3.65zM487.1 340.01l-.04 7.31 6.32 3.65-.04 7.32 12.71-7.34-18.95-10.94zM410.92 369.4l-.04 7.32 6.31 3.65-.04 7.32 6.36-3.67 12.63 7.29 6.36-3.67-31.58-18.24zM429.79 394.98l-6.36 3.67-6.32-3.65.04-7.31 12.64 7.29zM410.83 384.04l-.03 7.32-18.96-10.94 6.36-3.67 12.63 7.29zM385.49 384.09l-.04 7.31 6.35-3.67-6.31-3.64zM379.09 395.07l-.04 7.32L398 413.33l.04-7.31-18.95-10.95zM410.75 398.68l-.03 7.31 6.35-3.67-6.32-3.64z" style="mix-blend-mode: multiply" />
              <path fill="#e1f4fc" d="M442.96 351l31.59 18.23 6.31-3.65-31.58-18.23-6.32 3.65z" />
              <path fill="#eaeaea" d="M449.28 347.35v7.36l25.27 14.52 6.31-3.65-31.58-18.23z" style="mix-blend-mode: multiply" />
              <path fill="#e1f4fc" d="M398.45 455v34.41a22.28 22.28 0 01-9.56-2.93l-236.3-136.39a22 22 0 01-11-17.25 21.39 21.39 0 010-3.92l-.1-30.49h.1a22 22 0 0011 17.25l236.3 136.41a22.28 22.28 0 009.56 2.91z" />
              <path fill="#eaeaea" style="mix-blend-mode: multiply" d="M398.45 455v34.41a22.28 22.28 0 01-9.56-2.93l-236.3-136.39a22 22 0 01-11-17.25 21.39 21.39 0 010-3.92l-.1-30.49h.1a22 22 0 0011 17.25l236.3 136.41a22.28 22.28 0 009.56 2.91z" />
            </g>
            <g id="snowman-container">
              <g id="snowman">
                <g id="board">
                  <path fill="#e97171" d="M440.19 238.92l-119.76 69.13-3.87 2.23s-11.23 7.88-18.22-4.1c-1.73-3 .56-5.79 2.33-7.37a13.76 13.76 0 011.66-1.29 23.51 23.51 0 002.4 5.55c.07.09.12.19.2.28 1 1.49 2.31 2.62 3.85 2.44L368 271.6l36.23-20.92 28.16-16.26z" />
                  <path fill="#f2f2f2" style="mix-blend-mode: multiply" d="M404.24 250.68A48.14 48.14 0 01368 271.6zM320.41 308.07l-3.87 2.23s-11.23 7.88-18.22-4.1c-1.55-3 .63-5.79 2.33-7.37a13.76 13.76 0 011.66-1.29 23.51 23.51 0 002.4 5.55c.07.09.12.19.2.28 2.92 4.5 8.96 8.01 15.5 4.7z" />
                  <path fill="#e97171" d="M408.62 222l-71.52 41.29-48.25 27.85-3.85 2.26s-11.24 7.88-18.23-4.11c-1.73-3 .57-5.79 2.34-7.36a13.76 13.76 0 011.66-1.29 23.22 23.22 0 002.4 5.55c.06.09.12.19.19.28 1 1.48 2.31 2.62 3.86 2.44l59.25-34.22 36.23-20.92 28.17-16.26h.07z" />
                  <path fill="#f2f2f2" style="mix-blend-mode: multiply" d="M288.84 291.15L285 293.4s-11.24 7.88-18.23-4.11c-1.55-3 .63-5.79 2.34-7.36a13.76 13.76 0 011.66-1.29 23.22 23.22 0 002.4 5.55c.06.09.12.19.19.28 2.89 4.53 8.94 8 15.48 4.68zM408.62 222l-71.52 41.29a47 47 0 01-6.38-5.21l70.18-40.54z" />
                </g>
                <g id="snowman-body">
                  <g id="right-arm" class="arms">
                    <g id="stick-back">
                      <ellipse cx="305.78" cy="216.1" fill="#afc9e9" rx="1.11" ry="1.92" transform="matrix(.87 -.5 .5 .87 -67.09 181.84)" />
                      <ellipse cx="316.37" cy="209.99" fill="#afc9e9" rx="1.11" ry="1.92" transform="rotate(-30 316.3729 209.9919)" />
                      <path fill="#afc9e9" d="M304.68 214.56l10.69-6.21 1.98 3.29-10.48 6.02-2.19-3.1z" />
                      <path stroke="#afc9e9" stroke-linecap="round" stroke-miterlimit="10" stroke-width="1.2898" d="M372.7 177.47l-57.4 33.14M366.55 179l3.5 2.02" />
                    </g>
                    <path id="right-arm-1" fill="none" stroke="#ffcb8e" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2.5796" d="M333.78 198.65l-21.15 13.33" />
                  </g>
                  <circle cx="369.17" cy="216.92" r="48.26" fill="#fff" />
                  <path fill="#f2f2f2" d="M409.23 243.83a48.26 48.26 0 11-67-67 48.26 48.26 0 0067 67z" />
                  <circle cx="341.65" cy="210.86" r="3.09" fill="#666" />
                  <circle cx="340.46" cy="224.44" r="3.09" fill="#666" />
                  <circle cx="345.68" cy="239.33" r="3.09" fill="#666" />
      
                  <g id="left-arm" class="arms">
                    <path id="left-arm-1" fill="none" stroke="#ffcb8e" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2.5796" d="M392.3 210.83l-15.86 17.5" />
                    <g id="stick-front">
                      <ellipse cx="371.21" cy="231.43" fill="#afc9e9" rx="1.11" ry="1.92" transform="rotate(-30 371.2098 231.4254)" />
                      <ellipse cx="381.8" cy="225.31" fill="#afc9e9" rx="1.11" ry="1.92" transform="rotate(-30 381.8096 225.3056)" />
                      <path fill="#afc9e9" d="M370.11 229.88l10.69-6.2 1.97 3.28-10.48 6.03-2.18-3.11z" />
                      <path stroke="#afc9e9" stroke-linecap="round" stroke-miterlimit="10" stroke-width="1.2898" d="M438.13 192.79l-57.4 33.14M431.98 194.32l3.5 2.02" />
                    </g>
                  </g>
                </g>
      
                <g id="snoman-head" class="head">
                  <g id="snoman-head-base">
                    <circle cx="353.86" cy="169.88" r="30.62" fill="#fff" />
                    <path fill="#f2f2f2" d="M379.28 187a30.62 30.62 0 11-42.5-42.5 30.63 30.63 0 0042.5 42.5z" />
                  </g>
                  <g id="snaman-face">
                    <circle cx="349.85" cy="176.86" r="3.09" fill="#666" />
                    <circle cx="332.39" cy="174.38" r="3.09" fill="#666" />
                    <path fill="#931a25" d="M338.31 182.84l-5.92 3.42" />
                    <path fill="#ffcb8e" d="M339.28 184.51l-6.45 2.49a.91.91 0 01-.89-1.56l5.4-4.32a2 2 0 012.45 3.06 2.38 2.38 0 01-.51.33z" />
                  </g>
                </g>
      
                <g id="hat" class="head">
                  <ellipse id="hat-btm" cx="354.16" cy="149.88" fill="none" stroke="#fff" stroke-miterlimit="10" stroke-width="6.7717" rx="22.3" ry="11.68" />
                  <path id="hat-1" fill="#e97171" d="M332.84 146.29s.5-29.83 83.76-19.16c0 0-42.88 25.53-45.39 26.57 0 0-33.76 16.5-38.37-7.41z" />
                  <circle id="hat-ball" cx="417.43" cy="127.17" r="5.99" fill="#fff" />
                </g>
              </g>
            </g>
            <g id="box4">
              <path fill="#eaeaea" style="mix-blend-mode: multiply" d="M217 456.54l-.79.17c-4-.57-10.12-.87-12.7 1.9a7.73 7.73 0 00-.79 1l-18.18 3.93-4.65 14.12-.64.31c-3.32 1.8-3 5.41-2.15 8.16l-.33 1-5.47 16.61 9.33 6.19 3.67-.8 1.28.85 30 19.87 19.21-4.15 9.66-2.09 22.9-4.95 5.45-16.64 2.29-7 4.51-13.77-30-19.88-1.23-.82.94-2.87-9.31-6.09z" />
              <path fill="#d36666" d="M318.99 488.41l-51.32-22.16v-59.26l51.32 29.63v51.79z" />
              <path fill="#af5555" d="M216.35 488.42l51.32-22.16v-59.25l-51.32 29.63v51.78z" />
              <path fill="#db6a6a" d="M267.68 466.25v51.8l-22.7-13.1-9.58-5.53-19.05-11v-51.8l19.05 11 9.58 5.53 22.68 13.09.02.01z" />
              <path fill="#e87979" d="M318.99 436.62v51.8l-51.31 29.62v-51.79l51.31-29.63z" />
              <path fill="#e6e6e6" d="M318.99 433.78v9.68l-51.31 29.62v-9.68l51.31-29.62zM267.66 463.39v9.69l-51.31-29.62v-9.68l51.31 29.61z" style="mix-blend-mode: multiply" />
              <path fill="#ed8d8d" d="M267.67 471.15l-54.96-31.7v-14.02l22.82-13.14 9.58-5.52 22.86-13.18 22.61 13.05 9.58 5.53 22.77 13.17v14l-55.26 31.81z" />
              <path fill="#ed8e8e" d="M322.93 425.34l-22.87 13.15-9.57 5.53-22.83 13.15-28.54-16.49-6.19-3.57-20.22-11.68 22.82-13.14 9.58-5.52 22.86-13.18 22.61 13.05 9.58 5.53 22.77 13.17z" />
              <path fill="#e87979" d="M267.67 471.15l55.26-31.81v-14l-55.26 31.82v13.99z" />
              <path fill="#db6a6a" d="M212.71 425.46l54.96 31.7v13.99l-54.96-31.7v-13.99z" />
              <path fill="#ffcb8e" d="M300.16 412.2l-55.18 31.86-9.58-5.53 55.18-31.86 9.58 5.53z" />
              <path fill="#ffcb8e" d="M300.08 438.53l-9.57 5.53-.02-.01-54.96-31.73 9.58-5.52 54.95 31.72.02.01z" />
              <path fill="#ffcb8e" d="M300.08 499.34V438.52l-9.57 5.53V504.86l9.57-5.52zM244.98 444.05v60.9l-9.58-5.53v-60.9l9.58 5.53z" />
              <path fill="#e6e6e6" style="mix-blend-mode: multiply" d="M230 435.47a14.5 14.5 0 00-3.69 7.08c6.37-2.51 9.82 5 9.82 5-.16-3 3-6.86 3-6.86 11.92-11.78 20.39-11 20.39-11-7.3-5.69-26.26 3.47-29.52 5.78z" />
              <path fill="#ffcb8e" d="M261 423.91s-25.61-4.69-38.36 12.71c0 0 8.12-.48 10.22 6.22 0 0 12.9-14.8 27.14-13.07z" />
              <path fill="#e6e6e6" style="mix-blend-mode: multiply" d="M296.31 437s6.06 4.86 6.5 8.82c-6.45-1.71-11.56 5.36-11.56 5.36a24.45 24.45 0 00-1.51-6.68c-3.85-10.67-18-16-18-16 7.7-5.12 21.53 5.88 24.57 8.5z" />
              <path fill="#ffcb8e" d="M270.69 422.56s24.33-.66 35.56 17.77a13.4 13.4 0 00-12.57 5.44s-6.66-16.25-22.49-17.28z" />
              <path fill="#e6e6e6" style="mix-blend-mode: multiply" d="M272.11 426.07s20.84 4.22 24.42 1.05c2.22-2 1-17.37-9-14s-15.42 12.95-15.42 12.95z" />
              <path fill="#ffcb8e" d="M301.45 415.57s-5.83-13.35-13.71-12c-9.62 1.65-20.07 16.23-20.07 16.23l4.44 6.28z" />
              <path fill="#eab783" d="M272.11 426.07s25.57-19.81 29.34-10.5c4.69 11.59-29.34 10.5-29.34 10.5z" />
              <path fill="#e6e6e6" style="mix-blend-mode: multiply" d="M263.38 427.1s-29.39 3.33-30.45.74c-2.68-6.53 2.09-10.24 2.09-10.24s24.78-1.81 28.36 9.5z" />
              <path fill="#ffcb8e" d="M234 416.6s5.83-13.36 13.71-12c9.63 1.64 20.07 16.22 20.07 16.22l-4.44 6.29z" />
              <path fill="#eab783" d="M263.38 427.1s-25.57-19.82-29.38-10.5c-4.64 11.59 29.38 10.5 29.38 10.5z" />
            </g>
            <circle class="snow-clone" id="snow" cx="115.05" cy="117.16" r="6.97" fill="#ffffff" />
            <path fill="white" id="hover" opacity="0" d="M658.44 298.43a22 22 0 01-11 17.25L411.13 452.09a22.21 22.21 0 01-22.24 0l-236.3-136.41a22.26 22.26 0 010-38.53l236.3-136.43a22.21 22.21 0 0122.24 0l236.28 136.43a22.06 22.06 0 0111.03 21.28z" />
          </g>
        </svg>
      </div>
</body>
<script src="myscript.js"></script>
</html>

JS

const hatEase = "Sine.easeInOut";
let hatDuration = 0.3;

const hatTl = gsap.timeline({
    repeat: -1,
    yoyo: true,
})
.to('#hat-1',{
    morphSVG: "M332.84 146.29s-3.54-36.88 76.59-39.21c0 0-23.41 39.65-38.22 46.62 0 0-33.76 16.5-38.37-7.41z",
    ease: hatEase,
    duration: hatDuration,
},0)
.to('#hat-ball',{
    x: -10,
    y: -20,
    ease: hatEase,
    duration: hatDuration,
},0)

gsap.set('#snowman',{
    x: -30,
    y: -30,
})

gsap.set('#snowman-body',{
    x: -5,
    y: -3,
    rotate: 10,
    transformOrigin: '30% 40%',
})

const skingEase = "Sine.easeInOut";
const skingTl = gsap.timeline({
    repeat: -1,
    yoyo: true,
})
.to('#snowman',{
    x: 30,
    y: 15,
    ease: skingEase,
},"ski-right")
.to('#snowman-body',{
    x: 3,
    y: 3,
    rotate: -3,
    transformOrigin: 'center',
    ease: skingEase,
},"ski-right")
// .to('.head',{
//     x: 2,
//     y: 2,
//     ease: skingEase,
// },"ski-right")

skingTl.timeScale(0.4)

const speedTl = gsap.timeline({
    paused: true,
    // repeat: -1,
})
.to('#snowman-container',{
    x: -50,
    y: 20,
},0)
.to('.head',{
    x: -20,
    y: 20,
},0)
.to('#snaman-face',{
    x: -3,
    y: 3,
},0)
.to('.arms',{
    x: -10,
    y: 5,
},0)
.to('#stick-back',{
    x: 0,
    y: -5,
},0)
.to('#stick-front',{
    x: 0,
    y: -8,
},0)
.to('#left-arm-1',{
    rotate: 20,
    transformOrigin: 'right top',
},0)
.to('#right-arm-1',{
    rotate: 10,
    transformOrigin: 'right top',
},0)

function resetPosition(){
    gsap.to('#snowman-container',{ x: 0, y: 0, })
    gsap.to('.head',{ x: 0, y: 0, })
    gsap.to('#snaman-face',{ x: 0, y: 0, })
    gsap.to('.arms',{ x: 0, y: 0, })
    gsap.to('#stick-back',{ x: 0, y: 0, })
    gsap.to('#snowman-container',{ x: 0, y: 0, })
    gsap.to('#stick-front',{ x: 0, y: 0, })
    gsap.to('#left-arm-1',{ rotate: 0, })
    gsap.to('#right-arm-1',{ rotate: 0, })
}


for (let i = 0; i < 20; i++) {
    let snow = document.querySelector("#snow").cloneNode(true);
    gsap.set(snow, {
        attr: {
            cx: "115.05",
            cy: "117.16",
            r: "6.97",
            fill: "#fff"
        },
        scale: "random(0.5, 1)",
        x: -100 + (i * 15),
        y: 200 + (i * 10),
        opacity: 0,
    });
    document.querySelector("svg").appendChild(snow);

    const snowTl = gsap.timeline({
        repeat: -1,
    })
    .to(snow, {
        x: (i * 15) + 350,
        y: (i * 5),
        duration: "random(0.8, 1)",
    },0)
    .to(snow, {
        opacity: 1,
        duration: 0.1,
    },0)
    .to(snow, {
        opacity: 0,
        duration: 0.4,
    },"-=0.4")
    .seek(100)

    
}


const svg = document.getElementById("hover");

svg.addEventListener('mouseover', () => {
    hatTl.timeScale(1.8);
    skingTl.timeScale(0.9);
    speedTl.restart();
})
svg.addEventListener('mouseleave', () => {
    hatTl.timeScale(1);
    skingTl.timeScale(0.4);
    resetPosition();
})

CSS

body {
    width: 100%;
    height: 100vh;
    overflow: hidden;
    background: #f2adab;
  }
  
  .box {
    position: fixed;
    left: calc(50vw - 50vmin);
    top: calc(50vh - 37.5vmin);
    width: 100vmin;
    height: 75vmin;
  }
  
  svg {
    overflow: visible;
  }
  
  #snow {
    pointer-events: none;
  }
  
  .snow-clone {
    opacity: 0;
  }

效果展示

🎊祝福语圣诞贺卡

代码块

HTML

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/0.9.0/p5.min.js"></script>
  <script src="https://cdn.jsdelivr.net/npm/typed.js@2.0.12"></script>

  <title>2022圣诞 | 给猪猪的礼物</title>
  <!-- Tailwind CSS einbinden -->
  <link href="https://unpkg.com/tailwindcss@^2/dist/tailwind.min.css" rel="stylesheet">
  <style>
    body { background-color:#333; }
    #snow{
        background:none;
        font-family:Androgyne;
        background-image:url('https://www.iculture.cc/demo/Christmas/v7/img/ChQcWgQ.png'), url('https://www.iculture.cc/demo/Christmas/v7/img/5gvatHT.png'), url('https://www.iculture.cc/demo/Christmas/v7/img/pUPB6gi.png');
        height:100%;
        left:0;
        position:absolute;
        pointer-events:none;
        top:0;width:100%;
        z-index:1;
        -webkit-animation:snow 10s linear infinite;
        -moz-animation:snow 10s linear infinite;
        -ms-animation:snow 10s linear infinite;
        animation:snow 10s linear infinite
    }
    @keyframes snow{
        0%{background-position:0px 0px, 0px 0px, 0px 0px}
        50%{background-position:500px 500px, 100px 200px, -100px 150px}
        100%{background-position:500px 1000px, 200px 400px, -100px 300px}
    }
    @-moz-keyframes snow{
        0%{background-position:0px 0px, 0px 0px, 0px 0px}
        50%{background-position:500px 500px, 100px 200px, -100px 150px}
        100%{background-position:400px 1000px, 200px 400px, 100px 300px}
    }
    @-webkit-keyframes snow{
        0%{background-position:0px 0px, 0px 0px, 0px 0px}
        50%{background-position:500px 500px, 100px 200px, -100px 150px}
        100%{background-position:500px 1000px, 200px 400px, -100px 300px}
    }
    @-ms-keyframes snow{
        0%{background-position:0px 0px, 0px 0px, 0px 0px}
        50%{background-position:500px 500px, 100px 200px, -100px 150px}
        100%{background-position:500px 1000px, 200px 400px, -100px 300px}
    }

.letter {
  background: #fff;
  box-shadow: 0 0 10px rgba(0,0,0,0.3);
  margin: 26px auto 0;
  max-width: 550px;
  min-height: 300px;
  padding: 24px;
  position: relative;
  width: 80%;
}
.letter:before, .letter:after {
  content: "";
  height: 98%;
  position: absolute;
  width: 100%;
  z-index: -1;
}
.letter:before {
  background: #fafafa;
  box-shadow: 0 0 8px rgba(0,0,0,0.2);
  left: -5px;
  top: 4px;
  transform: rotate(-2.5deg);
}
.letter:after {
  background: #f6f6f6;
  box-shadow: 0 0 3px rgba(0,0,0,0.2);
  right: -3px;
  top: 1px;
  transform: rotate(1.4deg);
}

CSS JSResult Skip Results Iframe
EDIT ON
/* style.css */

html, body {
  height: 100%;
}

body {
  margin: 0;
  display: flex;

  /* This centers our sketch horizontally. */
  justify-content: center;

  /* This centers our sketch vertically. */
  align-items: center;
  
 
}
.polaroid a {
        background: #ffffff;
        display: inline-block;
        margin: 55px 75px 30px;
        padding: 15px 15px 30px;
        text-align: center;
        text-decoration: none;
        -webkit-box-shadow: 0 4px 6px rgba(0, 0, 0, .3);
        -moz-box-shadow: 0 4px 6px rgba(0, 0, 0, .3);
        box-shadow: 0 4px 6px rgba(0, 0, 0, .3);
        -webkit-transition: all .20s linear;
        -moz-transition: all .20s linear;
        transition: all .20s linear;
        z-index: 0;
        position: relative;
        transform: rotate(-9deg);
      }
      .polaroid a:after {
        color: #333;
        font-size: 25px;
        content: attr(title);
        position: relative;
        top: 15px;
      }
      .polaroid img {
        display: block;
        width: 250px;
      }
      .polaroid a:hover {
        -webkit-transform: scale(1.2);
        -moz-transform: scale(1.2);
        transform: scale(1.2);
        z-index: 10;
        -webkit-box-shadow: 0 10px 20px rgba(0, 0, 0, .7);
        -moz-box-shadow: 0 10px 20px rgba(0, 0, 0, .7);
        box-shadow: 0 10px 20px rgba(0, 0, 0, .7);
      }
 </style>

</head>
<body class="bg-black">
  <div class=" font-sans leading-normal tracking-wide py-8" id="snow">
    <div class="letter">
        <div id="typed-strings">
            <p> 情意绵绵,喜乐常。事事如意,人安康。风花雪月,圣诞至。祝福千万,表衷肠。家和兴旺,亲人吉祥,事业中天,学业辉煌。圣诞节快乐!</p>
        </div>
        <span id="typed"></span>
        <div class="polaroid">
            <a href="#" title="猪猪">
                <img height="250" src="https://www.iculture.cc/icon/logo.png" alt="Pig" title="Pig" />
            </a>
         </div>
    </div>
  </div>
  <script>
  var typed = new Typed('#typed', {
    stringsElement: '#typed-strings',
    typeSpeed: 50
  });
</script>
  <script>

const WANDERER_MOVE_MULTIPLIER = 8;
const WANDERER_ROTATE_SPEED = 0.03; // very sensitive

const PATH_WIDTH = 5;
const PATH_HIGHLIGHT_WIDTH = 4;

const LIGHT_GRAPHICS_WIDTH_HEIGHT = 60;

const MAX_BULBS = 300;
const BULB_COLORS = [
  '#00d9ff',
  '#ff0d0d',
  '#59ff9d',
  '#b959ff'
];
const BULB_LAST_INDEX = BULB_COLORS.length - 1;
const BULB_FREQUENCY = 200;

let node;
let pathGraphics;
let bulbGraphics = [];

let bulbs = [];
let bulbTick = 0;
let bulbFlip = false;
let bulbColorIndex = 0;
let bulbInterval = null;
let done = false;

function setup()  {
  createCanvas(window.windowWidth, window.windowHeight);
  background(20);
  
  node = new Wanderer();
  
  pathGraphics = createGraphics(width, height);
  pathGraphics.noFill();
  pathGraphics.strokeCap(PROJECT);
  
  BULB_COLORS.forEach((color) => {
    bulbGraphics.push(getBulbGraphics(color));
  });
  
  bulbInterval = setInterval(() => {
    if(bulbs.length < MAX_BULBS) {
       addBulb();
    } else {
      clearInterval(bulbInterval);
      done = true;
    }
  }, BULB_FREQUENCY)
}

function draw() {
  background(20);
  
  if(!done) {
    node.render();
  }
  
  image(pathGraphics, 0, 0);
  bulbs.forEach((bulb) => bulb.render());
}

function addBulb() {
  const pos = node.getPosition();
  const direction = node.getDirection();
  bulbs.push(new Bulb(pos.x, pos.y, direction - (bulbFlip ? PI : 0), bulbGraphics[bulbColorIndex]));
  bulbFlip = !bulbFlip;
  bulbColorIndex += 1;
  
  if(bulbColorIndex > BULB_LAST_INDEX) {
    bulbColorIndex = 0;
  }
}

function drawBulb(graphics, color) {
  graphics.fill(color);
  graphics.noStroke();
  
  graphics.beginShape();
  graphics.vertex(-4, 0);
  graphics.vertex(-6, -5);
  graphics.vertex(-7, -10);
  graphics.vertex(-8, -15);
  graphics.vertex(0 - 7, -20);
  graphics.vertex(-4, -25);
  graphics.vertex(0, -27);
  graphics.vertex(0, 0);
  graphics.endShape();
  graphics.beginShape();
  graphics.vertex(4, 0);
  graphics.vertex(6, -5);
  graphics.vertex(7, -10);
  graphics.vertex(8, -15);
  graphics.vertex(7, -20);
  graphics.vertex(4, -25);
  graphics.vertex(0, -27);
  graphics.vertex(0, 0);
  graphics.endShape();
  
  graphics.fill('#378a2e');
  graphics.rect(0, 0, 10, 5);
}

function getBulbGraphics(color) {
  const graphics = createGraphics(LIGHT_GRAPHICS_WIDTH_HEIGHT, LIGHT_GRAPHICS_WIDTH_HEIGHT);
  graphics.rectMode(CENTER);
  
  const startX = graphics.width * 0.5;
  const startY = graphics.height - 10;
  
  graphics.translate(startX, startY - 45);
  graphics.rotate(PI);
  graphics.scale(1.2);
  
  // draw the bulb once
  drawBulb(graphics, color);
  
  // blur the bulb
  graphics.filter(BLUR, 8);
  graphics.scale(0.8);
  
  // draw the bulb again to give a glow effect
  drawBulb(graphics, color);
  return graphics;
}

class Wanderer {
  constructor() {
    this.pos = { x: random(width), y: random(height) };
    this.lastPos = { ...this.pos }
    this.direction = random(TWO_PI);
    this.noiseValue = 0;
  }
  getPosition() {
    return { x: this.pos.x, y: this.pos.y };
  }
  getDirection() {
    return this.direction;
  }
  render() {
    this.lastPos = { ...this.pos }
    
    const xx = cos(this.direction) * WANDERER_MOVE_MULTIPLIER;
    const yy = sin(this.direction) * WANDERER_MOVE_MULTIPLIER;
    
    this.pos.x += xx;
    this.pos.y += yy;
    this.direction = noise(this.noiseValue += WANDERER_ROTATE_SPEED) * TWO_PI;
    
    let pathBroken = false;
    if(this.pos.y > height) {
      pathBroken = true;
      this.pos.y = 0;
    } else if(this.pos.y < 0) {
      pathBroken = true;
      this.pos.y = height;
    }
    
    if(this.pos.x > width) {
      pathBroken = true;
      this.pos.x = 0;
    } else if(this.pos.x < 0) {
      pathBroken = true;
      this.pos.x = width;
    }
    
    if(pathBroken) {
      this.lastPos = { ...this.pos }
    }
    
    pathGraphics.strokeWeight(PATH_WIDTH);
    pathGraphics.stroke('#378a2e');
    pathGraphics.line(this.pos.x, this.pos.y, this.lastPos.x, this.lastPos.y);
    pathGraphics.strokeWeight(PATH_HIGHLIGHT_WIDTH);
    pathGraphics.stroke('#42c134');
    pathGraphics.line(this.pos.x + 1, this.pos.y - 2, this.lastPos.x + 1, this.lastPos.y - 2);
  }
}

class Bulb {
  constructor(x, y, direction, bulbImage) {
    this.bulbImage = bulbImage;
    this.pos = { x, y };
    this.direction = direction;
    this.halfImageWidth = this.bulbImage.width * 0.5;
  }
  render() {
    push();
    translate(this.pos.x, this.pos.y);
    
    // const dir = atan2(this.pos.y - mouseY, this.pos.x - mouseX);
    rotate(this.direction);
    image(this.bulbImage, -this.halfImageWidth, 0);
    pop();
  }
}

  </script>
</body>
</html>

修改位置

<div id="typed-strings">
            <p> 情意绵绵,喜乐常。事事如意,人安康。风花雪月,圣诞至。祝福千万,表衷肠。家和兴旺,亲人吉祥,事业中天,学业辉煌。圣诞节快乐!</p>
        </div>



//修改文字部分

效果展示

🧧源码获取方式 

圣诞树|圣诞贺卡 网站源码https://blog.csdn.net/dxt19980308?type=download


        美酒,在酒杯中摇曳;灯火,在夜色中阑珊;幸福,在生活中陶醉;快乐,在节日中开怀;飞雪,在吉祥中飘落;问候,在真挚中送达。

   希望大家在圣诞节都可以和喜欢的人在一起,送上那棵专属于她or他的圣诞树🎄🎄🎄!

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐