jQuery
Mock
应用场景
在我们自己做一个项目时,会遇到后端还没完成数据输出或者接口没写好的情况。你没有办法想后台获取数据,这时候需要前端只好自己写静态模拟数据(假数据)。mockjs就是用来创造假数据的,他的用法和从后端取数据是基本一样的,基本的语法看下文,移步官方文档。
如果数据太长了,将数据写在js文件里,完成后挨个改url。某些逻辑复杂的代码,加入或去除模拟数据时得小心翼翼。想要尽可能还原真实的数据,要么编写更多代码,要么手动修改模拟数据。特殊的格式,例如IP,随机数,图片,地址,需要去收集整理。
mock优点
- 前后端分离:让前端工程师独立于后端进行开发
- 增加单元测试的真实性:通过随机数据,模拟各种场景
- 开发无侵入:不需要修改就有代码,就跨域拦截Ajax请求,返回模拟响应数据
- 用法简单:符合直觉的接口
- 数据类型丰富:支持生成随机的文本,数字,布尔值,日期,邮箱,链接,图片,颜色等
- 方便扩展:支持扩展更多数据类型,支持自定义函数和正则
- 在已有接口文档的情况下,我们可以直接按照接口文档来开发,将相对应的字段写好,在接口完成之后,只需要改变url地址即可
mock的基本使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| <script src="http://mockjs.com/dist/mock.js"></script>
//在js简单造数据 Mock.mock('http://g.cn',{ 'name':'@NAME', 'color':'@COLOR', 'email':'@EMAIL' })
//和JQ一起使用 $.ajax({ url:'http://g.cn' }).done(function(data,status,xhr){ console.log(data) })
//打印出来如下 { "name": "Donna Williams", "color": "#f2797c", "email": "p.oilvqf@eqonsg.ke" }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| Mock.mock([rurl],[rtype],[template|function(options)])
这里的参数都是可选:
rurl(可选)。 表示需要拦截的 URL,可以是 URL 字符串或 URL 正则。例如 /shoopList
rtype(可选)。 表示需要拦截的 Ajax 请求类型。例如 GET、POST、PUT、DELETE 等。
template(可选)。 表示数据模板,可以是对象或字符串。例如 { ‘data|1-10’:[{}] }
function(options)(可选)。 表示用于生成响应数据的函数。
options:指向本次请求的 Ajax 选项集
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| const data = Mock.mock({ "data|20": [{ "goodsId|+1": 1, "goodsName": "@ctitle(10)", "goodsTel": /^1(5|3|7|8)[0-9]{9}$/, "goodsAddress": "@county(true)", "goodsLogo": "@Image('200x100', 'EasyMock')", }] })
Mock.mock(/\/shoopList/,"post",function(options){ console.log(options); return data
})
|
phantomjs
ECharts
ECharts
是JavaScript
的一个可视化图形的库
安装
通过 npm 获取 echarts,npm install echarts --save
开始
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
| <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> </head>
<body> <div id="main" style="width: 600px; height: 400px;"></div> </body>
<script src="../node_modules/echarts/dist/echarts.min.js"></script> <script> var myChart = echarts.init(document.getElementById("main"));
var option = { title: { text: "ECharts 入门示例", }, tooltip: {}, legend: { data: ["销量"], }, xAxis: { data: ["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"], }, yAxis: {}, series: [ { name: "销量", type: "bar", data: [5, 20, 36, 10, 10, 20], }, ], };
myChart.setOption(option); </script> </html>
|
步骤分析:
- 首先引入
echarts
库 ,引入后全局会挂载echarts
这个对象
- 定义一个
div
指定id当作容器
echarts.init(容器).setOption({})
初始化容器且设置参数
基础概念
一个网页中可以创建多个 echarts 实例
。每个 echarts 实例
中可以创建多个图表和坐标系等等(用 option
来描述)。准备一个 DOM 节点(作为 echarts 的渲染容器),就可以在上面创建一个 echarts 实例。每个 echarts 实例独占一个 DOM 节点。
系列
系列
(series)是很常见的名词。在 echarts 里,系列
(series)是指:一组数值以及他们映射成的图。“系列”这个词原本可能来源于“一系列的数据”,而在 echarts 中取其扩展的概念,不仅表示数据,也表示数据映射成为的图。所以,一个 系列
包含的要素至少有:一组数值、图表类型(series.type
)、以及其他的关于这些数据如何映射成图的参数。
series.type
图标类型:
line
折线图
bar
柱状图
pie
饼图
scatter
散点图
graph
关系图
tree
树图
一个图标中有多个类型时,有两种定义的方案:
- 在
serise
里声明多个
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
| echarts.init(document.querySelector("#main")).setOption({ xAxis: { data: ["a","b","c","d","e","f","g"] }, yAxis: {}, dataset: { source: [ ["h", 34, 20, "XX", 52], [, 12, 20, "XX", 52], [, 33, 20, "XX", 52], ["d", 44, 20], ["e", 55, 20], ["f", 66, 20], ["g", 88, 20], ], }, series: [ { type: "pie", center: ["65%", 60], radius: 35, data: [ {name: "xx",value: 63}, {name: "yy",value: 22}, {name: "zz",value: 63}, ] }, { type: "line", data: [11,22,33,44,66,55,22] }, { type: "bar", data: [11,22,33,44,66,55,22] }, ], });
|
dataset
方式会看起来更加的方便一些,也易于管理:
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
| echarts.init(document.querySelector("#main")).setOption({ xAxis: { type: "category" }, yAxis: {}, dataset: { source: [ ["h", 34, 20, "XX", 52], ["a", 12, 20, "XX", 52], ["b", 33, 20, "XX", 52], ["d", 44, 20], ["e", 55, 20], ["f", 66, 20], ["g", 88, 20], ], }, series: [ { type: "pie", center: ["65%", 60], radius: 35, encode: { itemName: 3, value: 4 }, }, { type: "line", encode: { x: 0, y: 1 }, }, { type: "bar", encode: { x: 0, y: 2 }, }, ], });
|
组件
option
中的每一个属性都称为组件
option的常用属性:
用option描述图表
使用 option
来描述其对图表的各种需求,包括:有什么数据、要画什么图表、图表长什么样子、含有什么组件、组件能操作什么事情等等。简而言之,option
表述了:数据
、数据如何映射成图形
、交互行为
。
组件的定位
不同的组件,系列常有不同的定位方式
类似CSS的绝对定位
多数组件和系列,都能够基于 top
/ right
/ down
/ left
/ width
/ height
绝对定位。 这种绝对定位的方式,类似于 CSS
的绝对定位(position: absolute
)。绝对定位基于的是 echarts 容器 DOM 节点。
1 2 3 4 5 6 7 8
| echarts.init(dom).setOption({ grid: { left: 130, right: "30%", height: "40%", bottom: 100 } })
|
中心半径定位
少数圆形的组件或系列,可以使用“中心半径定位”,例如,pie(饼图)、sunburst(旭日图)、polar(极坐标系)。
中心半径定位,往往依据 center(中心)、radius(半径)来决定位置。
坐标系
只声明了 xAxis
、yAxis
和一个 scatter
(散点图系列),echarts 暗自为他们创建了 grid
并关联起他们:
个性化图表样式
南丁格尔图
我觉得不好看。。。
只需再属性中添加roseType:"angle"
这条属性即可
添加阴影
ECharts中有一些通用的样式,阴影透明度,颜色,边框颜色等。这些样式一般都在itemStyle
里设置
emphais
是鼠标hover时候的高亮样式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| itemStyle: { color: "gray", shadowBlur: 200, shadowOffsetX: 0, shadowOffsetY: 0, shadowColor: 'rgba(0, 0, 0, 0.5)', emphasis: { shadowBlur: 200, shadowColor: "#000" } }
|
背景颜色和浅色标签
背景颜色是全局的,所以直接再option下设置backgroundColor
文本的样式可以设置全局的textStyle
也可以每个系列分别设置,每个系列的文本设置在label.textStyle
饼图的话还要将标签的视觉引导线的颜色设为浅色
跟itemStyle
一样,label
和labelLine
的样式也有emphasis
状态
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| setOption({ backgroundColor: "#ccc", textStyle: { color: "black" }, label: { textStyle: { color: "red" } }, labelLine: { lineStyle: { color: "blue" } } })
|
设置单独扇形块的样式
ECharts中每个扇形颜色的可以通过分别设置data下的数据实现
1 2 3 4 5 6 7
| data: [{ value: 400, name: "HTML", itemStyle: { color: "blue" } }]
|
但是这次因为只有明暗度的变化,所以有一种更快捷的方式是通过 visualMap 组件将数值的大小映射到明暗度。(没明白)
1 2 3 4 5 6 7 8 9 10 11 12
| visualMap: { show: false, min: 80, max: 600, inRange: { colorLightness: [0, 1] } }
|
图表的样式
主题色
1 2
| echarts.init(dom,"light"); echarts.init(dom,"dark");
|
其他的主题,没有内置在ECharts中,需要自己加载。这些主题可以在主题编辑器里访问到,也可以使用这个主题编辑器,自己编辑祖逖,下载来的主题可以这样使用
如果主题保存为 JSON 文件,那么可以自行加载和注册,例如:
1 2 3 4 5
| $.getJSON('xxx/xxx/vintage.json', function (themeJSON) { echarts.registerTheme('vintage', JSON.parse(themeJSON)) var chart = echarts.init(dom, 'vintage'); });
|
如果保存为 UMD 格式的 JS 文件,那么支持了自注册,直接引入 JS 文件即可:
1 2 3
| var chart = echarts.init(dom, 'vintage');
|
调色盘
调色盘,可以在 option 中设置。它给定了一组颜色,图形、系列会自动从其中选择颜色。 可以设置全局的调色盘,也可以设置系列自己专属的调色盘。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| option = { color: ['#c23531','#2f4554', '#61a0a8', '#d48265', '#91c7ae','#749f83', '#ca8622', '#bda29a','#6e7074', '#546570', '#c4ccd3'],
series: [{ type: 'bar', color: ['#dd6b66','#759aa0','#e69d87','#8dc1a9','#ea7e53','#eedd78','#73a373','#73b9bc','#7289ab', '#91ca8c','#f49f42'], ... }, { type: 'pie', color: ['#37A2DA', '#32C5E9', '#67E0E3', '#9FE6B8', '#FFDB5C','#ff9f7f', '#fb7293', '#E062AE', '#E690D1', '#e7bcf3', '#9d96f5', '#8378EA', '#96BFFF'], ... }] }
|
异步数据加载和更新
异步加载
ECharts
中实现异步数据的更新非常简单,在图表初始化后不管任何时候只要通过 jQuery 等工具异步获取数据后通过 setOption
填入数据和配置项就行。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| var myChart = echarts.init(document.getElementById('main'));
$.get('data.json').done(function (data) { myChart.setOption({ title: { text: '异步数据加载示例' }, tooltip: {}, legend: { data:['销量'] }, xAxis: { data: ["衬衫","羊毛衫","雪纺衫","裤子","高跟鞋","袜子"] }, yAxis: {}, series: [{ name: '销量', type: 'bar', data: [5, 20, 36, 10, 10, 20] }] }); });
|
loading动画
如果数据加载时间较长,一个空的坐标轴放在画布上也会让用户觉得是不是产生 bug 了,因此需要一个 loading 的动画来提示用户数据正在加载。
ECharts 默认有提供了一个简单的加载动画。只需要调用 showLoading 方法显示。数据加载完成后再调用 hideLoading 方法隐藏加载动画。
1 2 3 4 5
| myChart.showLoading(); setTimeout(function (data) { myChart.hideLoading(); myChart.setOption(...); },2000);
|
数据的动态更新
ECharts 由数据驱动,数据的改变驱动图表展现的改变,因此动态数据的实现也变得异常简单。
所有数据的更新都通过 setOption实现,你只需要定时获取数据,setOption 填入数据,而不用考虑数据到底产生了那些变化,ECharts 会找到两组数据之间的差异然后通过合适的动画去表现数据的变化。
使用dataset管理数据
ECharts 4 以前,数据只能声明在各个“系列(series)”中,例如:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| series: [ { type: 'bar', name: '2015', data: [89.3, 92.1, 94.4, 85.4] }, { type: 'bar', name: '2016', data: [95.8, 89.4, 91.2, 76.9] }, { type: 'bar', name: '2017', data: [97.7, 83.1, 92.5, 78.1] } ]
|
于是,ECharts 4 提供了 数据集
(dataset
)组件来单独声明数据,它带来了这些效果:
- 能够贴近这样的数据可视化常见思维方式:基于数据(
dataset
组件来提供数据),指定数据到视觉的映射(由 encode 属性来指定映射),形成图表。
- 数据和其他配置可以被分离开来,使用者相对便于进行单独管理,也省去了一些数据处理的步骤。
- 数据可以被多个系列或者组件复用,对于大数据,不必为每个系列创建一份。
- 支持更多的数据的常用格式,例如二维数组、对象数组等,一定程度上避免使用者为了数据格式而进行转换。
图表交互组件
数据区域缩放组件
『概览数据整体,按需关注数据细节』是数据可视化的基本交互需求。dataZoom
组件能够在直角坐标系(grid)、极坐标系(polar)中实现这一功能。
dataZoom
组件是对 数轴(axis)
进行『数据窗口缩放』『数据窗口平移』操作
dataZoom
组件可同时存在多个,起到共同控制的作用。控制同一个数轴的组件,会自动联动
dataZoom
的运行原理是通过『数据过滤』来达到『数据窗口缩放』的效果。
数据过滤模式的设置不同,效果也不同,
dataZoom
的数据窗口范围的设置,目前支持两种形式:
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
| xAxis: { type: "value", }, yAxis: { type: "value", }, dataZoom: [ { type: "slider", // 这个 dataZoom 组件是 slider 型 dataZoom 组件 start: 10, // 左边在 10% 的位置。 end: 50, // 右边在 60% 的位置。 }, ], series: [ { type: "scatter", // 这是个『散点图』 itemStyle: { opacity: 0.5, }, symbolSize: function (val) { return val[2] * 40; }, data: [ ["14.616", "7.241", "0.896"], ["3.958", "5.701", "0.955"], ["2.768", "8.971", "0.669"], ["9.051", "9.710", "0.171"], ["14.046", "4.182", "0.536"], ["12.295", "1.429", "0.962"], ["4.417", "8.167", "0.113"], ["0.492", "4.771", "0.785"], ["7.632", "2.605", "0.645"], ["14.242", "5.042", "0.368"], ], }, ],
|
type
的值
slider
是以图表底部的进度条来进行缩放
inside
是以鼠标滚轮键对图表进行缩放
移动端自适应
Media Query 提供了『随着容器尺寸改变而改变』的能力。
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
| option = { baseOption: { // 这里是基本的『原子option』。 title: {...}, legend: {...}, series: [{...}, {...}, ...], ... }, media: [ // 这里定义了 media query 的逐条规则。 { query: { minWidth: 200, maxHeight: 300, minAspectRatio: 1.3 }, // 这里写规则。 option: { // 这里写此规则满足下的option。 legend: {...}, ... } }, { query: {...}, // 第二个规则。 option: { // 第二个规则对应的option。 legend: {...}, ... } }, { option: { // 即所有规则都不满足时,采纳这个option。 legend: {...}, ... } } ] };
|
数据的视觉映射
数据可视化是 数据 到 视觉元素 的映射过程(这个过程也可称为视觉编码,视觉元素也可称为视觉通道)。
事件和行为