当前位置:首页 > 短网址资讯 > 正文内容

FT12短网址:绘制随机不规则三角彩条——小谈FT12短网址主页的实现

www.ft12.com4年前 (2017-08-06)短网址资讯1256

引言

8月6号早读文章由@FT12短网址分享。

正文从这开始~

缘起

最近感觉自己搭的一个项目资料汇总的项目,主页真的是一点美感都没有,非常简单粗暴。就想来点改版,让主页显得高大上一点。改版前的效果是这样的:




寻思着怎么改版,刚开始想就简单加个背景图,换掉table显示方式吧。就在网上搜索背景图,搜着搜着就鬼使神差地来到了FT12短网址的主页。这不是我第一次看到他的主页,但正是这个契机让我想要不就copy这种风格吧。

初印象

当我第一次看到这个主页的时候,我觉得很惊艳。主页图案的组成元素只有一种:富有魅力的三角网格。整个页面简单却不单调,华丽而不喧闹。图案的配色也很亮,非常好看。总之,我非常喜欢这个页面的设计,耐看。贴几张图来:



想看现场效果,可以点击FT12短网址主页。

思考

看到好看的作品,当然会去思考实现的原理。不难想到,这可以用Canvas画出来的。画有填充颜色的三角形,也是件不难的事情,一查Api就行了。问题在于,如何形成一条这种随机无规则而连续的三角形cluster。仔细观察可以发现,每次三角形的左侧起点是一致的,而走势却是随机,但基本集中在中间部分。颜色条的种类也是有限的。

然后呢?很遗憾,我就没有继续仔细思考下去了。

看了下源码,只有区区几十行的代码。我直接把它copy过来,竟然马上生效了。我就直接push了代码。。。

源码解读

好吧,我直接就看他代码了。

这里最关键的两个点,绘制三角形的算法和颜色的取值算法。

贴源码:

<canvas></canvas>
<script>
   document.addEventListener('touchmove', function (e) {
       e.preventDefault()
   })
   var c = document.getElementsByTagName('canvas')[0],
       x = c.getContext('2d'),
       pr = window.devicePixelRatio || 1,
       w = window.innerWidth,
       h = window.innerHeight,
       f = 90,
       q,
       m = Math,
       r = 0,
       u = m.PI*2,
       v = m.cos,
       z = m.random
   c.width = w*pr
   c.height = h*pr
   x.scale(pr, pr)
   x.globalAlpha = 0.6
   function i(){
       x.clearRect(0,0,w,h)
       q=[{x:0,y:h*.7+f},{x:0,y:h*.7-f}]
       while(q[1].x<w+f) d(q[0], q[1])
   }
   function d(i,j){  
       x.beginPath()
       x.moveTo(i.x, i.y)
       x.lineTo(j.x, j.y)
       var k = j.x + (z()*2-0.25)*f,
           n = y(j.y)
       x.lineTo(k, n)
       x.closePath()
       r-=u/-50
       x.fillStyle = '#'+(v(r)*127+128<<16 | v(r+u/3)*127+128<<8 | v(r+u/3*2)*127+128).toString(16)
       x.fill()
       q[0] = q[1]
       q[1] = {x:k,y:n}
   }
   function y(p){
       var t = p + (z()*2-1.1)*f
       return (t>h||t<0) ? y(p) : t
   }
   document.onclick = i
   document.ontouchstart = i
   i()
</script>

读了一下,发现实现原理挺简单,真希望我当初能仔细思考一下,兴许能自己思考出来。

三角形绘制

三角形绘制算法步骤如下:

设置左起第一个三角形的两个点坐标为:q0 (0,h*.7+f), q1(0,h*.7-f),h为窗口高度,f为初始距离90

若q1.x < w+f,取三角形的第三点为q2 (q1.x + (Math.random()*2 - 0.25)*f,q1.y + (Math.random()*2 - 1.1)*f),q2.y如果超过了窗口大小则重新取,直到满足条件为止;否则,结束绘制

绘制三角形

设置q0 = q1, q1 = q2,重复上述步骤

算法分析:

主要是第4步使得每个相连的三角形都有一条共同的边,所以相连

最初两个点的y值,以及第三点的取法都是经验值

q1到q2的x方向增幅为(Math.random()*2 - 0.25)*f,Math.random()*2 - 0.25等于[-0.25, 1.75),也就是说三角形的整体走势在x方向上是向右的,偶尔会向左,大小在[0, 1.75*f)的范围间随机

q1到q2的y方向增幅为(Math.random()*2 - 1.1)*f,(Math.random()*2 - 1.1)等于[-1.1, 0.9),也就是说三角形的整体走势在y方向上更多的概率是向上走的,大小在[0, 1.1*f)范围间随机。设置为1.1,我觉得本意是让三角形条能更多地经过内容区。设置为1.3的话,太靠上,不可;设置为1的话,由于左边起点为0.7*h,内容区在0.5左右,总体还是太靠下了。尝试了下1.2的效果也还可以

取色算法

