用html5开发随机生成的大树,你应该没想到40+行代码就可以搞定了吧~接下来就跟大家说说这棵大树是如何在html5开发中实现的。
成都创新互联成立于2013年,我们提供高端重庆网站建设、成都网站制作、网站设计、网站定制、成都全网营销推广、小程序开发、微信公众号开发、seo优化服务,提供专业营销思路、内容策划、视觉设计、程序开发来完成项目落地,为成都电动窗帘企业提供源源不断的流量和订单咨询。
同样必须要有html容器。新建Index.html,代码如下:
、html
1 、head
2 、meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /
3 、titlecanvas tree
4 、/head
5 、body
6 、script type="text/javascript" src="tree.js"
7 、/body
8 、/html
接下来咱们开始tree.js:
、var canvas = document.createElement("canvas");
9 var ctx = canvas.getContext("2d");
10 canvas.width = 640;
11 canvas.height = 480;
12 document.body.appendChild(canvas);
代码很好理解,创建一个canvas画布,然后选择为2d画布,设置长宽,最后将这个画布添加到body标签下。
这个脚本最重要的函数在下面,大树就是递归调用这个函数实现的,调用一次画一条线段:
var drawTree = function (ctx, startX, startY, length, angle, depth, branchWidth){
13 var rand = Math.random,
14 newLength, newAngle, newDepth, maxBranch = 3,
15 endX, endY, maxAngle = 2 * Math.PI / 4,
16 subBraches;
17 ctx.beginPath();
18 ctx.moveTo(startX, startY);
19 endX = startX + length * Math.cos(angle);
20 endY = startY + length * Math.sin(angle);
21 ctx.lineCap = 'round';
22 ctx.lineWidth = branchWidth;
23 ctx.lineTo(endX, endY);
24 if (depth = 2){
25 ctx.strokeStyle = 'rgb(0,' + (((rand() * 64) + 128) 0) + ',0)';
26 } else {
27 ctx.strokeStyle = 'rgb(' + (((rand() * 64) + 64) 0) + ',50,25)';
28 }
29 ctx.stroke();
30 newDepth = depth - 1;
31 if (!newDepth)
32 return;
33 subBranches = (rand() * (maxBranch - 1)) + 1;
34 branchWidth *= 0.7;
35 for (var i = 0; i subBranches; i++){
36 newAngle = angle + rand() * maxAngle - maxAngle * 0.5;
37 newLength = length * (0.7 + rand() * 0.3);
38 drawTree(ctx, endX, endY, newLength, newAngle, newDepth, branchWidth);
39 }
40 }
接下来一点点解释:
首先,解释下各个变量的含义。ctx就是前面我们的2d画布;startX是线段开始的横坐标,同理startY是纵坐标;length是线段长度;angle是角度;depth是深度,叶子深度为1,树干为12(可自己设定);branchWidth就线段的粗细。有了这些信息,其实就描述了一个线段,通过这些信息我们才能画一个线段。
接下来又很可耻地一大段定义:
var rand = Math.random,
41 newLength, newAngle, newDepth, maxBranch = 3,
42 endX, endY, maxAngle = 2 * Math.PI / 4,
43 subBraches;
rand其实就是随机一个0~1之间的实数,顾名思义,接下来这些new的就是下一节线段的各种参数。maxBranch就是最多有3个分叉,最大的角度 PI/2 即为,下一级调整角度在90%范围内。subBranches就是分叉的个数。
好了,重要可以画了:
ctx.beginPath();
44 ctx.moveTo(startX, startY);
45 endX = startX + length * Math.cos(angle);
46 endY = startY + length * Math.sin(angle);
47 ctx.lineCap = 'round';
48 ctx.lineWidth = branchWidth;
49 ctx.lineTo(endX, endY);
beginPath()表示告诉浏览器“我要开始画了!”,把之前的记录放弃了,这点有点像ps。moveTo()把光标移动到(startX, startY),再计算终点坐标,endX,endY,有点像高中学的参数方程。然后告诉浏览器,lineCap要round,线段的两头要是圆形的。有多粗呢?等于branchWidth。线段一直画到(endX, endY)。
if (depth = 2){
50 ctx.strokeStyle = 'rgb(0,' + (((rand() * 64) + 128) 0) + ',0)';
51 } else {
52 ctx.strokeStyle = 'rgb(' + (((rand() * 64) + 64) 0) + ',50,25)';
53 }
如果是已经画到了最后两级,即为叶子,那么就rgb就为(0, 128~192, 0)(rgb代表颜色,分别为红绿蓝,red green blue)。还没的话,就在(64~128, 50 ,25)中取。大家可能发现了,rgb必须为整数,但是rand()只能rand实数。大家其实也注意到了有个” 0″,js当中表示位运算,整体向右移动n位,0就是移动0位。其实它的作用和Math.floor()一样,但是速度更快。
动手画!
ctx.stroke();
这个线段就画好了,是时候准备下它的分叉的时候了。
newDepth = depth - 1;
54 if (!newDepth)
55 return;
如果这个线段是最后一级,就没有分叉了,也是一个递归的终止条件。
subBranches = (rand() * (maxBranch - 1)) + 1;
56 branchWidth *= 0.7;
57 for (var i = 0; i subBranches; i++){
58 newAngle = angle + rand() * maxAngle - maxAngle * 0.5;
59 newLength = length * (0.7 + rand() * 0.3);
60 drawTree(ctx, endX, endY, newLength, newAngle, newDepth, branchWidth);
61 }
分叉数是1~3中的一个数。然后有多少个分叉,就画几条线段,newAngle为原角度调整90度之内,新长度为原长度的0.7~1.0之间。
最后画出主干,这棵树就可以开始画了。
drawTree(ctx, 320, 470, 60, -Math.PI / 2, 12, 12);
大家可能注意到角度为负,不符合传统观念。但你要知道,画布的纵坐标和传统的坐标轴正好是相反的。
好了,html5开发随机生成的大树代码就这样完成了,怎么样,一点都难吧!
制作思维导图应用
Qunee组件本身支持树形布局,所以对于思维导图的大体结构是可以呈现的,到细节的地方就比较多了,包括线条的走向,节点的样式,布局交互,自动吸附,双击编辑等等,本示例没办法面面俱到,所以参照XMind的效果,只实现了部分功能,供用户参考和扩展
连线定制
默认连线为直线,通过定制EdgeUI可以实现曲线效果
function FlexEdgeUI(edge, graph){
Q.doSuperConstructor(this, FlexEdgeUI, arguments);
}
FlexEdgeUI.prototype = { drawEdge: function(path, fromUI, toUI, edgeType, fromBounds, toBounds){ var from = fromBounds.center; var to = toBounds.center; var cx = (from.x + to.x) / 2; var cy = (from.y + to.y) / 2;
path.curveTo(from.x, cy, cx, to.y);
}
}
Q.extend(FlexEdgeUI, Q.EdgeUI);
使用方式
通过图元的#uiClass属性,与定制的EdgeUI相关联
function createEdge(name, from, to){
var edge = graph.createEdge(name, from, to);
edge.uiClass = FlexEdgeUI;
}
h5元素大致的分为下面几大类:
1.内嵌------在文档中添加其他类型的内容,如audio,video,canvas,iframe等
2.流------在文档和应用的body中使用的元素,如form,h1,small等
3.标题------段落标题,如h1,h2,hgroup等
4.交互------与用户交互的内容,如音频和视频的空间,button,textarea等
5.元数据------通常出现在页面的head中,设置页面其他部分的表现和行为,如script,style,title等
6.短语------文本和文本标记元素,如mark,kbd,sub,sup等
以上所有类型的元素都可以通过css来设定样式。
HTML5定义类一组新的语义化标记来描述元素的内容。简化了HTML页面设计。
这些分别是
1.header------标记头部区域的内容(用于整个页面或页面中的一块区域)
2.footer------标记脚部区域的内容(用于整个页面或页面中的一块区域)
3.section------Web页面中的一块区域
4.article------独立的文章内容
5.aside------相关内容或者引文
6.nav------导航类辅助内容
1.hgroup------用于对整个页面或页面中一个内容区块的标题进行组合
2.figure------表示一段独立的流内容,一般表示文档主体流内容中的一个独立单元,使用figcaption元素可为figure元素组添加标题
3.vedio------定义视频,比如电影片段或其他视频流
4.audio------定义音频,比如音乐或其他音频流
5.embed------用来插入各种多媒体,格式可以使MIDI,WAV,AIFF,AU,MP3等
6.mark------主要用来在视觉上向用户呈现那些需要突出显示和高亮显示的文字。
7.time------表示日期或时间,也可以同时表示两者
8.canvas------表示图形,这个元素本身没有行为,仅提供一块画布,但它把一个绘图API展现给客户端JavaScript,以使脚本能够把想绘制的东西回执到这块画布上。
9.output------表示不同类型的输出,比如脚本的输出
10.source------为媒介元素
11.menu------表示菜单列表。当希望列出表单控件时使用的该标签
12.ruby------表示ruby注释(中文注音或字符)
13.rt------表示字符的解释或发音
14.rp------在ruby注释中使用,以定义不支持ruby元素的浏览器所显示的内容
15.wbr------表示软换行。与br的区别在于br表示此处必须换行,而wbr意思是浏览器窗口或父级元素的宽度足够宽时,不进行换行,宽度不够时,主动在此处进行换行。
16.command------表示命令按钮,如单选按钮,复选按钮或按钮框。
17.details------表示用户要求得到并且可以得到的细节信息,可以与summary元素配合使用,summary元素提供标题或图例,标题是可见的,用户单机标题时,会显示细节信息。summary应该是details元素的第一个子元素
18.datalist------表示可选数据的列表,与input元素配合使用,可以制作出输入值的下拉列表。
19.datagrid------表示可选数据的列表,它以树形列表形式来显示
20.keygen------表示生成密钥
21.progress------表示运行中的进程,可以使用progress元素来显示JavaScript中耗费时间函数的进程
22.email------表示必须输入email地址的文本输入框
23.url------表示必须输入url地址的文本输入框
24.number------表示必须输入数值地址的文本输入框
25.range------表示必须输入一定范围内数字值址的文本输入框
26.Date Pickers------HTML5拥有多个可供选取日期和时间的新型输入文本框
这个就不说了。
html5与传统html区别
一. HTML5语法的改变
该知识点所说变化指的是基于HTML4基础上所定义的改变,主要有如下:
1.HTML5的文件扩展符(.html或.htm)与内容类型(text/html)保持不变。
2.HTML5中,刻意不使用版本声明,一份文档将会适用于所有版本的HTML。
3.从HTML5开始,对于文件的字符编码推荐使用UTF-8。
4.HTML5确保了与之前HTML版本的最大程度的兼容性。
为了保证兼容性,需从元素说起,在HTML5.中,元素的标记可以省略。其体来说,元素的标记分为“不允许写结束标记”、“可以省略结束标记”和‘“开始标记和结束标记全部可以省略”三种类型。
不允许写结束标记元素有:area、base、br、col.....
可以省略结束标记:li、dt、dd、p、rt......
开始标记和结束标记全部可以省略:html、head、body.....
二.新增的结构元素
section元素表示页面中的一个内容区块,比如章节、页眉、页脚或页面中的其他部分;
article元素表示页面中的一块与上下文不相关的独立内容,譬如博客中的一篇文章或报纸中的一篇文章;
aside元素表示article元素的内容之外的、与article元素的内容相关的辅助信息;
header元素表示页面中一个内容区块或整个页面的标题;
hgroup元素用于对整个页面或页面中一个内容区块的标题进行组合;
footer元素表示整个页面或页面中一个内容区块的脚注。一般来说,它会包含创作者的姓名、创作日期以及创作者联系信息;
nav元素表示页面中导航链接的.部分;
figure元素表示一段独立的流内容,一般表示文档主体流内容中的一个独立单元,使用figcaption元素为figure元素组添加标题
2、新增的其他元素
audio元素定义音频,比如音乐或其他音频流;
embed元素用来插入各种多媒体,格式可以是Midi、Wav、AU、MP3等;
mark元素上要用来在视觉上向用户呈现那些需要突出显示或高亮显示的文字,典型应用就是在搜索结果中向用户高亮显示搜素关键词;
progress元素表示运行中的进程
ruby元素表示ruby注释(中文注音或字符)
rt元素表示字符(中文注音或字符)的解释或发音
rp元素在ruby注释中使用,以定义不支持ruby素的浏览器所显示的内容。
wbr元素表示软换行,而当宽度不够时,主动在此处进行换行
canvas元素表示图形,比如图表和其他图像
cammand元素表示命令按钮,比如单选按钮、复选框或按钮
details元素表示用户要求得到并且可以得到的细节信息
datagrid元素表示可选数据的列表,它以树形列表的形式来显示
keygen元素表示生成密钥
output元素表示不同类型的输出,比如脚本的输出
source元素为媒介元素(比如和)定义媒介资源
menu元素表示菜单列表
3、新增的input元素
email 类型表示必须输入E-main地址的文本输入框
url 类型表示必须输入URL地址的文本输入框
number类型表示必须输人数值的文本输入框
range 类型表示必须输入一定范围内数字值的文本输人框
HTML5拥有多个可供选取日期和时间的新型输入文本框:
date ——选取日、月、年
month ——选取月、年
week ——选取周和年
time ——选取时间(小时和分钟)
datetime ——一选取时间、日、月、年(UTC 时间)
datetime.local ——选取时间、日、月、年(本地时间)
三.废除元素
1、能使用CSS替代的元素
对干basefont、big、center、font、s、strike、tt、u这些元素,由于它们的功能都是纯粹去画面展示服务的,而HTML5中提倡把画面展示性功能放在CSS样式表中统一编辑,所以这些元素废除了
2、不再使用frame框架
对于frameset元素、frame元素与noframes元素,由于frame框架对网页可用性存在负面影响,在HTML5中已不支持frame框架,只支持iframe框架,或者用服务器方创建的由多个页面组成的复合页面的形式,同时将以上这三个元素废除。
3、只有部分浏览器支持的元素
对于applet、bgsound、blink、marquee等元素,由于只有部分浏览器支持这些元素,特别是bgsound元素以及marquee元素,只被Internet Explorer所支持,所以在HTML 5中被废除。其中applet元素可由ernedd元素或object元素替代,bgsound元素可由audio元素替代,marquee可以由JavaScript编程的方式所替代
4、其他被废除的元素:
废除rb元素,使用ruby元素替代
废除acronym元素,使用abbr元素替代
废除dir元素,使用ul元素替代
废除isindex元素,使用form元素与input元素相结合的方式替代
废除listing元素,使用pre元素替代
废除xmp元素,使用code元素替代
废除nextid元素,使用GUIDS替代
废除plaintext元素,使用“ text/plian” MIME类型替代
四.新增属性和废除属性
一、新增属性
1、与表单相关属性
新增autofocus属性,它以指定属性的方式让元素在画面打开时自动获得焦点;
新增placeholder属性,它会对用户的输入进行提示,提示用户可以输入的内容;
新增form属性,声明它属于哪个表单,然后将其放置在页面上任何位置,而不是表单之内;
新增required属性,该属性表示在用户提交的时候进行检查,检查该元素内一定要有输入内容;
2、与链接相关属性
增加media属性,该属性规定目标URL是为什么类型的媒介/设备进行优化的,只能在href属性存在时使用;
增加hreflang属性与rel属性,以保持与a元素、link元素的一致;
3、其他属性
属性reverend,它指定列表倒序显示;
为script元素增加async属性,它定义脚本是否异步执行;
二、废除属性
能被CSS样式表替代的属性全部废除掉;
多余属性,例如:target、profile、version等被废除掉;
五.全局属性
在HTML5中,新增了一个’‘全局属性“的概念。所谓全局属性,是指可以对任何元素都使用的属性。
1、contentEditable 属性
该属性允许用户编辑元素中的内容,可以获得鼠标焦点,属性为布尔值,可被指定为true或false。另外,该属性还有个隐藏inherit状态,为true时,允许编辑,为false时,不允许编辑,未指定时,由inherit决定。
2、designMode 属性
该属性用来决定整个页面是否可编辑。有两个属性“on”与"off"。属性为"on"时,可编辑,为“off”时,不可编辑。
3、hidden属性
所有元素都允许使用一个hidden属性,该属性类似于input元素中的hidden元素,功能是通知浏览器不渲染该元素,使该元素处于不可见状态。该属性值为布尔值,为true时,不可见,为false时,可见。
4、spellcheck属性
该属性是HTML 5针对input元素(type=text) 与textarea这两个文本输入框提供的一个新属性,主要对用户输入内容进行拼写与语法检查。属性值为布尔值,书写时必须明确声明属性值为true或false书写方式如下:
详解form属性
在HTML4中,表单内的从属元素必须书写在表单内部,但是在HTML5中,可以把他们书写在页面上任何地方,然后给元素制定一个form属性,属性值为该表单单位的id,这样就可以声明该元素从属于指定表单了。
input元素从属于表单,它呗书写在表单内部,用不着再对它制定form属性。textarea元素呗书写在表单之外,但它从属于表单,所以表单的id制定给textareea元素的form属性。
这样做的好处是当需要给页面中的元素添加样式时可以更方便地添加,因为它们不是被分散在各表单之内的了。
;