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