介绍

Droptiles是一套Metro风格的类似Win8的Web2.0控制面板。它采用图块(tiles)建立用户体验。图块(tiles)是一些可以从外部资源中获取数据的迷你应用。点击图块(tile)就能够启动全部应用。应用可以是任意已存在的网站,抑或专门为面板式体验而设计的自定义网站。Droptiles几乎全部是用HTML, Javascript 和CSS创建的,因此它具有很高的平台可移植性。示例工程采用ASP.NET创建,展示了一些服务端功能:如注册、登录以及从服务器获取动态数据。你也可以很容易地把它转变到PHP, Ruby, JSP或者其它平台。Droptiles是我之前编写的Dropthings的续篇,它是第一个开源的Web2.0控制面板。

访问 Droptiles.com 获得即时体验!

https://github.com/oazabir/Droptiles获取代码。

特征

  • Metro风格的UI。它是一个受metroui.org.ua启发的CSS框架,用来创建Metro风格的网站。

  • 拖拽图块(tiles)定制个性化体验。

  • 客户端对象模型及数据绑定,简化了MVVM模式的实现。

  • 服务端实现具有平台无关性,采用PHP, JSP皆很轻松。

  • 实时图块(Live Tiles),图块(Tiles)即是迷你应用,可以从多种源中加载数据。

它甚至有自己的应用商店!

如何使用Droptiles 

  • 企业Dashboard整合来自不同系统的数据,并提供为内联网/互联网应用一个快速启动板。

  • Web 2.0的门户网站,提供tile形式的portlets。整合来自各种服务的数据,并作为不同服务的快速启动板。

  • 触摸启用Kiosk前端。最适用于酒店,餐厅,银行前台自助服务。

  • 新闻的内容整合器和研究目的。

主要部分

Droptiles有三个主要部分:

  • Dashboard

  • 应用程序商店

  • 登录,注册,设置。

Dashboard是展示tiles的主页面。  
App商店陈列了一系列可让用户添加到Dashboard上的应用程序。  
登录,注册,设定区都是用ASP.NET设计的且它们还使用了ASP.NET的Membership provider。

Dashboard

Dashboard由各个部分构成。每部分包含一系列tiles。你看到到每个框都是一个Tile。tiles是迷你型应用程序。一个tile可以是以下几种类型:

  • 简单的html页面

  • 一个动态JavaScript迷你App

  • 动态网页

编写一个瓦片组件

让我们来看看 Flickr 的瓦片组件. 首先,所有的瓦片组件外观都在 Tiles.js 文件中定义, 它包含了所有瓦片组件的元数据. 例如, Flickr 瓦片组件元数据定义如下:

01 flickr: function (uniqueId) {
02         return {
03             uniqueId: uniqueId,
04             name: "flickr",
05             iconSrc: "img/Flickr alt 1.png",
06             label: "Flickr",
07             size: "tile-double tile-double-vertical",
08             color: "bg-color-darken",
09             appUrl: "http://www.flickr.com/",
10             cssSrc: ["tiles/flickr/flickr.css"],
11             scriptSrc: ["tiles/flickr/flickr.js"],
12             initFunc: "flickr_load"
13         };
14     }

icon 表示 javascript, css, html 被载入时将在瓦片组件上显示的默认图标. 瓦片组件水平和垂直的尺寸在size属性中定义. 然后当点击瓦片时,将会在全屏视图中打开的URL定义在appUrl中. 附带需要加载的 CSS, Javascripts 在cssSrc和 scriptSrc中定义. 最后 initFunc 告知了js在被加载时都会运行一次的函数.

元数据定义了瓦片组件如何在面板上显示. 从Flickr加载数据的行为来自Flickr.js 文件, 定义如下:

01 function flickr_load(tile, div) {
02   
03         var url = "http://api.flickr.com/services/feeds/photos_public.gne?lang=en-us&format=json&tags=nature&jsoncallback=?";    
04   
05         $.getJSON(url, function (data) {        
06             var ctr = 0;
07             $.each(data.items.reverse(), function (i, item) {
08                 if (item.tags.length < 150) {
09                     var sourceSquare = item.media.m;
10                     var sourceOrig = (item.media.m).replace("_m.jpg"".jpg");
11   
12                     var htmlString = '';
13                     htmlString += '';
14                     htmlString += '' + item.title + '' +
15                         '';
16   
17                     tile.slides.push(htmlString);
18   
19                     ctr = ctr + 1;
20                 }
21             });
22   
23             tile.counter(ctr);
24         });
25   
26     }

