200行Html5+CSS3+JS代码实现动态圣诞树

 一、前言  

备注:

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

三、步骤

1.下载VSCode

VSCode

  • 在Hbuilder、idea运行也是可以的,这里推荐使用VSCode

2.配置插件

文件名字要和这个一样,不然会出错),保存别忘了

  • 对于文件的层级问题,三个index .html   domtree.css   domtree.js 在同一级文件夹内不要修改,如果在下一个层级或者上面一个层级需要改动选择
  • 在index.html代码界面,默认键Alt+B 或者 鼠标右击,选择倒数第三个Open In  Default  Browser默认浏览器打开
  • 4.添加额外功能

    修改背景:

  • src="音乐地址",把想要播放的音乐,提前放到这个文件夹中,把这个音乐的命名填入src中就可以播放音乐
  • hidden="true"表示隐藏音乐播放按钮,hidden="false"开启音乐播放按钮
  • autostart="true" 打开网页加载完后自动播放
  • loop="true"循环播放 如仅想播放一次则为:loop="false"
  • 修改卡片上的内容:

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

    四、编码实现

    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,dfn,em,strong,var{font-style:normal;font-weight:normal;}
    li{list-style:none;}
    caption,th{text-align:left;}
    /* h1,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,select{font-family:inherit;font-size:inherit;font-weight:inherit;outline-style:none;outline-width:0pt;}
    legend{color:#000;}
    a:focus,object,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,100%,color-stop(0%,#b72424),color-stop(100%,#492727));
    	background: -webkit-radial-gradient(center,#492727 100%);
    	background: radial-gradient(center,#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;
    }

    Html代码: 

    <!DOCTYPE html>
    <html lang="en">
        <head>
    		<meta charset="utf-8">
    
    		<meta name="description" content="A Christmas tree built out of form elements." />
    		<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" />
    
    		<link href='https://fonts.googleapis.com/css?family=Armata' rel='stylesheet' type='text/css'>
    
        </head>
        <body>
        	<div class="tree"></div>
    
    		<script src="domtree.js"></script>
    
    		<!-- Third party scripts and sharing UI -->
    		<p class="project-title">DOM Tree</p>
    
    		<div class="credits">
    			<a href="https://blog.csdn.net/qq_53673551?spm=1000.2115.3001.5343">知心宝贝</a>
    			<a href="https://twitter.com/hakimel">文章代码参考@hakimel</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,0.7);
    				border: 2px solid rgba(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>

    JS代码: 

    const width = 500;
    const height = 600;
    const quantity = 150;
    const types = [ 'text','select','progress','meter','button','radio','checkbox' ];
    const greetings = [ '知心宝贝','知心宝贝','Merry Christmas','12月25','Happy Holidays',' 知心宝贝','知心宝贝' ];
    let tree = document.querySelector( '.tree' ),treeRotation = 0;
    
    tree.style.width = width + 'px';
    tree.style.height = height + 'px';
    
    window.addEventListener( 'resize',resize,false );
    
    // The tree
    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,y = Math.round( Math.random() * height );
    
    	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' );
    				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' );
    			element.setAttribute( 'max','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 );
    }
    
    // Let it snow
    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,rz = 0;
    
    	if( Math.random() > 0.5 ) element.setAttribute( 'checked','' );
    
    	element.style.transform = `translate3d(${x}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();
    

    附录:

    零基础必看的Html5+Css3+移动端前端教程(一)

    零基础必看的Html5+Css3+移动端前端教程(二)

    零基础必看的Html5+Css3+移动端前端教程(三)

    零基础必看的Html5+Css3+移动端前端教程(四)

    零基础必看的Html5+Css3+移动端前端教程(五)

    原文地址:https://blog.csdn.net/qq_53673551

    版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

    相关推荐


    Css常用的排序方式权重分配 排序方式: 1、按类型&#160;如,显示和浮动、定位、尺寸、字体等 2、按字母&#160;按字母顺序排列,优点是规则简单 3、按定义长度&#160;按照样式定义的字符长度排列 各有优劣,实际应用中,推荐使用第一种。&#160;但是如果单靠前端工程师在编写过程中这么做的
    原文:https://www.cnblogs.com/wenruo/p/9732704.html 先上效果 基本是用CSS实现的,没有用图片,加一丢丢JS。不过没有考虑太多兼容性。 首先画一个 &lt;!DOCTYPE html&gt;&lt;html lang=&quot;en&quot;&gt;
    css属性:word-wrap:break-word; 与 word-break:break-all 的用法; zhangq0123 于 2016-10-19 11:06:12 发布 6475 收藏 9分类专栏: CSS HTML 文章标签: html css版权 CSS同时被 2 个专栏收录8 篇
    https://destiny001.gitee.io/color/
    &lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Transitional//EN&quot; &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&quot;&gt; &l
    css之background的cover和contain的缩放背景图 对于这两个属性,官网是这样解释的: contain 此时会保持图像的纵横比并将图像缩放成将适合背景定位区域的最大大小。 等比例缩放图象到垂直或者水平其中一项填满区域。 cover 此时会保持图像的纵横比并将图像缩放成将完全覆盖背景
    .CSS.MAP文件作用 https://blog.csdn.net/qq_36441169/article/details/102575563 1、简介在写前端代码,使用bootstrap时,发现同一个目录下,不仅仅有.css文件的同时,还存在.css.map文件的存在。在前端页面调试时也发现,映
    Jquery mobile 写html时文字太长无法自动换行。 Jquery mobile 1 篇文章0 订阅 订阅专栏 加上这个 style=&quot;word-wrap:break-word;word-break:break-all;&quot; 或者 style=&quot;word-wra
    详见:http://www.shagua.wiki/project/3 layui图标:http://www.shagua.wiki/project/3?p=85 JQ手册 :https://www.jc2182.com/jquery/jquery-jiaocheng.html css样式手册:ht
    css里面圆形的代码,如何使用纯css实现圆形图像或叶子图像?(代码实例) 网易美学于&#160;2021-08-03 22:15:22&#160;发布946&#160;收藏 文章标签:&#160;css里面圆形的代码 有没有想过如何制作那些各式各样的圆形图像而无需用ps,本篇文章就来给你介绍一下如
    css文字超出一行就显示省略号 1,css超出一行用点表示 white-space:nowrap; overflow:hidden; text-overflow:ellipsis; 2,css超出二行用点表示 overflow:hidden; text-overflow:ellipsis; disp
    js动态追加数据单独设置某一个元素的样式。 在开发时,我们有很多数据是从后台获取然后展示的,例如列表,最近开发碰到个需求是获取到列表信息之后,不仅仅是拼接展示出来,还需要将其中的第一个li元素设置成其他的样式类,在网上找了一堆的办法都和自身业务需求不一致,没办法自己通过chrome控制台一点点调试,
    css3手机端h5商品列表页,两列等分排列技巧 .picture_list {&#x9;width: 100%;&#x9;overflow: hidden}.picture_list&gt;li {&#x9;width: 50%; min-height: 120px;&#x9;float: left;&#x9;padding: 0px 3
    css3 transform:scale(x)实现字体的缩放: css3 transform:scale(x)字体的缩放: transform:scale(x),针对于整体的缩放,缩放的整体包括宽,高,背景。这自然对于内联元素就无法使用此属性,最好使用无属性的span转换成块元素或者行内块元素进行设
    jq获取第一个子元素并添加class &lt;div class=&quot;main&quot;&gt; &lt;div class=&quot;tit&quot;&gt;颜色&lt;/div&gt; &lt;ul&gt; &lt;li&gt;银色&lt;/li&gt; &lt;li&gt;深灰色
    设置背景图片的两种方式,并解决手机端背景图片高度自适应问题 赵世婷&#160;2017-09-19 15:59:43 14372 收藏&#160;5 1 设置背景图片的两种方式: 方式一: .back{undefinedposition: fixed;width: 100%;height: 100%
    css层级选择器理论{#ek) E:first-child : 匹配的是E元素,E元素是父元素的第一个子元素 说明:利用 :first-child 这个伪类,只有当元素是另一个元素的第一个子元素时才能匹配。例如,p:first-child 会选择作为另外某个元素第一个子元素的所有 p 元素。一般可能
    Css多行字符截取方法详解 时间:2021-07-01 10:21:17 相信有很多同学在写前端页面的时候,都会遇到字符长了需要截取的问题,最简单的方法就是手动去截取,可这样又感觉太low了,今天晚上就来讲讲利用css进行字符的截取,不了解css是如何截取的同学可以和我们一起看看哦! 前言 最近在做
    css中content可以用到的字符编码 项目中用到的一些特殊字符和图标 html代码 &lt;div class=&quot;cross&quot;&gt;&lt;/div&gt; css代码.cross{width: 20px;height: 20px;border-radius: 10px;b
    CSS 计算属性 calc()的完整指南(上) 2020-05-03 CSS tricks上有一系列的完整指南文章,我后面会翻译这些内容,更新不会一下子完成,而是会分成几个,防止自己因看到文章过长而放弃翻译,一步一个脚印。 CSS有一个特殊的calc()函数,用于做基本的数学运算。下面是一个例子: