云顶集团400800044

当前位置:云顶集团400800044 > 云顶集团400800044 > 12个地道的HTML5画布示例,js做些什么

12个地道的HTML5画布示例,js做些什么

来源:http://www.ofertasanjuan.com 作者:云顶集团400800044 时间:2019-11-20 07:31

拾一个名特别降价新的HTML5画布示例

2012/02/16 · HTML5 · 来源: 伯乐在线     · HTML5

本文搜罗了一些优越的HTML5 画布演示。近年来网络有过多痛快的HTML5示范作品,作者很喜欢能将本身所访谈到的享用给我们。HTML5的职能进一层强大,占用的微机以致比 Flash 还少。所以,是不是有一天 Flash 会被 HTML5 完全替代呢?(查看下边示例,请使用辅助HTML5的浏览器。卡塔尔国

1. FishBowl

不错的鱼缸

云顶集团400800044 1

2. DeviantART muro

轻量级的在线图像编辑器

云顶集团400800044 2

3. 3D Earth

自转的地球

云顶集团400800044 3

4. Asteroid Belt

太空中的小行星带

云顶集团400800044 4

5. Interactive Polaroids

优良的相册(看上去就好像用偏光板拍片的卡塔 尔(阿拉伯语:قطر‎

云顶集团400800044 5

6. Canvas Cycle: True 8-bit Color Cycling with HTML5

本条小说然则华侈,以至带有了大器晚成套演示——各类气象效果的动漫化演示

云顶集团400800044 6

7. js cloth

三维情形下的二维图像

云顶集团400800044 7

8. CanvasMol

种种因素的三个维度份子结构

云顶集团400800044 8

9. Or so they say…” by xplsv

科学的太空景观

云顶集团400800044 9

10. 3D Model Viewer

今非昔比预制物体的三个维度图像

云顶集团400800044 10

结语

仰望您能赏识新收罗的HTML5示范。好运!

 

原文:script-tutorials   编译:伯乐在线 – 楼子宜

【如需转发,请评释并保存原来的小说链接、译文链接和翻译等消息,多谢合作!】

赞 收藏 评论

HTML5 和 CSS3的新交互作用天性

2011/11/29 · HTML5 · 来源: 百度UED     · CSS3, HTML5

正文标题的那副图片,是用Phosotshop制作的。可是,在寻觅引擎中你却回天乏术查找到它,寻找引擎还并未有有力到能够分辨图片里面包车型客车文字。並且由 于图片的体量不算太小,或然网速慢的网上好友在浏览的时候只得耐性的等候图片的刷新。那么,有未有意气风发种新的措施能够制止这一个短处呢?

有些,HTML5和CSS3就足以满意你的须要。以至,它能够做的越来越多,越来越好。作为一名设计师,我们应当明白它们是什么样事物,有如何特色,进而进一步思虑通过HTML5和CSS3大家能做些什么。

云顶集团400800044 11

什么是HTML5和CSS3

HTML和CSS并轻易掌握。HTML为组合网页的入眼语言。通过这种语言,我们能够向Computer表达网页格式、内容、彰显效果等等。而CSS则是特意用来调节网页展现效果的言语。那时难题出来了,为啥我们要单独行使CSS呢,HTML不是均等能够垄断Web页面包车型大巴显示效果么?为了应对那几个主题素材,作者举个简易的例子:

云顶集团400800044 12

有未有开采只要倘若形容的作业过多,想要把作业陈诉清楚的时候,我们只好再一次大量的音讯?页面语言也是均等,在此种情形下显得杂乱,特不便 理出头绪。通过将调节突显效果的言语集成到CSS里,我们不光能够保险页面语言主体部分的从简,并且能够十分有益的复用各样语言集结。

HTML5和CSS3是HTML和CSS的风尚版本,它们近年来均未规定专门的职业,不过曾经发布的新特征已经让我们心动不已。

HTML 5的新特新

1. 新的源委标签

云顶集团400800044 13

HTML4中的内容标签等级相通,不能区分各部分内容。而HTML第55中学的内容标签相互独立,品级分歧,找寻引擎甚至计算软件等均可快捷识别各部分内容。

2. 越来越好的报表类别

云顶集团400800044 14

HTML5 和 CSS3的新人机联作本性

前日,你能够摈弃JavaScript恐怕是PHP,只经过HTML5来定义表格。你可以定义每种表格单元的输入格式,也能够定义那些单元是还是不是是必填的等等。

3. 音频、视频API

云顶集团400800044 15

云顶集团400800044 16

HTML5不但允许你在网页中央直属机关接整合录像、音频,同期更提供了黄金时代套成效丰富的API用来调控媒体播发,而那个用来支配媒体播放的因素也都以可以被编辑的。因而,HTML5在摄像以至音频层面上实际已经足以代替常用的flash插件了。

4. 画布(Canvas) API

云顶集团400800044 17

在网页中绘制图形一贯是个大难点,我们只可以依靠flash、silverlight等插件。不过HTML5允许你直接在网页上举办绘图,以致同意你与网页生成越来越多的并行,举个例子绘制图形、放大收缩,等等。图例是二个用HTML5构建的小游戏。

5. 地理(Geolocation) API

云顶集团400800044 18

HTML5提供了地理新闻的应用接口吉优location API。通过那几个API,网页能够透过IP,GPS等办法来得到客商的地理音讯;同期客商也足以选用是还是不是关闭那些作用。

6. 网页存款和储蓄(Web storage) API

云顶集团400800044 19

HTML5提供了网页存款和储蓄的API,方便Web应用的离线使用。除此而外,新的API绝对于cookie也颇有高安全性,高作用,更加大空间等优点。

7. 拖拽释放(Drag and drop) API

云顶集团400800044 20

我们得以经过HTML5的Drag and drop API来成功网页中的拖拽释放效果,防止了过去的网页在拖拽释放进度中需求不停修正成分的职位,代码好些个的缺陷。

CSS3 新特性

 

1. RGBa

云顶集团400800044 21

CSS3的WranglerGBa新特征允许你对各种元素进行色彩以致反射率的装置。而原来常用的opacity命令只可以对成分及其子元素进行设置。

2. Multi-column layout

云顶集团400800044 22

CSS3新提供的多栏布局选择器无需HTML布局标签就可以生成多栏布局,同期‘栏数’、‘栏宽’以致‘栏间隔’都以足以定义的。

3. Round corners

云顶集团400800044 23

圆角职能大概是CSS3提供的最实用的效应了。通过Border-radius,你能够未有其他难度的给内定的HTML成分增加圆角。並且你还足以定义圆角的轻重缓急,以致哪些角是圆角,哪个角不是圆角。

4. @font-face

云顶集团400800044 24

当网页突显某种客商未有安装的书体时,CSS3提供的@font-face功用会自动的、默默地帮客商从网络上下载相应字体。进而让设计员尤其自由的发挥,而毫无思虑客商的机器是不是安装了对应字体。

5. 其余特色

此外,CSS3还给我们带给了渐变、防止字符串过长溢出、多种背景以至用图形来作为成分边框等职能。

动用好CSS3,你能够更加高效的获取以往用超级多插件技艺收获的效劳。同过使用要素本身来替代大多数图纸,网页的加载速度会拿到进步,那一个本来是图形的内容,也能够被搜寻引擎检索到。

HTML5和CSS3的包容性

HTML5和CSS3的标准未有正式达成,各家浏览器对其协助程度也不尽相像。精晓HTML5和CSS3的宽容性是十分需要的。上面的总是是多少个特意追踪HTML5和CSS3包容性的网址,有意思味的朋友能够点击查看:

后生可畏部分你或者感兴趣的财富









赞 1 收藏 评论

云顶集团400800044 25

JS日常般的网页重构能够行使Node.js做些什么

2016/06/07 · JavaScript · 3 评论 · 重构

原稿出处: 张鑫旭(@张鑫旭)   

自己哪怕要用CSS完毕

2016/01/15 · CSS · CSS

原来的小说出处: AlloyTeam   

浅析 requestAnimationFrame

2017/03/02 · JavaScript · 1 评论 · requestAnimationFrame

初藳出处: Taobao前端共青团和少先队(FED卡塔 尔(阿拉伯语:قطر‎- 腾渊   

云顶集团400800044 26

深信现在超越百分之三十三个人在 JavaScript 中绘制动漫已经在运用 requestAnimationFrame 了,关于 requestAnimationFrame 的各个就非常的少说了,关于这几个 API 的资料,详见 http://www.w3.org/TR/animation-timing/,https://developer.mozilla.org/en/docs/Web/API/window.requestAnimationFrame。

假如大家把时钟往前拨到引进 requestAnimationFrame 以前,如果在 JavaScript 中要促成动画效果,如何是好吧?无外乎使用 setTimeout 或 setInterval。那么难题就来了:

  • 怎么鲜明科学的小时距离(浏览器、机器硬件的性质各不雷同卡塔尔?
  • 微秒的不准确性怎么消除?
  • 什么样防止过度渲染(渲染频率太高、tab 不可以知道等等卡塔 尔(阿拉伯语:قطر‎?

开采者能够用数不完艺术来减轻这几个题指标症状,可是通透到底消除,这些、基本、很难。

到底,难题的来源在于时机。对于前端开垦者来讲,setTimeout 和 setInterval 提供的是三个等长的放大计时器循环(timer loop卡塔 尔(英语:State of Qatar),可是对于浏览器内核查渲染函数的响应以至曾几何时能够发起下二个动漫帧的机缘,是全然不打听的。对于浏览器内核来说,它亦可通晓发起下三个渲染帧的熨帖时机,可是对于任何 setTimeout 和 setInterval 传入的回调函数奉行,都是等量齐观的,它很难驾驭哪个回调函数是用来动漫渲染的,因而,优化的机会极其难以调节。谬论就在于,写 JavaScript 的人驾驭大器晚成帧动漫片在哪行代码起先,哪行代码结束,却不打听应该哪一天发轫,应该哪天甘休,而在根本引擎来讲,事情却恰巧相反,所以两岸很难完美包容,直到 requestAnimationFrame 现身。

自作者很赏识 requestAnimationFrame 那几个名字,因为起得特别直白 – request animation frame,对于这些 API 最佳的分解正是名字本人了。那样四个API,你传入的 API 不是用来渲染生机勃勃帧卡通,你上街都不佳意思跟人通告。

鉴于自家是个保养读书代码的人,为了彰显本人好学的情态,特意读了下 Chrome 的代码去驾驭它是怎么落实 requestAnimationFrame 的(代码基于 Android 4.4卡塔尔:

JavaScript

int Document::requestAnimationFrame(PassRefPtr<RequestAnimationFrameCallback> callback) { if (!m_scriptedAnimationController) { m_scriptedAnimationController = ScriptedAnimationController::create(this); // We need to make sure that we don't start up the animation controller on a background tab, for example. if (!page()) m_scriptedAnimationController->suspend(); } return m_scriptedAnimationController->registerCallback(callback); }

1
2
3
4
5
6
7
8
9
10
11
int Document::requestAnimationFrame(PassRefPtr<RequestAnimationFrameCallback> callback)
{
  if (!m_scriptedAnimationController) {
    m_scriptedAnimationController = ScriptedAnimationController::create(this);
    // We need to make sure that we don't start up the animation controller on a background tab, for example.
      if (!page())
        m_scriptedAnimationController->suspend();
  }
 
  return m_scriptedAnimationController->registerCallback(callback);
}

紧密看看就认为底层达成意各州大致,生成三个 ScriptedAnimationController 的实例,然后注册那个 callback。那大家就看看 ScriptAnimationController 里面做了些什么:

JavaScript

void ScriptedAnimationController::serviceScriptedAnimations(double monotonicTimeNow) { if (!m_callbacks.size() || m_suspendCount) return; double highResNowMs = 1000.0 * m_document->loader()->timing()->monotonicTimeToZeroBasedDocumentTime(monotonicTimeNow); double legacyHighResNowMs = 1000.0 * m_document->loader()->timing()->monotonicTimeToPseudoWallTime(monotonicTimeNow); // First, generate a list of callbacks to consider. Callbacks registered from this point // on are considered only for the "next" frame, not this one. CallbackList callbacks(m_callbacks); // Invoking callbacks may detach elements from our document, which clears the document's // reference to us, so take a defensive reference. RefPtr<ScriptedAnimationController> protector(this); for (size_t i = 0; i < callbacks.size(); ++i) { RequestAnimationFrameCallback* callback = callbacks[i].get(); if (!callback->m_firedOrCancelled) { callback->m_firedOrCancelled = true; InspectorInstrumentationCookie cookie = InspectorInstrumentation::willFireAnimationFrame(m_document, callback->m_id); if (callback->m_useLegacyTimeBase) callback->handleEvent(legacyHighResNowMs); else callback->handleEvent(highResNowMs); InspectorInstrumentation::didFireAnimationFrame(cookie); } } // Remove any callbacks we fired from the list of pending callbacks. for (size_t i = 0; i < m_callbacks.size();) { if (m_callbacks[i]->m_firedOrCancelled) m_callbacks.remove(i); else ++i; } if (m_callbacks.size()) scheduleAnimation(); }

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
40
void ScriptedAnimationController::serviceScriptedAnimations(double monotonicTimeNow)
{
  if (!m_callbacks.size() || m_suspendCount)
    return;
 
    double highResNowMs = 1000.0 * m_document->loader()->timing()->monotonicTimeToZeroBasedDocumentTime(monotonicTimeNow);
    double legacyHighResNowMs = 1000.0 * m_document->loader()->timing()->monotonicTimeToPseudoWallTime(monotonicTimeNow);
 
    // First, generate a list of callbacks to consider.  Callbacks registered from this point
    // on are considered only for the "next" frame, not this one.
    CallbackList callbacks(m_callbacks);
 
    // Invoking callbacks may detach elements from our document, which clears the document's
    // reference to us, so take a defensive reference.
    RefPtr<ScriptedAnimationController> protector(this);
 
    for (size_t i = 0; i < callbacks.size(); ++i) {
        RequestAnimationFrameCallback* callback = callbacks[i].get();
      if (!callback->m_firedOrCancelled) {
        callback->m_firedOrCancelled = true;
        InspectorInstrumentationCookie cookie = InspectorInstrumentation::willFireAnimationFrame(m_document, callback->m_id);
        if (callback->m_useLegacyTimeBase)
          callback->handleEvent(legacyHighResNowMs);
        else
          callback->handleEvent(highResNowMs);
        InspectorInstrumentation::didFireAnimationFrame(cookie);
      }
    }
 
    // Remove any callbacks we fired from the list of pending callbacks.
    for (size_t i = 0; i < m_callbacks.size();) {
      if (m_callbacks[i]->m_firedOrCancelled)
        m_callbacks.remove(i);
      else
        ++i;
    }
 
    if (m_callbacks.size())
      scheduleAnimation();
}

这些函数自然正是实施回调函数的地点了。那么动漫是什么被触发的吧?大家需求飞快地看后生可畏串函数(一个从下往上的 call stack卡塔 尔(英语:State of Qatar):

JavaScript

void PageWidgetDelegate::animate(Page* page, double monotonicFrameBeginTime) { FrameView* view = mainFrameView(page); if (!view) return; view->serviceScriptedAnimations(monotonicFrameBeginTime); }

1
2
3
4
5
6
7
void PageWidgetDelegate::animate(Page* page, double monotonicFrameBeginTime)
{
  FrameView* view = mainFrameView(page);
  if (!view)
    return;
  view->serviceScriptedAnimations(monotonicFrameBeginTime);
}

JavaScript

void WebViewImpl::animate(double monotonicFrameBeginTime) { TRACE_EVENT0("webkit", "WebViewImpl::animate"); if (!monotonicFrameBeginTime) monotonicFrameBeginTime = monotonicallyIncreasingTime(); // Create synthetic wheel events as necessary for fling. if (m_gestureAnimation) { if (m_gestureAnimation->animate(monotonicFrameBeginTime)) scheduleAnimation(); else { m_gestureAnimation.clear(); if (m_layerTreeView) m_layerTreeView->didStopFlinging(); PlatformGestureEvent endScrollEvent(PlatformEvent::GestureScrollEnd, m_positionOnFlingStart, m_globalPositionOnFlingStart, 0, 0, 0, false, false, false, false); mainFrameImpl()->frame()->eventHandler()->handleGestureScrollEnd(endScrollEvent); } } if (!m_page) return; PageWidgetDelegate::animate(m_page.get(), monotonicFrameBeginTime); if (m_continuousPaintingEnabled) { ContinuousPainter::setNeedsDisplayRecursive(m_rootGraphicsLayer, m_pageOverlays.get()); m_client->scheduleAnimation(); } }

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
void WebViewImpl::animate(double monotonicFrameBeginTime)
{
  TRACE_EVENT0("webkit", "WebViewImpl::animate");
 
  if (!monotonicFrameBeginTime)
      monotonicFrameBeginTime = monotonicallyIncreasingTime();
 
  // Create synthetic wheel events as necessary for fling.
  if (m_gestureAnimation) {
    if (m_gestureAnimation->animate(monotonicFrameBeginTime))
      scheduleAnimation();
    else {
      m_gestureAnimation.clear();
      if (m_layerTreeView)
        m_layerTreeView->didStopFlinging();
 
      PlatformGestureEvent endScrollEvent(PlatformEvent::GestureScrollEnd,
          m_positionOnFlingStart, m_globalPositionOnFlingStart, 0, 0, 0,
          false, false, false, false);
 
      mainFrameImpl()->frame()->eventHandler()->handleGestureScrollEnd(endScrollEvent);
    }
  }
 
  if (!m_page)
    return;
 
  PageWidgetDelegate::animate(m_page.get(), monotonicFrameBeginTime);
 
  if (m_continuousPaintingEnabled) {
    ContinuousPainter::setNeedsDisplayRecursive(m_rootGraphicsLayer, m_pageOverlays.get());
    m_client->scheduleAnimation();
  }
}

JavaScript

void RenderWidget::AnimateIfNeeded() { if (云顶集团400800044,!animation_update_pending_云顶娱乐平台注册,) return; // Target 60FPS if vsync is on. Go as fast as we can if vsync is off. base::TimeDelta animationInterval = IsRenderingVSynced() ? base::TimeDelta::FromMilliseconds(16) : base::TimeDelta(); base::Time now = base::Time::Now(); // animation_floor_time_ is the earliest time that we should animate when // using the dead reckoning software scheduler. If we're using swapbuffers // complete callbacks to rate limit, we can ignore this floor. if (now >= animation_floor_time_ || num_swapbuffers_complete_pending_ > 0) { TRACE_EVENT0("renderer", "RenderWidget::AnimateIfNeeded") animation_floor_time_ = now + animationInterval; // Set a timer to call us back after animationInterval before // running animation callbacks so that if a callback requests another // we'll be sure to run it at the proper time. animation_timer_.Stop(); animation_timer_.Start(FROM_HERE, animationInterval, this, &RenderWidget::AnimationCallback); animation_update_pending_ = false; if (is_accelerated_compositing_active_ && compositor_) { compositor_->Animate(base::TimeTicks::Now()); } else { double frame_begin_time = (base::TimeTicks::Now() - base::TimeTicks()).InSecondsF(); webwidget_->animate(frame_begin_time); } return; } TRACE_EVENT0("renderer", "EarlyOut_AnimatedTooRecently"); if (!animation_timer_.IsRunning()) { // This code uses base::Time::Now() to calculate the floor and next fire // time because javascript's Date object uses base::Time::Now(). The // message loop uses base::TimeTicks, which on windows can have a // different granularity than base::Time. // The upshot of all this is that this function might be called before // base::Time::Now() has advanced past the animation_floor_time_. To // avoid exposing this delay to javascript, we keep posting delayed // tasks until base::Time::Now() has advanced far enough. base::TimeDelta delay = animation_floor_time_ - now; animation_timer_.Start(FROM_HERE, delay, this, &RenderWidget::AnimationCallback); } }

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
40
41
42
43
void RenderWidget::AnimateIfNeeded() {
  if (!animation_update_pending_)
    return;
 
  // Target 60FPS if vsync is on. Go as fast as we can if vsync is off.
  base::TimeDelta animationInterval = IsRenderingVSynced() ? base::TimeDelta::FromMilliseconds(16) : base::TimeDelta();
 
  base::Time now = base::Time::Now();
 
  // animation_floor_time_ is the earliest time that we should animate when
  // using the dead reckoning software scheduler. If we're using swapbuffers
  // complete callbacks to rate limit, we can ignore this floor.
  if (now >= animation_floor_time_ || num_swapbuffers_complete_pending_ > 0) {
    TRACE_EVENT0("renderer", "RenderWidget::AnimateIfNeeded")
    animation_floor_time_ = now + animationInterval;
    // Set a timer to call us back after animationInterval before
    // running animation callbacks so that if a callback requests another
    // we'll be sure to run it at the proper time.
    animation_timer_.Stop();
    animation_timer_.Start(FROM_HERE, animationInterval, this, &RenderWidget::AnimationCallback);
    animation_update_pending_ = false;
    if (is_accelerated_compositing_active_ && compositor_) {
      compositor_->Animate(base::TimeTicks::Now());
    } else {
      double frame_begin_time = (base::TimeTicks::Now() - base::TimeTicks()).InSecondsF();
      webwidget_->animate(frame_begin_time);
    }
    return;
  }
  TRACE_EVENT0("renderer", "EarlyOut_AnimatedTooRecently");
  if (!animation_timer_.IsRunning()) {
    // This code uses base::Time::Now() to calculate the floor and next fire
    // time because javascript's Date object uses base::Time::Now().  The
    // message loop uses base::TimeTicks, which on windows can have a
    // different granularity than base::Time.
    // The upshot of all this is that this function might be called before
    // base::Time::Now() has advanced past the animation_floor_time_.  To
    // avoid exposing this delay to javascript, we keep posting delayed
    // tasks until base::Time::Now() has advanced far enough.
    base::TimeDelta delay = animation_floor_time_ - now;
    animation_timer_.Start(FROM_HERE, delay, this, &RenderWidget::AnimationCallback);
  }
}

专门表达:RenderWidget 是在 ./content/renderer/render_widget.cc 中(content::RenderWidget)而非在 ./core/rendering/RenderWidget.cpp 中。我最初读 RenderWidget.cpp 还因为里面没有别的有关 animation 的代码而郁结了相当久。

见到这里其实 requestAnimationFrame 的落实原理就很肯定了:

  • 登记回调函数
  • 浏览器更新时触发 animate
  • animate 会触发全数注册过的 callback

这里的干活机制能够知晓为全体权的调换,把触发帧更新的岁月全体权交给浏览器内核,与浏览器的更新保持同步。那样做不仅能够幸免浏览器更新与动漫帧更新的不联合,又足以付与浏览器丰硕大的优化空间。
在往上的调用入口就广大了,相当多函数(RenderWidget::didInvalidateRect,RenderWidget::CompleteInit等卡塔 尔(英语:State of Qatar)会触发动漫检查,进而必要叁遍动漫帧的改过。

那边一张图表达 requestAnimationFrame 的贯彻机制(来自官方):
云顶集团400800044 27

题图: By Kai Oberhäuser

1 赞 1 收藏 1 评论

云顶集团400800044 28

关于小编:伯乐

云顶集团400800044 29

简要介绍还未来得及写 :卡塔 尔(英语:State of Qatar) 个人主页 · 小编的小说 · 4

云顶集团400800044 30

朝气蓬勃、非Computer背景前端怎么样快速领悟Node.js?

做前端的应该都听过Node.js,偏开垦背景的童鞋应该都玩过。

对此部分从未Computer背景的,专门的学行业内部容以静态页面彰显为主的前端,大概未有把玩过Node.js,且很有希望对Node.js都并未有一个比较立体的认知——知道这个家伙能够跑服务,创设比很多前端工具,看上去十分的厉害的规范,可是,恐怕就只限于此了。

“这是或不是片言之语回顾Node.js的满腹呢?”
“不可!”
“那咋做?”
“那就六言四语!”

第生机勃勃,要掌握,Node.js多个JavaScript运营情形(runtime),对的,正是用来运维Javascript. 早先JavaScript只可以在浏览器这几个小世界里黄袍加身。非常多前端小友人只怕就JS那门程序语言熟一点,别的C++, .net之类的就呵呵了。纵然是病故,假若浏览器一觉醒来杜绝了,很三人就会失业。就像是食物单生机勃勃的物种生龙活虎旦这种食品没了,就坐等灭绝是三个道理。

唯独,以往,不要操心了,Node.js让JavaScript产生杂食的了,约等于除了网页行为,能够和其他C++等语言同样,营造服务,操作文件等等。

我们应当都施用过.exe后缀的文件,双击一下,就足以蒙蔽个病毒什么的;大家恐怕还选取过.bat后缀的批管理公事,一点击,文件夹里面包车型大巴图片整体重命名;那么豆蔻梢头旦是.js后缀的文本呢(假若你的种类现已设置了Node.js意况卡塔 尔(阿拉伯语:قطر‎,双击一下则……当当当当……会展开编辑器见到JS代码,双击是还没用的!

云顶集团400800044 31

我们能够张开命令行工具,cd到钦赐目录,然后输入(假诺JS文件名称叫test.js卡塔 尔(阿拉伯语:قطر‎:

node test

1
node test

然后test.js当中的代码就足以欢喜地跑起来啦!

对于“页面仔”来说,明白那样多就够了!

  1. 安装后Node.js环境;
  2. 用我们蹩脚的JS写三个不行管理的.js文件;
  3. node执行下。

简简单单三部曲,大家就化身成了具有开垦味道的前端从业人士了。云顶集团400800044 32

写在最前

我们都以前面叁个程序猿,无论你今后是页面仔,依旧Node服务开垦者,抑或是全端大神,毫无疑问的是,大家都此前者程序猿,大家从小就对追求页面包车型客车最为具有敏锐的触觉,无论是页面完成格局的高大上、页面包车型地铁非常的性质依旧页面完美的显现,都是我们努力的言情目的。固然那一个在别人眼里,只是跟别的的页面同样没什么两样,但大家却能为个中那独有大家才知道的黄金年代抹别致而窃喜。

而前几天小编要讲的,正是大家最熟知的故交,CSS。不讲枯燥的语法,抛开js,让我们意气风发并来看业务中那别致的纯CSS达成,让大家联合来追求那更加好的页面实现,希望自身带着你走完这段旅程后,你能获得一些欣喜以至灵感。

二、蹩脚JS下的Node.js初体验

绝大数厂子都以小厂,很超越50%小厂都唯有贰个前端,超级多前端的JS其实都经常般。

领域里面通常把“前端技术方案”挂在嘴边的,实际上都以有前端团队的,因为有集体, 技术显价值。

“前端施工方案”是好,不过,如若确实关怀行当发展,应该明了,能够在三个大团队里面玩耍的实际上是小部分人,有众多浩大的同伴都以孤军作战,那套东西只怕反而阻挠了迅猛和灵活;有非常多过多的小同伴在二三四线城市,是野生的前端开荒,幼功相当不足,那套庞杂的东西很难精通;有过多浩大的品类就是多少个静态活动页面,没必要回回使用高射炮打蚊子。

此刻,往往须要的是定制化很强的小而美的拍卖。有同学只怕会思疑,哎哎,我JS水平比较菜,自造工具这种业务会不会有一点点基本啊。实际上,固然你JS平日般,依赖Node.js营造一些小工具进步本人的前端开荒功能这种业务,完全不问可知。

前者那东西,有个博尔特都认可的个性,便是上心灵!

率先,大家供给大器晚成份Node.js API文书档案,大家运用“动物搜索”,搜一下:
云顶集团400800044 33

就率先个吗,步入会见到一长排的API列表内容: 云顶集团400800044 34

不要怕,我们只须要那八个即可,没有错,就一个文件系统(fs)!云顶集团400800044 35 其余都无需管,这几个都是有名游戏用户玩的:
云顶集团400800044 36

点击去,又是广大洒洒,一群API:云顶集团400800044 37
云顶集团400800044 38

无须怕,我们只必要……淡定,不是二个,是多少个正规的增加和删除读写重命名文件就足以了。云顶集团400800044 39

好了,然后只供给一些涂鸦的JS,大家就足以玩起来了。

玩什么呢?容我看集动画想风姿洒脱想……

设计员给的Logo重命名
努力的设计员送来了香饽饽的小图片素材,可是,连接字符是下划线_,正巧,当时,前端童鞋的处女病发错,别的本身管理的图形全都以短横线-一而再一而再再而三的,这里Logo全部都以下划线受不住,想要全部替换为短横线,如何做?

云顶集团400800044 40

假定就生龙活虎多少个Logo辛亏,大不断手动更改,不过,纵然如上截图,设计员一口气给了59个Logo,小编去,要改到头皮发麻了啊~倒不是时间难点,而是重复劳动带给的这种枯燥和厌烦会影响职业的Haoqing,并且这种费力用完就没了,无法复用,且不得不分轩轾业绩(笔者可以5分钟到位一百个文件的重命名,有个卵用~)。

这时,Node.js就能够闪亮登场了,有了Node.js情况,我们只要寥寥几行JS代码,就能够完全秒杀了,很简短,读取文件夹里面包车型地铁富有图片,然后把称呼里面全数的下划线_替换到短横线-, 倘使大家的.js文件和须求管理的小图标文件夹结构如下:
云顶集团400800044 41

underscore2dash.js故事情节如下:

// 引入fs文件管理模块 var fs = require("fs"); // 未来大家要关爱的是'icons'文件夹 // 我们不要紧用变量表示那几个文件夹名称,方便日后保卫安全定和谐管理 var src = 'icons'; // API文书档案中中找到遍历文件夹的API // 找到了,是fs.readdir(path, callback) // 文档中有描述: // 读取 path 路线所在目录的从头到尾的经过。 回调函数 (callback) 选择七个参数 (err, files) 在那之中 files 是二个囤积目录中所蕴含的文件名称的数组 // 因而: fs.readdir(src, function(err, files) { // files是称呼数组,因而 // 能够使用forEach遍历哈, 此处为ES5 JS一点知识 // 若是不晓得,也得以应用for循环哈 files.forEach(function(filename) { // 上面正是文件名称重命名 // API文档中找到重命名的API,如下 // fs.rename(oldPath, newPath, callback) // 下边,大家就可以依样画葫芦,明确新旧文件名称: var oldPath = src + '/' + filename, newPath = src + '/' + filename.replace(/_/g, '-'); // 重命名走起 fs.rename(oldPath, newPath, function(err) { if (!err) { console.log(filename + '下划线替换来功!'); } }) }); });

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
// 引入fs文件处理模块
var fs = require("fs");
// 现在我们要关心的是'icons'文件夹
// 我们不妨用变量表示这个文件夹名称,方便日后维护和管理
var src = 'icons';
 
// API文档中中找到遍历文件夹的API
// 找到了,是fs.readdir(path, callback)
// 文档中有叙述:
// 读取 path 路径所在目录的内容。 回调函数 (callback) 接受两个参数 (err, files) 其中 files 是一个存储目录中所包含的文件名称的数组
// 因此:
fs.readdir(src, function(err, files) {
    // files是名称数组,因此
    // 可以使用forEach遍历哈, 此处为ES5 JS一点知识
    // 如果不清楚,也可以使用for循环哈
    files.forEach(function(filename) {
        // 下面就是文件名称重命名
        // API文档中找到重命名的API,如下
        // fs.rename(oldPath, newPath, callback)      
        // 下面,我们就可以依葫芦画瓢,确定新旧文件名称:
        var oldPath = src + '/' + filename, newPath = src + '/' + filename.replace(/_/g, '-');
        // 重命名走起
        fs.rename(oldPath, newPath, function(err) {
            if (!err) {
                console.log(filename + '下划线替换成功!');
            }      
        })
    });
});

window系统比方,大家应用cmd可能PowerShell,在对应文件夹目录下实践下该JS文件:

node underscore2dash

1
node underscore2dash

结果:
云顶集团400800044 42

这儿的公文夹的图纸们:
云顶集团400800044 43

这里的文本名批量替换不仅仅适用于图片,实际上适用于率特性式的公文。

眼前,对命名的批量拍卖不仅如此,还包括联合前缀(譬如icon_*卡塔 尔(英语:State of Qatar),这时生机勃勃旦把newPath =后满的代码改成src + '/icon_' + filename。恐怕非开荒供给,比如说批量下载的小摄像名称从1依次今后排,则……照旧要好管理下吧,forEach办法第三个参数是数组序号值,能够直接拿来用,就当课后学业了,看好你啊!

本文件夹批量管理例子,抛开详尽的讲解,大约10行出头JS代码,用到的JS方法也都是相当可怜基本的,对吗,数组遍历forEach和字符替换replace艺术,别的正是套API走套路,固然小编老伴(非IT领域卡塔 尔(英语:State of Qatar)亲自参预比赛,也都能够弄出来。轻易,况且风趣。

自家刚烈提出大学的主次开采入门课程就学JavaScript,跑web网页,跑Node.js, 轻巧且所见即所得,轻松激情学习的野趣,要比枯燥不知干嘛用的C语言更符合大范围和入门。

WHY,为什么

“小编有不菲事要做诶,忙都忙不过来,难道小编要在此CSS上边浪费广大时日?”

不,不,不,我们要做的工作,当然不会只是知足才具的求偶,而是会有实质的受益的!

本人的见地之类:

  1. CSS跟UI结合愈加严密;
  2. 用CSS来贯彻,能压缩JS总结,裁减年体育制修正,减弱重绘,进步渲染作用;
  3. 用CSS完结的,是生龙活虎种模块化,更合乎Web Components组件化观念,shadow DOM不正是专事于那般做么;
  4. 作者最爱的,逼格越来越高~

 

三、蹩脚JS下的Node.js初体验二周目

咱俩写页面实际的付出供给必然不知文件批量重命名这么简单,笔者明白有三个须要点,尤其常常写静态原型页面包车型大巴同伴一定感兴趣的。

纵然HTML页面也能够如动态语言,如php同样,各类模块能够直接include踏向。现在分布存在此样一个主题素材,某项目,重构人士劈啪啪编写了20多少个静态页面,不过,由于HTML无法直接include公用的头顶尾巴部分和左侧栏,以致,那贰11个页面包车型地铁头尾都是单独的,日常尾部内容产生了变动,呵呵,预计将在求助理编辑辑器来个批量沟通什么的了。

这是还是不是痛点?鲜明是!不论什么事痛点都是足以做出进献呈现团结价值的地点。

没有疑问,我们做事正是相对页面,大家的JS基本上能用扶上墙,但,正是这么的大家,只要你有这几个心,意识到问题所在,同期知道Node.js能够帮您完结那一点,叁个实用的工具其实已经到位了大意上。参照API文书档案,东拼拼,西凑凑,鲜明能够弄出二个足足本人用得很high的东西,剩下的十分之五就这样简轻松单续上了。

实例示例暗意
有多个原来的HTML页面,头尾都应用了近乎下边代码的正统HTML5 import导入:

<link rel="import" href="header.html"/>

1
<link rel="import" href="header.html"/>

但是,实际上,rel="import"include是一心不相同样的概念,import进去实际上是个单身的document!可是那是后话了,反正大家又不是一直浏览这几个页面,因而,大家不要在意这几个细节。

云顶集团400800044 44

HTML多少个文件结构关系如下暗意:
云顶集团400800044 45

那时,大家就能够依据Node.js甚至大家那点点JS知识,把rel="import"这行HTML替换成对应的导入的HTML页面内容。

规律其实很简单:

  1. 读import-example.html页面;
  2. href="header.html"这行HTML替换成header.html的内容;
  3. 监察和控制import-example.html页面,风姿浪漫有浮动,即时生成;
  4. 12个地道的HTML5画布示例,js做些什么。done!

下边为本例子的JS代码import.js:

// 引进fs文件管理模块 var fs = require("fs"); // 测量试验用的HTML页文件夹地址和文件名称 var src = 'import', filename = 'import-example.html'; var fnImportExample = function(src, filename) { // 读取HTML页面数据 // 使用API文书档案中的fs.readFile(filename, [options], callback) fs.readFile(src + '/' + filename, { // 须要钦命编码方式,不然再次回到原生buffer encoding: 'utf8' }, function(err, data) { // 上边要做的业务正是把 // // 这段HTML替换来href文件中的内容 // 能够求助万能的正则 var dataReplace = data.replace(//gi, function(matchs, m1) { // m1就是相配的门径地址了 // 然后就可以读文件了 return fs.readFileSync(src + '/' + m1, { encoding: 'utf8' }); }); // 由于我们要把文件放在更上拔尖目录,由此,一些相持地址要处理下 // 在本例子中,就比较轻巧,对../举办交替 dataReplace = dataReplace.replace(/"..//g, '"'); // 于是生成新的HTML文件 // 文书档案找意气风发找,发掘了fs.writeFile(filename, data, [options], callback) fs.writeFile(filename, dataReplace, { encoding: 'utf8' }, function(err) { if (err) throw err; console.log(filename + '生成成功!'); }); }); }; // 私下认可施夷光行二回 fnImportExample(src, filename); // 监控文件,更改后重新生成 fs.watch(src + '/' + filename, function(event, filename) { if (event == 'change') { console.log(src + '/' + filename + '爆发了变动,重新生成...'); fnImportExample(src, filename); } });

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
40
41
42
43
44
45
46
47
48
49
50
// 引入fs文件处理模块
var fs = require("fs");
 
// 测试用的HTML页文件夹地址和文件名称
var src = 'import', filename = 'import-example.html';
 
var fnImportExample = function(src, filename) {
    // 读取HTML页面数据
    // 使用API文档中的fs.readFile(filename, [options], callback)
    fs.readFile(src + '/' + filename, {
        // 需要指定编码方式,否则返回原生buffer
        encoding: 'utf8'
    }, function(err, data) {
        // 下面要做的事情就是把
        //
        // 这段HTML替换成href文件中的内容
        // 可以求助万能的正则
        var dataReplace = data.replace(//gi, function(matchs, m1) {
            // m1就是匹配的路径地址了
            // 然后就可以读文件了
            return fs.readFileSync(src + '/' + m1, {
                encoding: 'utf8'
            });
        });
 
        // 由于我们要把文件放在更上一级目录,因此,一些相对地址要处理下
        // 在本例子中,就比较简单,对../进行替换
        dataReplace = dataReplace.replace(/"..//g, '"');
 
        // 于是生成新的HTML文件
        // 文档找一找,发现了fs.writeFile(filename, data, [options], callback)
        fs.writeFile(filename, dataReplace, {
            encoding: 'utf8'
        }, function(err) {
            if (err) throw err;
            console.log(filename + '生成成功!');
        });
    });
};
 
// 默认先执行一次
fnImportExample(src, filename);
 
// 监控文件,变更后重新生成
fs.watch(src + '/' + filename, function(event, filename) {
    if (event == 'change') {
        console.log(src + '/' + filename + '发生了改变,重新生成...');
        fnImportExample(src, filename);
    }
});

大家那儿node run一下:

node import

1
node import

结果:
云顶集团400800044 46

此刻的公文夹:
云顶集团400800044 47

箭头所指便是新生成的HTML页面,那时的内容是:
云顶集团400800044 48

我们做客此页面:
云顶集团400800044 49

连广告都来得能够!

当时,node实际上是实时监察原始HTML是或不是爆发变化的,文书档案中的fs.watch()艺术,举例,我们把图片地址的mm1换来mm2,则:
云顶集团400800044 50

那个时候页面形成了:
云顶集团400800044 51

于是乎,叁个时刻自动编写翻译import导入HTML页面包车型客车小工具的雏形就好了。

页面重构的同伙,就不用担忧20两个原型页面公用部分修正三遍要改20多处的难题了,直接将公用的模块import进来,20三个页面分分钟编写翻译为HTML页面完全部。

当今,大家再向后看上面包车型大巴HTML协理模块引进的小工具,就是多少个简易的Node.js API和几行轻便的JS. 大家又不是开源就和好用用,非常多千头万绪气象根本就毫无去构思,所以,这么轻巧就够用了!

WHEN,何时

“小编懂了,看起来是有那么点意思,不过作者哪些时候能用CSS来做大事啊?”

在作者眼里:

  1. 贯彻的靶子是非交互作用性UI;
  2. 那般做不会给您带给超越的DOM。要理解最无法忍受的,就是肥胖的页面;
  3. 如此那般做能完美兑现UI、能覆盖全部场景,不然规划跟产物不服。

什么是非交互作用性UI,正是不会在顾客触发了某种行为时,劈啪啪来个闪瞎眼的竞相,吓得客商直接高潮,而是从页面渲染后,就径直在此边,那么坦然,那么美的半边天,哦不,UI。

 

本文由云顶集团400800044发布于云顶集团400800044,转载请注明出处:12个地道的HTML5画布示例,js做些什么

关键词:

上一篇:代码生成工具,有线品质优化

下一篇:没有了