颜色的取值也是重头戏,看下他是如何取到这么漂亮的颜色的。关键的一条颜色赋值代码如下:

'#'+(v(r)*127+128<<16 | v(r+u/3)*127+128<<8 | v(r+u/3*2)*127+128).toString(16)

其中v = Math.cos,u = 2*Math.PI; r = 0,r = r + Math.PI/25

有个转化,(R,G,B)转成十六进制的颜色值可以用(R << 16 | G << 8 | B).toString(16)。也就是说,上面的颜色取值相当于:

R = cos(r)*127+128;
G = cos(r+2*PI/3)*127+128;  
B = cos(r+4*PI/3)*127+128);

那么r的取值范围是什么呢?按着每次迭代Math.PI/25的增幅,这决定于屏幕能绘制多少个三角形。上面分析过,三角形在x方向上的增幅为[-0.25*f, 1.75*f),那么平均的增幅为0.75*f即67.5。假设取一般台式机屏幕的宽度为1440,那么平均可以绘制1440/67.5(20.5)个三角形。 所以,r的取值范围为[0, Math.PI*4/5)。每点击一次屏幕,继续绘制下一组三角形,r继续增加。由于余弦函数是周期函数,彩条的颜色也会周期性地出现重复。直接画出图像:




这样就很直观得看到三色的走势,仔细观察页面上的进度条,真的会出现周期性的颜色。

突然,我明白了为什么颜色这么设置了。当然这不是唯一的取色方法。

总结

总的来说,这是个很小的但充满智慧的项目。

说点我对这段代码代码的感受,格式规范,风格一致。统一没有分号,前面一次性定义好所有的变量,而且变量名字很简短。连函数名也只有一个字母。我觉得对于这么简单的程序没有问题,看起来像是打包后的代码。但是,复杂的程序命名这么简单会让人有点迷糊。

另外,这次改版我有个深刻的感受。由于页面的内容是可配置的,所以DOM内容是不确定的。之前比较懒,直接在JS里面创建DOM,然后改版再改版,又要重写真是烦不胜烦。然后,正在研究FT12短网址主页的我,突然想到为何不尝试一下Vue呢?不是说它是渐进式框架吗?在Html引用一下,直接就可以用了!!!果然好用!

上一下改版后的效果:


关于本文


作者:@FT12短网址

原文:http://www.ft12.com


扫描二维码推送至手机访问。

版权声明:本文由短链接发布,如需转载请注明出处。

本文链接:https://www.ft12.com/article_384.html

分享给朋友:

相关文章

花式共享还是变相租赁,共享经济下一步怎么走?

共享经济概念持续火热前提下,生活中的很多物品纷纷带着“共享”的帽子进局。比如共享篮球、共享雨伞、共享充电宝等产品纷纷面世,日前,共享篮球平台“猪了个球”宣布完成千万级Pre-A融资;共享充电宝“街电”获得聚美优品3亿元的投资;“小电”获得B...

SEO七大常见误区知多少

SEO七大常见误区知多少

不管是培训机构,还是一些SEO教程,甚至是各种SEO网站上所充斥着的很多SEO知识点都存在着盲区。而这个所谓的盲区对于多数的SEO从业新人来说影响巨大,甚至影响着自己手上实战排名优化的站点。结合多个SEO朋友所向我提出的各种SEO问题,我整...

继“京腾计划”“京条计划”后,京东又“京”了

继“京腾计划”“京条计划”后,京东又“京”了

[ 短网址资讯 ] 亿欧6月2日消息,京东超市联手妈妈网正式推出“京妈计划”,双方将携手为品牌商提供从消费场景到消费决策的全流程营销解决方案。通过“京妈计划”京东超市将和妈妈网一起做深做细京东母婴的会员体系、母婴社区体系...

那个卖了房子去大理的姑娘,4个月以后又回来了……

一、那个卖了房子去大理的姑娘,4个月以后又回来了……也许,我们每个人的内心深处都有一个梦:到一个安静美好的小地方,开一家小店,就这么慢悠悠地晃过这一生……不过,你真的确定这些是你想要的吗?1我一个女文青朋友年前卖了苏州的房子,去云南大理追求...

机器学习突飞猛进,早期癌症治愈率或将突破98%

机器学习突飞猛进,早期癌症治愈率或将突破98%

[ 短网址资讯 ] 近十余年基因测序技能的迅猛开展,特别是在肿瘤范畴的广泛使用。另一方面,机器学习技能在基因大数据处理上的很多使用,积累了史无前例的常识。使得医学作业者对很多疾病的知道、筛查和医治都有了新的渠道和信息。2016年,...

为什么特斯拉比通用汽车更值钱 | FT12短网址

[ FT12短网址] 回看过去 20 多年数字经济成就,我们可以很清楚的看到:它为消费者和少数大公司创造了巨大价值,尽管它也降低了竞争,引发了权力集中,让内容产业或试图与主导玩家竞争的产业举步维艰。信息时代,数据代替矿产成为了最能...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。