前端简单动态圣诞树动画(HTML、js、css)

news2024/11/16 17:43:07

效果展示:

 注释:

  • 整体圣诞树分为3个部分,书的主干、粒子特效、树上的卡片
  • 树上的卡片(重点):每一张卡片上都有一个名字,代表圣诞树的叶子,后面可以根据自己需求更改,比如全部改成喜欢人的名字,在JS代码的第五行内更改内容
  • 树的动态旋转通过js实现、主干是HTML5、样式CSS

构建文件页面:

  • 在桌面新建一个空的文件夹,用VSCode打开
  • 在VSCode新建三个文件 index .html   domtree.css   domtree.js  (文件名字要和这个一样,不然会出错),保存别忘了
  • 对于文件的层级问题,三个index .html   domtree.css   domtree.js 在同一级文件夹内不要修改,如果在下一个层级或者上面一个层级需要改动选择
  • 在index.html代码界面,默认键Alt+B 或者 鼠标右击,选择倒数第三个Open In  Default  Browser默认浏览器打开

代码实现:

 HTML:

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

<head>
	<meta charset="utf-8">
	<meta name="description" content="一个由表单元素构建的圣诞树。" />
	<meta name="author" content="Hakim El Hattab" />
	<meta http-equiv="X-UA-Compatible" content="chrome=1">
	<title>耀南.DOM Tree</title>
	<link href="domtree.css" rel="stylesheet" media="screen" /> <!-- 引用外部的 CSS 文件 -->
	<link href='https://fonts.googleapis.com/css?family=Armata' rel='stylesheet' type='text/css'> <!-- 引用 Google 字体 -->
</head>

