圣诞节马上就要到了,不知道给自己喜欢的人准备什么样的惊喜吗?作为一名程序员,当然是用编程制作专属于她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 sensitiveconst 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 oncedrawBulb(graphics, color);// blur the bulbgraphics.filter(BLUR, 8);graphics.scale(0.8);// draw the bulb again to give a glow effectdrawBulb(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他的圣诞树🎄🎄🎄!