通俗Nodejs读书笔记,编织炫目星空图

时间:2019-12-10 07:24来源:美高梅游戏网站
响应式web构造中iframe的自适应 2016/07/13 · CSS ·CSS,响应式构造 本文小编: 伯乐在线 -欲休。未经小编许可,禁止转载! 招待参与伯乐在线 专辑小编。 HTML 部分 那有的自家就大致放了叁

响应式web构造中iframe的自适应

2016/07/13 · CSS · CSS, 响应式构造

本文小编: 伯乐在线 - 欲休 。未经小编许可,禁止转载!
招待参与伯乐在线 专辑小编。

HTML 部分

那有的自家就大致放了叁个 `` 标签,设置样式使其填写全屏。

<canvas height="620" width="1360" id="canvas" style="position: absolute; height: 100%;"/>

1
<canvas height="620" width="1360" id="canvas" style="position: absolute; height: 100%;"/>

然后为了让具有因素未有间隔和内补,作者还加了一条全局样式:

* { margin: 0; padding: 0; }

1
2
3
4
    * {
      margin: 0;
      padding: 0;
    }

调控器合集controllers.js

controller.js里面是享有的controller定义,由于这一个体系十分的小,并且反正最终都要联合,所以就都投身五个文本里了,那样能够动用链式写法app.controller(‘a’, …卡塔尔国.controller(‘b’, …卡塔尔(قطر‎, 一口气将富有的controller都定义好。倘诺项目相当大,controller多,能够把controllers建为叁个文书夹,然后在里面放各样controller。

controller里面就是跟职业有关的有个别代码了,如试题数据的开首化,增添答案、删除选项等操作。

可是当大家供给倡导ajax必要的时候,如保存试题,就不宜在controller里面直接写了,那样会促成逻辑混杂代码混乱。全体供给央浼服务端的操作,咱们能够抽象为多少个个服务,举行“分层”,通过ng提供的service机制来做调用。

起源

那多少个缩略词是Tim Berners-Lee在朝气蓬勃篇名称叫RFC 3986: Uniform Resource Identifier (URI): Generic Syntax的文书档案中定义的互连网典型追踪协议。

引文:

集合营源标志符(U昂科雷I)提供了叁个粗略、可扩张的财富标志情势。U福睿斯I标准中的语义和语法来源于环球网满世界音信积极引进的概念,环球网从1989年起利用这种标志符数据,并被描述为“环球网中的统一能源描述符”。

图片 1

Tim Berners-Lee ,环球网的发明者,同一时间也是环球网联盟(W3C)的主管。照片由 Paul Clarke 遵循CC BY-SA 4.0 合同提供。

通俗Nodejs读书笔记,编织炫目星空图。有关笔者:Tw93

图片 2

简单介绍还未来得及写 :) 个人主页 · 小编的篇章 · 5 ·  

图片 3

打赏帮衬自个儿写出越来越多好小说,感谢!

图片 4

1 赞 9 收藏 评论

分析

第生龙活虎大家看看那个职能具体有那多少个要点。首先,这么璀璨的效劳必然是要用到 Canvas 了,各样星星能够看作为三个粒子,由此,整个职能实在便是粒子系统了。别的,大家能够发掘种种粒子之间是互相连接的,只可是离的近的粒子之间的连线相当的粗且发光度非常的低,而离的远的则相反。

首页index.html

那是项目的入口页面,其实正是一个大容器,在这里地加载全数的js和css文件,然后提供五个视图容器就够了,因为从那一个页面今后,我们页面就不再会有跳转,全是透过前端路由来做一些刷新,首页的代码特别简单:

JavaScript

<!doctype html> <html ng-app="QMaker"> <head> <meta charset="utf-8"> <title>Question Maker</title> <link rel="stylesheet" href="/src/lib/bootstrap-3.3.5/css/bootstrap.min.css"> <script src="/src/lib/jquery-1.9.1.min.js"></script> <script src="/src/lib/angular-1.4.1.min.js"></script> <script src="/src/lib/angular-ui-router.min.js"></script> <link rel="stylesheet" href="/src/css/base.css"> <!--{main}--> <script src="/src/js/app.js"></script> <script src="/src/js/controllers.js"></script> <script src="/src/js/directives.js"></script> <script src="/src/js/filters.js"></script> <script src="/src/js/routes.js"></script> <script src="/src/js/services.js"></script> <!--{endmain}--> </head> <body> <div class="navbar navbar-default"> <div class="container-fluid"> <div class="navbar-header"> <a href="#/" class="navbar-brand">Question Maker</a> </div> </div> </div> <div class="maincontent container-fluid" ui-view> </div> </body> </html>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
<!doctype html>
<html ng-app="QMaker">
<head>
    <meta charset="utf-8">
    <title>Question Maker</title>
    <link rel="stylesheet" href="/src/lib/bootstrap-3.3.5/css/bootstrap.min.css">
    <script src="/src/lib/jquery-1.9.1.min.js"></script>
    <script src="/src/lib/angular-1.4.1.min.js"></script>
    <script src="/src/lib/angular-ui-router.min.js"></script>
 
    <link rel="stylesheet" href="/src/css/base.css">
    <!--{main}-->
    <script src="/src/js/app.js"></script>
    <script src="/src/js/controllers.js"></script>
    <script src="/src/js/directives.js"></script>
    <script src="/src/js/filters.js"></script>
    <script src="/src/js/routes.js"></script>
    <script src="/src/js/services.js"></script>
    <!--{endmain}-->
</head>
 
<body>
    <div class="navbar navbar-default">
        <div class="container-fluid">
            <div class="navbar-header">
                <a href="#/" class="navbar-brand">Question Maker</a>
            </div>
        </div>
    </div>
    <div class="maincontent container-fluid" ui-view>
 
    </div>
</body>
 
</html>

关于小编:zaishaoyi

图片 5

程序猿,首要支出语言 C++,Objective-C。外语:英语。马耳他语学习中劳作:找出后台程序开辟,机器学习 个人主页 · 作者的篇章 · 21 ·   

图片 6

异步I/O

那风度翩翩章展现了Node中大家将异步I/O作为重点设计思想的案由。此外,还恐怕会介绍到异步I/O的亲力亲为达成进程。
事件循环是异步完成的主干,它与浏览器中的推行模型基本上保持生机勃勃致。而向古老的Rhino,尽管是较早已能在服务器运转的JavaScript运维时只是进行模型并不像浏览器选择事件驱动,而是接纳像任何语言雷同接收同步I/O作为首要模型,那引致它在性质方面不可能表明。Node就是依靠于塑造了后生可畏套康健的高品质异步I/O框架,打破了JavaScript在服务器止步不前的局面。 脑图

图片 7

困境

在响应式布局中,大家相应小心对待iframe成分,iframe元素的width和height属性设置了其调幅和冲天,可是当包罗块的上涨的幅度或可观小于iframe的升幅或可观时,会自可是然iframe元素溢出的气象:

图片 8

那般溢出的iframe会破坏页面包车型大巴布局。大家得以接收风华正茂种格局让iframe成分也不无响应性,静观其变。

JavaScript 部分

下边大家来写核心的代码。首先大家要赢得丰裕 canvas 并获取绘制上下文:

var canvasEl = document.getElementById('canvas'); var ctx = canvasEl.getContext('2d'); var mousePos = [0, 0];

1
2
3
var canvasEl = document.getElementById('canvas');
var ctx = canvasEl.getContext('2d');
var mousePos = [0, 0];

接着大家注解七个变量,分别用于存款和储蓄“星星”和边:

var nodes = []; var edges = [];

1
2
var nodes = [];
var edges = [];

下一步,大家做些准备职业,正是让画布在窗口大小爆发变化时再也绘制,而且调动自个儿分辨率:

window.onresize = function () { canvasEl.width = document.body.clientWidth; canvasEl.height = canvasEl.clientHeight; if (nodes.length == 0) { constructNodes(); } render(); }; window.onresize(); // trigger the event manually.

1
2
3
4
5
6
7
8
9
10
11
12
window.onresize = function () {
    canvasEl.width = document.body.clientWidth;
    canvasEl.height = canvasEl.clientHeight;
 
    if (nodes.length == 0) {
      constructNodes();
    }
 
    render();
};
 
window.onresize(); // trigger the event manually.

咱俩在率先次改良尺寸后营造了具备节点,这里就要用到下二个函数(constructNodes)了

其生龙活虎函数中我们随意创建多少个点,大家用字典对象的格局存款和储蓄这么些点的相继音讯:

function constructNodes() { for (var i = 0; i < 100; i++) { var node = { drivenByMouse: i == 0, x: Math.random() * canvasEl.width, y: Math.random() * canvasEl.height, vx: Math.random() * 1 - 0.5, vy: Math.random() * 1 - 0.5, radius: Math.random() > 0.9 ? 3 + Math.random() * 3 : 1 + Math.random() * 3 }; nodes.push(node); } nodes.forEach(function (e) { nodes.forEach(function (e2) { if (e == e2) { return; } var edge = { from: e, to: e2 } addEdge(edge); }); }); }

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
function constructNodes() {
    for (var i = 0; i < 100; i++) {
      var node = {
        drivenByMouse: i == 0,
        x: Math.random() * canvasEl.width,
        y: Math.random() * canvasEl.height,
        vx: Math.random() * 1 - 0.5,
        vy: Math.random() * 1 - 0.5,
        radius: Math.random() > 0.9 ? 3 + Math.random() * 3 : 1 + Math.random() * 3
      };
 
      nodes.push(node);
    }
 
    nodes.forEach(function (e) {
      nodes.forEach(function (e2) {
        if (e == e2) {
          return;
        }
 
        var edge = {
          from: e,
          to: e2
        }
 
        addEdge(edge);
      });
    });
  }

为了实现后边三个更炫目的功力,小编给第一个点加了一个 drivenByMouse 属性,那么些点的职位不会被粒子系统管理,也不会绘制出来,可是它会与别的点连线,那样就落实了鼠标跟随的机能了。

此间微微解释一下 radius 属性的取值,作者愿意让绝超越贰分一点都是小半径的,而极少数的点半径十分大,所以作者那边用了一些小 tricky,就是用可能率调整点的半径取值,不断调治那么些可能率阈值就能够拿到期望的半径随机布满。

点都营造实现了,就要创设点与点时期的连线了,大家用到再也遍历,把多少个点捆绑成风华正茂组,放到 edges 数组中。注意这里笔者用了别的五个函数来成功这事,而从未向来用 edges.push() ,为什么?

举例大家以前线总指挥部是了 A、B两点,也便是外面循环是A,内侧循环是B,那么在下叁遍巡回中,外侧为B,内侧为A,是还是不是也会创建一条边呢?而实际上,那三个边除了方向分歧样以外是一心平等的,这一丝一毫没有必要並且占用财富。因而大家在 addEdge 函数中打开多个肯定:

function addEdge(edge) { var ignore = false; edges.forEach(function (e) { if (e.from == edge.from & e.to == edge.to) { ignore = true; } if (e.to == edge.from & e.from == edge.to) { ignore = true; } }); if (!ignore) { edges.push(edge); } }

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
function addEdge(edge) {
    var ignore = false;
 
    edges.forEach(function (e) {
      if (e.from == edge.from & e.to == edge.to) {
        ignore = true;
      }
 
      if (e.to == edge.from & e.from == edge.to) {
        ignore = true;
      }
    });
 
    if (!ignore) {
      edges.push(edge);
    }
  }

至今截止,大家的备选工作就病逝了,上面我们要让点动起来:

function step() { nodes.forEach(function (e) { if (e.drivenByMouse) { return; } e.x += e.vx; e.y += e.vy; function clamp(min, max, value) { if (value > max) { return max; } else if (value < min) { return min; } else { return value; } } if (e.x <= 0 || e.x >= canvasEl.width) { e.vx *= -1; e.x = clamp(0, canvasEl.width, e.x) } if (e.y <= 0 || e.y >= canvasEl.height) { e.vy *= -1; e.y = clamp(0, canvasEl.height, e.y) } }); adjustNodeDrivenByMouse(); render(); window.requestAnimationFrame(step); } function adjustNodeDrivenByMouse() { nodes[0].x += (mousePos[0] - nodes[0].x) / easingFactor; nodes[0].y += (mousePos[1] - nodes[0].y) / easingFactor; }

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
function step() {
    nodes.forEach(function (e) {
      if (e.drivenByMouse) {
        return;
      }
 
      e.x += e.vx;
      e.y += e.vy;
 
      function clamp(min, max, value) {
        if (value > max) {
          return max;
        } else if (value < min) {
          return min;
        } else {
          return value;
        }
      }
 
      if (e.x <= 0 || e.x >= canvasEl.width) {
        e.vx *= -1;
        e.x = clamp(0, canvasEl.width, e.x)
      }
 
      if (e.y <= 0 || e.y >= canvasEl.height) {
        e.vy *= -1;
        e.y = clamp(0, canvasEl.height, e.y)
      }
    });
 
    adjustNodeDrivenByMouse();
    render();
    window.requestAnimationFrame(step);
  }
 
  function adjustNodeDrivenByMouse() {
    nodes[0].x += (mousePos[0] - nodes[0].x) / easingFactor;
    nodes[0].y += (mousePos[1] - nodes[0].y) / easingFactor;
  }

总的来看这么一大段代码不要惊愕,其实做的事体比较轻松。那是粒子系统的中央,正是遍历粒子,并且更新其景况。更新的公式正是

v = v + a s = s + v

1
2
v = v + a
s = s + v

a是加快度,v是速度,s是位移。由于大家这里不涉及加快度,所以就不写了。然后我们必要作一个边缘的碰撞检查实验,不然大家的“星星”都无拘无缚地一丝丝飞~走~了~。边缘碰撞后的管理形式即是让速度矢量反转,那样粒子就能够“掉头”回来。

还记得大家要求做的鼠标跟随吗?也在此管理,大家让第二个点之处一点一点运动到鼠标的岗位,上边这些公式很有趣,可以轻便达成缓动:

x = x + (t - x) / factor

1
x = x + (t - x) / factor

当中 factor 是缓动机原因子,t 是终极地点,x 是日前地方。至于那一个公式的阐述还也可以有个互相大神 Bret 维克托在他的发言中提到过,摄像做的非常好,有条(ti)件(zi)我们自然要看看: Bret Victor – Stop Drawing Dead Fish

好了,回到核心。大家在地点的函数中拍卖完了生机勃勃帧中的数据,我们要让漫天粒子系统三番五次地运维起来就须求二个timer了,不过那多少个不提倡大家使用 setInterval,而是尽或者接受 requestAnimationFrame,它能作保你的帧率锁定在

剩余的就是绘制啦:

function render() { ctx.fillStyle = backgroundColor; ctx.fillRect(0, 0, canvasEl.width, canvasEl.height); edges.forEach(function (e) { var l = lengthOfEdge(e); var threshold = canvasEl.width / 8; if (l > threshold) { return; } ctx.strokeStyle = edgeColor; ctx.lineWidth = (1.0

  • l / threshold) * 2.5; ctx.globalAlpha = 1.0 - l / threshold; ctx.beginPath(); ctx.moveTo(e.from.x, e.from.y); ctx.lineTo(e.to.x, e.to.y); ctx.stroke(); }); ctx.globalAlpha = 1.0; nodes.forEach(function (e) { if (e.drivenByMouse) { return; } ctx.fillStyle = nodeColor; ctx.beginPath(); ctx.arc(e.x, e.y, e.radius, 0, 2 * Math.PI); ctx.fill(); }); }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
function render() {
    ctx.fillStyle = backgroundColor;
    ctx.fillRect(0, 0, canvasEl.width, canvasEl.height);
 
    edges.forEach(function (e) {
      var l = lengthOfEdge(e);
      var threshold = canvasEl.width / 8;
 
      if (l > threshold) {
        return;
      }
 
      ctx.strokeStyle = edgeColor;
      ctx.lineWidth = (1.0 - l / threshold) * 2.5;
      ctx.globalAlpha = 1.0 - l / threshold;
      ctx.beginPath();
      ctx.moveTo(e.from.x, e.from.y);
      ctx.lineTo(e.to.x, e.to.y);
      ctx.stroke();
    });
    ctx.globalAlpha = 1.0;
 
    nodes.forEach(function (e) {
      if (e.drivenByMouse) {
        return;
      }
 
      ctx.fillStyle = nodeColor;
      ctx.beginPath();
      ctx.arc(e.x, e.y, e.radius, 0, 2 * Math.PI);
      ctx.fill();
    });
  }

常规的 Canvas 绘图操作,注意 beginPath 必须求调用,不然你的线就全数穿在联合了… 须要证实的是,在绘制边的时候,我们先要计算两点间隔,然后依据贰个阈值来剖断是还是不是要绘制那条边,那样大家本领兑现间隔远的点之间连线不可知的成效。

到此地,我们的成套功效就成功了。假使不领会大家也得以去本人作品开端放的 repo 离去看完整的源码。Have fun!!

2 赞 4 收藏 评论

图片 9

前端目录布局

用ng来营造几个项目应当怎样安排目录构造吧?为了不人工扩充复杂度,小编那边未有用bower来管理信任库,也未尝其余文章中牵线的那么用yeoman来生成项目,只是独自的手动来创立目录,那样能够把我们的集中力集中到花色的为主上,目录布局是这么的:

前端的代码都在src目录下,包含进口文件index.html,那样便于我们继续做统生机勃勃压缩等编写翻译专门的学业,编写翻译后的文书能够协同放入dist目录下。

三个用于精通这三者的例子

大家来看一下上述概念怎么样利用于与我们连带的互连网。

双重援用Wikipedia ,那一个引文给出的分解,比地点职员地址的例证更为标准:

关于URL:

UTiggoL是U猎豹CS6I的意气风发种,不只有标志了Web 财富,还内定了操作依然获得格局,同有时间提出了着重拜会机制和网络地点。

关于URN:

U奇骏N是UEnclaveI的生机勃勃种,用特定命名空间的名字标记能源。使用UOdysseyN能够在不晓得其网络位置及寻访情势的情状下钻探能源。

明日,要是到Web上去看一下,你会找寻比非常多例子,那比任马玉成西更便于令人疑惑。作者只显示一个事例,特简单清楚地告知你在互连网中U凯雷德I 、U大切诺基L和U奥迪Q5N之间的分化。

作者们少年老成道来看下边这几个编造的事例。那是一个URI

1
http://bitpoetry.io/posts/hello.html#intro

我们开端深入分析

http://

1
http://

是概念如何访谈财富的方式。另外

bitpoetry.io/posts/hello.html

1
bitpoetry.io/posts/hello.html

是资源存放的位置,那么,在这里个事例中,

#intro

1
#intro

是资源。

URL是U讴歌RDXI的多少个子集,告诉大家访谈网络地点的法子。在咱们的例证中,U纳瓦拉L应该如下所示:

1
http://bitpoetry.io/posts/hello.html

URN是U纳瓦拉I的子集,满含名字(给定的命名空间内),但是不包涵拜访形式,如下所示:

bitpoetry.io/posts/hello.html#intro

1
bitpoetry.io/posts/hello.html#intro

就是如此。现在您应该能力所能达到辨识出U奥迪Q3L和UEvoqueN之间的例外。

即使你忘记了那篇小说的从头到尾的经过,最少要铭记在心意气风发件事:U奥德赛I能够被分成UWranglerL、U大切诺基N或双边的咬合。假使您向来接收URI以此术语,就不会有错。

为了改良一些不当,已经更新了这篇文章。假设你意识新的不当,无论是技能上的照旧语法上的,请不要犹豫,告诉我们啊!

2 赞 15 收藏 4 评论

测试

那风流洒脱章重点介绍Node的单元测量检验和质量测验本领。测验的意思在于,在客户费用现身的代码此前,开荒者首先开支他,赋予其首要性的品质作保。
测量试验包罗单元测量试验、品质测量试验、安全测量检验和功力测验等多少个地点,本章将从Node实施的角度来介绍单元测量检验和品质测量试验。脑图
图片 10

编辑:美高梅游戏网站 本文来源:通俗Nodejs读书笔记,编织炫目星空图

关键词:

  • 上一篇:没有了
  • 下一篇:没有了