这就是了.

瓦片组件可以是直接在瓦片盒里面直接加载的动态aspx页面. 例如:

仪表面板的运行方式是:

  • 首先获取区域的列表,还有每个区域中瓦片组件的列表.

  • 按照Tiles.js文件中的定义创建瓦片盒子.

  • 对于每一个瓦片, 看看瓦片组件是否有任何外部的JS, CSS 和 html 文件需要加载. 如果有,就加载它们.

  • 执行在initFunc定义的函数. 向其传入瓦片对象, 瓦片组件的div引用还有initParams .

默认的Dashboard上的tile显示

Dashboard上默认的tile的显示方法同样在Tiles.js文件中定义:

01 window.DefaultTiles = [
02         {
03             name :"Section1",
04             tiles: [
05                { id: "flickr1", name:"flickr" },
06                { id: "amazon1", name:"amazon" },
07                { id: "news1", name: "news" },
08                { id: "weather1", name: "weather" },
09                { id: "calendar1", name: "calendar" },
10                { id: "feature1", name: "feature" },
11                { id: "facebook1", name: "facebook" }
12             ]
13         },
14         {
15             name: "Section2",
16             tiles: [
17                { id: "wikipedia1", name: "wikipedia" },           
18                { id: "email1", name: "email" },
19                { id: "maps1", name: "maps" },
20                { id: "angrybirds1", name: "angrybirds" },
21                { id: "cuttherope1", name: "cutTheRope" },
22                { id: "dynamicTile1", name: "dynamicTile" },
23                { id: "buy1", name: "buy" }]
24         },
25         {
26             name: "Section3", tiles: [
27                { id: "youtube1", name: "youtube" },
28                { id: "ie1", name: "ie" },
29   
30             ]
31         }
32     ];

Tile按照他们被定义的顺序显示。他们的名字不用和Tile metadata中定义的名字相一致。

tile的HTML标记

在一个tile上有不同的部分:

下面的html定义了这种tile设计:

01    <div class="metro-sections" data-bind="foreach: sections">
02         <div class="metro-section" data-bind="attr: {id : uniqueId}, foreach: sortedTiles">
03             <div data-bind="attr: { id: uniqueId, 'class': tileClasses }">
04                 <!-- ko if: tileImage -->
05                 <div class="tile-image">
06                     <img data-bind="attr: { src: tileImage }" src="img/Internet%20Explorer.png" />
07                 </div>
08                 <!-- /ko -->
09                 <!-- ko if: iconSrc -->
10                 <!-- ko if: slides().length == 0 -->
11                 <div data-bind="attr: { 'class': iconClasses }">
12                     <img data-bind="attr: { src: iconSrc }" src="img/Internet%20Explorer.png" />
13                 </div>
14                 <!-- /ko -->
15                 <!-- /ko -->
16                 <div data-bind="foreach: slides">
17                     <div class="tile-content-main">
18                         <div data-bind="html: $data">
19                         </div>
20                     </div>
21                 </div>
22                 <!-- ko if: label -->
23                 <span class="tile-label" data-bind="html: label">Label</span>
24                 <!-- /ko -->
25                 <!-- ko if: counter -->
26                 <span class="tile-counter" data-bind="html: counter">10</span>
27                 <!-- /ko -->
28                 <!-- ko if: subContent -->
29                 <div data-bind="attr: { 'class': subContentClasses }, html: subContent">
30                     subContent
31                 </div>
32                 <!-- /ko -->
33             </div>
34         </div>
35     </div>

标记中到处都是KnockoutJS标记,它们被用于绑定Tile对象模型到html对象。

Dashboard运行

这里的流程图显示了Dashboard是如何被加载的:

Dashboard.js中的代码直截了当,并且魔法般地实现了功能!

