Metro Dashboard Demo - Metro风格Dashboard演示

这是之前花了1-2天时间完成一个Metro风格的Dashboard 高保真Demo效果,单看效果还不错,推介一下。 演示主要用到了两个重要插件:

  1. gridster link(下面演示中,点击详情页可查看效果)
  2. gridList link(下面演示中,首页即是效果)

其中1只支持纵向扩展,并不太符合Metro风格,2虽然支持横向扩展,但本身有些不完善,在github issues提出了建议,但由于项目紧迫,就临时做了补丁式完善。


效果如下:


Metro风格快速实现的技术方案

在 Windows 8 发布后的 2013-2014 年间,Metro 设计风格(后更名为 Modern UI)在前端领域相当流行。

技术栈选择

┌─────────────────────────────────────┐
│         Metro Dashboard              │
├─────────────────────────────────────┤
│  Gridster / GridList (拖拽网格)      │
│  ├── 碰撞检测                        │
│  ├── 动态布局                        │
│  └── 拖拽调整                        │
├─────────────────────────────────────┤
│  jQuery 1.11 + jQuery UI            │
│  ├── DOM 操作                        │
│  └── 交互事件                        │
├─────────────────────────────────────┤
│  Highcharts 3D / ECharts            │
│  └── 图表渲染                        │
├─────────────────────────────────────┤
│  CSS3 Transforms + Animations       │
│  ├── 3D 翻转入场                     │
│  ├── 悬停缩放                        │
│  └── 过渡动画                        │
└─────────────────────────────────────┘

核心实现要点

1. 字体与色彩系统

Metro 风格的识别度很大程度上来自于 Microsoft 的官方字体和配色:

/* 使用 Segoe UI 获得原生 Windows 感觉 */
font-family: "Segoe UI", "Segoe UI Web Regular",
             "Segoe UI Symbol", "Helvetica Neue",
             "Microsoft YaHei", sans-serif;

/* 扁平化高饱和度色彩 */
background-color: #00AAEF; /* 蓝色 */
background-color: #42B618; /* 绿色 */
background-color: #F78E00; /* 橙色 */
background-color: #D62C29; /* 红色 */

这个方案的优势在于:

  • Segoe UI 是 Windows 系统字体,无需额外加载
  • 纯色背景 配合 CSS3,无需图片资源
  • 通过 CSS 类即可快速切换主题色彩

2. 磁贴入场动画

使用 CSS3 3D Transform 实现磁贴翻转效果:

/* 初始状态:沿 Y 轴旋转 90 度(不可见) */
.unloaded {
    opacity: 0;
    -webkit-transform: rotateY(-90deg);
}

/* 过渡动画 */
.animation {
    -webkit-transition: opacity 0.3s, -webkit-transform 0.3s;
    -webkit-filter: blur(2px);
}

配合 JavaScript 实现交错入场:

// 每个磁贴延迟 100ms,形成流畅的级联效果
$("ul li .content").each(function(index) {
    setTimeout(function() {
        $(this).removeClass("unloaded");
    }, 100 * index);
});

3. 横向滚动体验

Metro 风格的特色之一是横向滚动:

// 鼠标滚轮横向滚动(Ctrl + 滚轮恢复纵向)
$("body").mousewheel(function(event, delta) {
    if (event.ctrlKey) {
        this.scrollTop -= (delta * 100);
    } else {
        $(this).animate({
            scrollLeft: this.scrollLeft - (delta * 100)
        }, 30);
    }
    event.preventDefault();
});

4. Gridster 网格布局配置

$(".gridster ul").gridster({
    widget_base_dimensions: [100, 80],
    widget_margins: [5, 5],
    autogrow_cols: true,
    helper: 'clone',
    draggable: {
        handle: 'div.header'  // 仅通过标题栏拖拽
    },
    resize: {
        enabled: true,
        max_size: [6, 6],
        min_size: [1, 1],
        stop: function(e, ui, $widget) {
            // 调整大小时重建图表
            var id = $widget.find("div.content").attr("id");
            eval("Demo.BuildChart" + id + "()");
        }
    }
});

5. 悬停交互效果

div.widget:hover {
    z-index: 10;
    border: 3px solid rgba(255, 255, 255, 0.4);
    -webkit-transform: scale(1.05);  /* 轻微放大 */
}


相关布局组件推荐

除了 Demo 中使用的 Gridster 和 GridList,还有许多优秀的 JavaScript 布局组件可供选择:

拖拽网格类

组件 特点 适用场景
Gridstack.js 支持 Bootstrap V3、响应式、触屏设备 现代 Dashboard
Packery 使用 bin-packing 算法实现无缝隙布局 瀑布流、图片画廊
jQuery Gridly 拖拽、交换、删除、调整大小 灵活布局
Dazzle React 专用、UI 框架无关 React 项目

瀑布流类

组件 特点 适用场景
Masonry 去除不同高度元素间的空白 图片画廊、电商站点
Freewall 跨浏览器、响应式、CSS3 动画、支持 Metro 风格 多类型网格布局
Wookmark 瀑布流布局 图片列表
Minigrid 零依赖、仅 2KB 轻量级项目

高度对齐类

组件 特点
MatchHeight.js 使元素高度相等,处理混合 padding、margin
Equal Height Blocks 响应式、高度统一

Angular/React 专用

组件 框架 特点
Angular-Gridster Angular 双向数据绑定
Dazzle React 网格布局、组件化

选择建议:

  • jQuery 项目:Gridstack.js 是 Gridster 的现代替代品,文档更完善
  • React 项目:推荐 Dazzle,组件化更友好
  • 轻量级需求:Minigrid 仅 2KB,无外部依赖
  • 瀑布流需求:Masonry 是经典选择,Freewall 功能更丰富

程序代码:Github Link