<body>
	<div class="tree"></div> <!-- 用于显示 DOM 树的容器 -->
	<script src="domtree.js"></script> <!-- 引用外部的 JavaScript 文件 -->
	<!-- 第三方脚本和分享 UI -->
	<!-- src属性指定了音频文件的路径。autoplay属性设置为true表示自动播放音频,loop属性设置为true表示循环播放音频。hidden属性用于隐藏音频播放器。 -->
	<!-- <embed src="./d097_5915_926d_6fecd684bf63cc9120aac307ea49206c.mp3" hidden="true" autostart="true" loop="true"> -->
	<audio src="./d097_5915_926d_6fecd684bf63cc9120aac307ea49206c.mp3" autoplay loop hidden></audio>
	<p class="project-title">DOM Tree</p> <!-- 项目标题 -->
	<div class="credits">
		<a href="https://blog.csdn.net/YN2000609?spm=1000.2115.3001.5343">耀南.</a>
		<a href="https://blog.csdn.net/YN2000609?spm=1000.2115.3001.5343">文章代码参考@耀南.</a>
	</div>

	<style type="text/css" media="screen">
		.project-title {
			position: absolute;
			left: 25px;
			bottom: 20px;

			font-size: 16px;
			color: #fff;
		}

		.credits {
			position: absolute;
			right: 20px;
			bottom: 25px;
			font-size: 15px;
			z-index: 20;
			color: #fff;
			vertical-align: middle;
		}

		.credits *+* {
			margin-left: 15px;
		}

		.credits a {
			padding: 8px 10px;
			color: rgba(255, 255, 255, 0.7);
			border: 2px solid rgba(255, 255, 255, 0.7);
			text-decoration: none;
		}

		.credits a:hover {
			border-color: #fff;
			color: #fff;
		}

		@media screen and (max-width: 1040px) {
			.project-title {
				display: none;
			}

			.credits {
				width: 100%;
				left: 0;
				right: auto;
				bottom: 0;
				padding: 30px 0;
				background: #b72424;
				text-align: center;
			}

			.credits a {
				display: inline-block;
				margin-top: 7px;
				margin-bottom: 7px;
			}
		}
	</style>

	<script>
		var _gaq = [['_setAccount', 'UA-15240703-1'], ['_trackPageview']];
		(function (d, t) {
			var g = d.createElement(t),
				s = d.getElementsByTagName(t)[0];
			g.async = true;
			g.src = ('https:' == location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
			s.parentNode.insertBefore(g, s);
		})(document, 'script');
	</script>

</body>

</html>

css代码:

 
/*********************************************
 * RESET
 *********************************************/
 
 html{color:#000;background:#222222;}
 a{cursor:pointer;}
 html,body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,code,form,fieldset,legend,input,textarea,p,blockquote,th,td{margin:0;padding:0;}
 table{border-collapse:collapse;border-spacing:0;}
 fieldset,img{border:0;}
 address,caption,cite,code,dfn,em,strong,th,var{font-style:normal;font-weight:normal;}
 li{list-style:none;}
 caption,th{text-align:left;}
 /* h1,h2,h3,h4,h5,h6{font-size:100%;} */
 q:before,q:after{content:'';}
 abbr,acronym {border:0;font-variant:normal;}
 sup {vertical-align:text-top;}
 sub {vertical-align:text-bottom;}
 input,textarea,select{font-family:inherit;font-size:inherit;font-weight:inherit;outline-style:none;outline-width:0pt;}
 legend{color:#000;}
 a:focus,object,h1,h2,h3,h4,h5,h6{-moz-outline-style: none; border:0px;}
 /*input[type="Submit"]{cursor:pointer;}*/
 strong {font-weight: bold;}
  
  
 /*********************************************
  * GLOBAL
  *********************************************/
  
 body, html {
     overflow: hidden;
     font-family: Helvetica, Arial, sans-serif;
     color: #fff;
     font-size: 11px;
  
     width: 100%;
     height: 100%;
  
     background: #b72424;
     background: -moz-radial-gradient(center, ellipse cover, #b72424 0%, #492727 100%);
     background: -webkit-gradient(radial, center center, 0px, center center, 100%, color-stop(0%,#b72424), color-stop(100%,#492727));
     background: -webkit-radial-gradient(center, ellipse cover, #b72424 0%,#492727 100%);
     background: radial-gradient(center, ellipse cover, #b72424 0%,#492727 100%);
 }
  
 @keyframes spin {
     0% { transform: rotateY( 0deg ); }
     100% { transform: rotateY( 360deg ); }
 }
  
 body {
     perspective: 3000px;
     perspective-origin: 0 20%;
 }
  
 .tree {
     margin: 0 auto;
     position: relative;
     animation: spin 18s infinite linear;
     transform-origin: 50% 0;
     transform-style: preserve-3d;
 }
  
 .tree * {
     position: absolute;
     transform-origin: 0 0;
 }

修改背景色:

 Css代码的第39到43行,可以更改不同的背景颜色或者背景图片,鼠标放在红色的框上面会出现,上图所示的一个颜色选择,拉动就可以选择不同的颜色背景

修改音频: 

  • 在index.html代码中的第23行添加下列代码:                                                            <embed src="song.mp3" hidden="false" autostart="true" loop="true">
  • src="音乐地址",把想要播放的音乐,提前放到这个文件夹中,把这个音乐的命名填入src中就可以播放音乐
  • hidden="true"表示隐藏音乐播放按钮,hidden="false"开启音乐播放按钮
  • autostart="true" 打开网页加载完后自动播放
  • loop="true"循环播放 如仅想播放一次则为:loop="false"

 修改卡片上的内容:

  • 圣诞树上面的卡片是由不同的类型的,有的卡片可以下拉查看下面的内容
  • 圣诞树上面的卡片是可以修改内容的,在JS代码的第五行的const greetings = [  ]修改,把里面的内容换成你想要的就行,如果叶子不够,在后面还可以加入。

js代码:

const width = 500; // 树的宽度
const height = 600; // 树的高度
const quantity = 150; // 元素数量
const types = ['text', 'select', 'progress', 'meter', 'button', 'radio', 'checkbox']; // 元素类型
const greetings = ['耀南.', '耀南.', 'Merry Christmas', 'Merry Christmas', 'Merry Christmas', 'Merry Christmas', '耀南.', '12月25', '耀南.', 'Merry Christmas', 'Happy Holidays', ' 耀南.', '12月25', '耀南.', 'Merry Christmas', '耀南.', 'Merry Christmas', '耀南.']; // 问候语数组
let tree = document.querySelector('.tree'), // 树容器
  treeRotation = 0;

tree.style.width = width + 'px'; // 设置树的宽度
tree.style.height = height + 'px'; // 设置树的高度

window.addEventListener('resize', resize, false); // 监听窗口大小变化

// 树的元素
for (var i = 0; i < quantity; i++) {
  let element = null,
    type = types[Math.floor(Math.random() * types.length)], // 随机选择元素类型
    greeting = greetings[Math.floor(Math.random() * greetings.length)]; // 随机选择问候语

  let x = width / 2, // 元素初始位置的 x 坐标
    y = Math.round(Math.random() * height); // 元素初始位置的 y 坐标

  let rx = 0, // 元素初始旋转角度
    ry = Math.random() * 360,
    rz = -Math.random() * 15;

  let elemenWidth = 5 + ((y / height) * width / 2), // 元素宽度根据位置调整
    elemenHeight = 26; // 元素高度固定

  switch (type) {
    case 'button':
      element = document.createElement('button');
      element.textContent = greeting; // 设置按钮文本为问候语
      element.style.width = elemenWidth + 'px';
      element.style.height = elemenHeight + 'px';
      break;
    case 'progress':
      element = document.createElement('progress');
      element.style.width = elemenWidth + 'px';
      element.style.height = elemenHeight + 'px';
      if (Math.random() > 0.5) {
        element.setAttribute('max', '100'); // 设置进度条的最大值为 100
        element.setAttribute('value', Math.round(Math.random() * 100)); // 设置进度条的当前值为随机数
      }
      break;
    case 'select':
      element = document.createElement('select');
      element.setAttribute('selected', greeting); // 设置选中项为随机选择的问候语
      element.innerHTML = '<option>' + greetings.join('</option><option>') + '</option>'; // 生成选项列表
      element.style.width = elemenWidth + 'px';
      element.style.height = elemenHeight + 'px';
      break;
    case 'meter':
      element = document.createElement('meter');
      element.setAttribute('min', '0'); // 设置表尺的最小值为 0
      element.setAttribute('max', '100'); // 设置表尺的最大值为 100
      element.setAttribute('value', Math.round(Math.random() * 100)); // 设置表尺的当前值为随机数
      element.style.width = elemenWidth + 'px';
      element.style.height = elemenHeight + 'px';
      break;
    case 'text':
    default:
      element = document.createElement('input');
      element.setAttribute('type', 'text');
      element.setAttribute('value', greeting); // 设置输入框的初始值为问候语
      element.style.width = elemenWidth + 'px';
      element.style.height = elemenHeight + 'px';
  }

  element.style.transform = `translate3d(${x}px, ${y}px, 0px) rotateX(${rx}deg) rotateY(${ry}deg) rotateZ(${rz}deg)`; // 设置元素的初始位置和旋转角度

  tree.appendChild(element); // 添加元素到树中
}

// 下雪效果
for (var i = 0; i < 200; i++) {
  let element = document.createElement('input');
  element.setAttribute('type', 'radio');

  let spread = window.innerWidth / 2;

  let x = Math.round(Math.random() * spread) - (spread / 4),
    y = Math.round(Math.random() * height),
    z = Math.round(Math.random() * spread) - (spread / 2);

  let rx = 0,
    ry = Math.random() * 360,
    rz = 0;

  if (Math.random() > 0.5) element.setAttribute('checked', '');

  element.style.transform = `translate3d(${x}px, ${y}px, ${z}px) rotateX(${rx}deg) rotateY(${ry}deg) rotateZ(${rz}deg)`; // 设置元素的初始位置和旋转角度

  tree.appendChild(element); // 添加元素到树中
}

function resize() {
  tree.style.top = ((window.innerHeight - height - 100) / 2) + 'px'; // 调整树的位置
}

resize(); // 页面加载时初始化树的位置

觉得不错就请给个赞叭,可以分享给你的好友!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1339155.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

最大公约和最小公倍数 C语言xdoj183

问题描述&#xff1a; 输入两个正整数 m 和 n&#xff0c;求其最大公约数和最小公倍数。 输入说明&#xff1a; 输入两个正整数 m 和 n。 输出说明&#xff1a; 输出 m 和 n 的最大公约数和最小公倍数。 输入样例&#xff1a; 8 12 输出样例&#xff1a; 4 24 #include <std…

【自然语言处理】第3部分:识别文本中的个人身份信息

自我介绍 做一个简单介绍&#xff0c;酒架年近48 &#xff0c;有20多年IT工作经历&#xff0c;目前在一家500强做企业架构&#xff0e;因为工作需要&#xff0c;另外也因为兴趣涉猎比较广&#xff0c;为了自己学习建立了三个博客&#xff0c;分别是【全球IT瞭望】&#xff0c;【…

linux系统 CentOS Tomcat 部署论坛

jdk安装命令&#xff1a;yum -y install java-1.8.0-openjdk-devel.x86_64 结尾上显示下图为成功 检查jdk环境是否配置成功命令&#xff1a;java -version或javac 显示版本 显示信息 mysql安装&#xff1a; 检查是否存mariadb数据库&#xff1a;rpm -qa | grep mariad 卸载ma…

基于JetCache整合实现一级、二级缓存方案(方案实现)

目录 一、整体方案说明 1.1 需求说明 1.2 整体方案实现组件结构图 二、Caffeine缓存实现 2.1 组件说明 2.2 组件结构图 2.3 组件Maven依赖 2.4 组件功能实现源码 2.4.1 CaffeineCacheManager扩展实现 2.4.2 CaffeineConfiguration配置类实现 2.4.3 涉及其他组件的类 …

Java EE 网络原理之HTTP 响应详解

文章目录 1. 认识"状态码"(status code)2. 通过 form 表单构造 HTTP 请求3. 通过 ajax 构造 HTTP 请求 1. 认识"状态码"(status code) 表示了这次请求对应的响应&#xff0c;是什么样的状态 &#xff08;成功&#xff0c;失败&#xff0c;其他的情况&…

Vue学习之第一、二章——Vue核心与组件化编程

第一章. Vue核心 1.1 Vue简介 1.1.1 官网 英文官网: https://vuejs.org/中文官网: https://cn.vuejs.org/ 1.1.2 Vue特点 遵循 MVVM 模式编码简洁, 体积小, 运行效率高, 适合移动/PC 端开发它本身只关注 UI, 也可以引入其它第三方库开发项目 1.2 初始Vue 这里可以参考&a…

Kali Linux如何启动SSH并在Windows系统远程连接

文章目录 1. 启动kali ssh 服务2. kali 安装cpolar 内网穿透3. 配置kali ssh公网地址4. 远程连接5. 固定连接SSH公网地址6. SSH固定地址连接测试 简单几步通过[cpolar 内网穿透](cpolar官网-安全的内网穿透工具 | 无需公网ip | 远程访问 | 搭建网站)软件实现ssh 远程连接kali! …

Java 基础学习第一弹

1. equels和的区别 equals方法用于比较对象的内容是否相等&#xff0c;可以根据自定义的逻辑来定义相等的条件&#xff0c;而操作符用于比较对象的引用是否相等&#xff0c;即它们是否指向同一块内存地址。equals方法是一个 实例方法&#xff0c;可以被所有的Java对象调用&…

文章解读与完整程序——《考虑“源-荷-储”协同互动的主动配电网优化调度研究》

摘要&#xff1a;伴随智能电网的建设和清洁能源的开发利用,配电网中的负荷类型呈现多元化发展,分布式电源、可控负荷、储能等资源的增加让单向潮流的传统配电网逐渐向双向潮流的主动配电网结构转变。在能源结构转变的同时,清洁能源自身的随机性和波动性给配电网带来了更大的调峰…

再获认可!棱镜七彩荣获ISC2023数字安全创新能力百强

12月27日&#xff0c;由北京经济和信息化局、通州区政府指导&#xff0c;中关村科技园区通州园管理委员会、ISC 平台主办&#xff0c;北京通州发展集团有限公司、赛迪顾问协办的数字安全技术创新论坛暨ISC 2023数字安全创新能力百强颁奖典礼在北京阳光国际会议中心成功举办&…

YOLOv8可视化:引入多种可视化CAM方法,为科研保驾护航

💡💡💡本文内容:调用pytorch下的CAM可视化库,支持十多种可视化方法,打开“黑盒”,让YOLOv8变得相对可解释性 收录 YOLOv8原创自研 https://blog.csdn.net/m0_63774211/category_12511737.html?spm=1001.2014.3001.5482 💡💡💡全网独家首发创新(原创),适…

实习知识整理10: 渲染默认地址以及实现渲染并选择其他地址

1. 渲染默认地址思路分析 &#xff08;1&#xff09;如果我们需要获取到默认地址可以通过userId从地址表中查找&#xff0c;因为从商品详情页点击购买按钮时&#xff0c;只传递商品的相关信息&#xff0c;所以我们就需要从session中获取用户的信息userId &#xff08;2&#…

INS量测更新

基础知识 1、ZK H X V 2、V ZK -HX 3、K Pk/k-1HT/(HPk/k-1HT R) 主要更新以下两个方程 4、Xk/k Xk/k-1 KV &#xff08;&#xff09; 5、Pk/k Pk/k-1 - KHPk/k-1 (I -KH)Pk/k-1; 剖析4和5两个方程&#xff0c;Xk/k-1,Pk/k-1时间更新已经更新完了&#x…

【软件工程大题】PAD图

常见题型:流程图转换为PAD图,伪代码转换为PAD图 PAD图基本要素 图解: (1) 选择分支,在P1和P2的左边标记 T or F (2) 如果只有if 没有else 省略即可(如不画P2),其余不变 (3) while C 的意思是 C为假的时候,跳出循环 until C 的意思是 C为真的时候,跳出循环 真题实战 题目…

高压放大器的使用方法是什么

高压放大器是一种重要的电子设备&#xff0c;其主要功能是放大输入信号的电压&#xff0c;并输出更高电压的信号。它在各种工业、实验室和研究领域都有着广泛的应用。下面安泰电子官网将详细介绍高压放大器的使用方法以及相关注意事项。 高压放大器是一种专门用于将低电压信号转…

C语言操作符逻辑与,逻辑或面试真题(2)

各位少年&#xff1a; 今天给大家分享几个代码示例&#xff0c;希望能帮助能从学习的方面&#xff0c;帮助大家。 #include<stdio.h> int main() { int i0,a0,b2,c3,d4; ia&&b&&d; printf("a%d\n b%d\n c%d\nd%d",a,b,c,d); return 0; } 大…

经验分享:构建知识库管理系统只需要这几步

导语&#xff1a; 在当今信息爆炸的时代&#xff0c;构建一个高效的知识库管理系统对于企业来说至关重要。一个好的知识库管理系统可以帮助企业集中管理和共享知识和信息&#xff0c;提高团队的协作效率和创新能力。本文将分享构建知识库管理系统的几个关键步骤&#xff0c;帮…

Spring之提前编译:AOT

学习的最大理由是想摆脱平庸&#xff0c;早一天就多一份人生的精彩&#xff1b;迟一天就多一天平庸的困扰。各位小伙伴&#xff0c;如果您&#xff1a; 想系统/深入学习某技术知识点… 一个人摸索学习很难坚持&#xff0c;想组团高效学习… 想写博客但无从下手&#xff0c;急需…

git将分支代码传到Master上

先把更改的代码commit、push到github自己的分支上&#xff0c;在github上Heart&#xff08;自己&#xff09;分支上能看到提交后再进行下面操作。git checkout Master &#xff0c;切换到Master主干道git pull ,把Master上最新代码pull下来git merge Heart&#xff0c;合并到自…

【小黑嵌入式系统第十三课】PSoC 5LP第二个实验——中断控制实验

上一课&#xff1a; 【小黑嵌入式系统第十二课】μC/OS-III程序设计基础&#xff08;二&#xff09;——系统函数使用场合、时间管理、临界区管理、使用规则、互斥信号量 文章目录 1 实验目的2 实验要求3 实验设备4 实验原理4.1 中断(1) 中断机制概述(2) 中断源(3) 中断系统的功…