01 var viewModel = new DashboardModel("Start", [], window.currentUser, ui, TileBuilders);
02   
03     $(document).ready(function () {
04   
05         // Hide the body area until it is fully loaded in order to prevent flickrs
06         $('#content').css('visibility''visible');
07   
08         // Initiate KnockoutJS binding which creates all the tiles and binds the whole
09         // UI to viewModel.
10         ko.applyBindings(viewModel);
11   
12         // See if user has a previous session where page setup was stored
13         var cookie = readCookie("p");
14         if (cookie != null && cookie.length > 0) {
15             try {
16                 viewModel.loadSectionsFromString(cookie);
17             catch (e) {
18                 // Failed to load saved tiles. Load the default tiles.
19                 viewModel.loadSectionsFromString(DefaultTiles);
20             }
21         }
22         else {
23             // No cookie, load default tiles. Defined in Tiles.js
24             viewModel.loadSectionsFromString(DefaultTiles);
25         }

首先如果有记录的话,它会尝试从cookie中读取section和tile的设置。如果没有设置,它会加载默认的定义。之后,Core.js中的框架姜夔启动,并开始处理tile的创建工作,并将动态行为加入tile中。

代码已经被详细文档化了,你可以从那里获取更多细节。

应用商店

应用商店的外观是采用和Dashborad同样的方式建立的. 应用商店展示了Droptiles框架的可重用性. 它同样使用了TheCore.js 来提供外观. 唯一的不同时它没有使用 Tiles.js 来定义瓦片组件的元数据还有默认的瓦片组件, 它有其自己的AppStoreTiles.js 来定义瓦片组件元数据和在应用商店上面默认显示的瓦片组件.

这就是所有的不同之处了.

下面是 AppStore.js中的代码:

01 var viewModel = new DashboardModel("App Store", [], window.currentUser, ui, 
02         TileBuilders);
03   
04     $(document).ready(function () {
05   
06         // Hide the body area until it is fully loaded in order to prevent flickrs
07         $('#content').css('visibility''visible');
08   
09         // Initiate KnockoutJS binding which creates all the tiles and binds the whole
10         // UI to viewModel.
11         ko.applyBindings(viewModel);
12   
13         viewModel.switchTheme('theme-white');
14         viewModel.loadSectionsFromString(window.AppStoreTiles);

那就是了.loadSectionsFromString 函数负责创建应用商店中的瓦片组件. 它从一个字符串序列格式中获取区域和瓦片配置, 像这样:

1 Section1~flickr1,flickr.news1,news|Section2~angrybirds1,angrybirds

这是它存储在cookie中的方式,以便于你下一次访问Dashboard时展示你上次在上面留下的东西.

总结

Droptiles是一个开源项目,迎来展示Windows 8开始界面外观可以只使用HTML, Javascript 和 CSS实现. 它可以被用来构建各种类型的web应用程序,特别是触摸设备上的应用程序. 现代的Metro外观使得其作为自助终端或者内容聚合器前端非常具有吸引力.

Droptiles - 炫酷的 Metro 风格的层叠式 Web 面板的更多相关文章

  1. 使用three.js实现炫酷的酸性风格3D页面

    背景 近期学习了 WebGL 和 Three.js 的一些基础知识,于是想结合最近流行的酸性设计风格,装饰一下个人主页,同时总结一些学到的知识.本文内容主要介绍,通过使用 React + three. ...

  2. 使用Three.js实现炫酷的赛博朋克风格3D数字地球大屏 🌐

    声明:本文涉及图文和模型素材仅用于个人学习.研究和欣赏,请勿二次修改.非法传播.转载.出版.商用.及进行其他获利行为. 背景 近期工作有涉及到数字大屏的需求,于是利用业余时间,结合 Three.js ...

  3. Win8 Metro风格的Web桌面HteOS

    前言     曾经天天折腾ExtJS,折腾累了.近期这段时间開始用jquery来做一些东西,发现还是蛮有意思的.可是做到最后才发现,原来做好设计真的很重要. 上图就是HteOS项目的截图,眼下正在开发 ...

  4. Android开发之炫酷MD风格

    文章转自:一点点征服的 http://www.cnblogs.com/ldq2016/p/5217590.html 安卓开发中非常炫的效果集合 这几天开发的时候,想做一些好看而且酷炫的特效,于是又开始 ...

  5. 8个超炫酷仿HTML5动画源码

    1.jQuery万年历插件 带农历老皇历功能 这是一款基于jQuery的日历插件,这款日历插件和之前分享的日历控件有很大差异,它是一本万年历,包含了农历已经老皇历的功能,是一个挑好日子的工具.同时日历 ...

  6. Qt之QSS(黑色炫酷)

    简述 Qt助手中有关于各种部件的QSS详细讲解,资源很丰富,请参考:Qt Style Sheets Examples. 黑色炫酷 - 一款漂亮的QSS风格. 之前博客中分享了很多关于Qt的样式效果,几 ...

  7. 8个超炫酷的纯CSS3动画及源码分享

    在现代网页中,我们已经越来越习惯使用大量的CSS3元素,而现在的浏览器也基本都支持CSS3,所以很多时候我们不妨思考一下是否可以用纯CSS3制作一些有趣或者实用的网页.本文要分享8个超炫酷的纯CSS3 ...

  8. 7款经典炫酷的HTML5/jQuery动画应用示例及源码

    jQuery是一款普遍受前端开发者欢迎的Javascript框架,但是开发者貌似更关注jQuery开发的插件,海量的jQuery插件让前端开发者非常方便.HTML5的加入让jQuery这个家族更加丰富 ...

  9. web前端炫酷实用的HTML5应用和jQuery插件

    又开始了新的一天,我们也将继续为大家分享许多优秀的HTML5应用和jQuery插件,作为前端开发者来说,这些资源可以帮助你在项目开发上派上用场.下面一起来看看这些炫酷而实用的HTML5应用和jQuer ...

随机推荐

  1. selenium+python : Waits---study

    from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.s ...

  2. (Apache)ab 压力测试 简单使用

    该工具在Apache安装目录的bin目录里面.所以想要这个使用这个工具,只需要下载Apache即可.在Window环境下,推荐使用 PhpStudy 工具的集成环境.就可以轻松拥有Apache.ab压 ...

  3. 利用ichart绘制网页图表

    首先,最好的教程在这里:ichartjs 有了这个网站,要绘制网页图表简直方便愉快! 接下来说一下使用方法~~~ 进入网站,点击在线设计器 在线设计器的使用方法就不说了,摸索一下就会了!关键在于两个地 ...

  4. cocos2dx 3.x ccDrawLine一个坑

    ccDrawLine,如果传进去的坐标是INFINITY,画不出来.

  5. NGUI UIPanel绘制原理学习

    NGUI底层绘制都是调用UIDrawCall来完成的,它会动态实例化出材质球,改变UV偏移和缩放(图集显示).并且全部是面片 UIPanel也是面片,但是内部物体遮罩比较特殊,经过查找发现,影响UIP ...

  6. HDU 4952 Poor Mitsui(贪心)

    HDU 4957 Poor Mitsui pid=4957" style="">题目链接 思路:利用相邻交换法去贪心就可以.注意容积为0的情况,这是个坑点 代码: ...

  7. Oracle PLSQL Demo - 09.Open、Fetch遍历游标[Open, Fetch, Close Record CURSOR]

    declare r_emp scott.emp%rowtype; cursor cur_emp is select t.* from scott.emp t; begin open cur_emp; ...

  8. mysql 5.7.13 安装配置方法图文教程(win10) (转)

    http://www.jb51.net/article/87152.htm ***************************** MySQL是一款关系型数据库管理系统,是由Oracle旗下公司M ...

  9. FreeRTOS 独立看门狗监测任务执行状态

    以下转载自安富莱电子: http://forum.armfly.com/forum.php 通过前面的几个章节,我们基本已经完成了 FreeRTOS 所有功能的讲解,本章节为大家介绍一种使用独立看门狗 ...

  10. 被linux线程基础折磨的点滴——还是没得到完美的答案,但至少得到了所需

    #include<sys/types.h> #include<unistd.h> #include<stdio.h> #include<stdlib.h> ...