学习EChart.js(四) 移动端显示
ECharts.js 移动端显示
现在很多时候,我们是在用手机、pad等一些移动端设备来进行办公获取数据。所以我们的图表很多时候是需要用移动端设置来查看的,而我们的图表有时候因为数据的偏多,会出现遮挡和重叠的情况。这个时候就需要对移动端的图标显示做一些优化,ECharts对于移动端的优化和支持主要有2个方面。
一、ECharts组件的定位和布局
组件的定位官方描写的比较详细也比较全,我的简单理解为,ECharts.js对于图表里面每个组件和工具都采用了两种尺寸单位和设置固定位置。
一种是比较直接的 像素(px),设置的时间直接以 number 形式填写。比如
title:{
text:'ECharts 数据统计',
top:20
}
这里就是设置标题组件的距离上面的高度是20px。
还有一种是安装百分比(%)的形式来设置的,百分比值是 string 类型,需要加上引号。比如
legend:{
data:['访问量','用户量'],
left:'50%'
}
这里标识legend组件的位置距离左侧的距离是整个图表的50%宽度
另外可以通过固定的值来设置所在位置,比如:
- 可以设置
left: 'center'
,表示水平居中。 - 可以设置
top: 'middle'
,表示垂直居中。
另外针对不同类型的图标还有不同的定位方式。
布局这块可以简单归结为两种,一种是 横向(horizontal)显示,一种是 纵向(vertical)显示。
二、ECharts自适应能力Media Query
Media Query 提供了『随着容器的尺寸改变而改变』的能力。
option = {
baseOption: { // 这里是基本的『原子option』。
title: {...},
legend: {...},
series: [{...}, {...}, ...],
...
},
media: [ // 这里定义了 media query 的逐条规则。
{
query: {...}, // 这里写规则。
option: { // 这里写此规则满足下的option。
legend: {...},
...
}
},
{
query: {...}, // 第二个规则。
option: { // 第二个规则对应的option。
legend: {...},
...
}
},
{ // 这条里没有写规则,表示『默认』,
option: { // 即所有规则都不满足时,采纳这个option。
legend: {...},
...
}
}
]
};
上面的例子中,baseOption
、以及 media
每个 option 都是『原子 option』,即普通的含有各组件、系列定义的 option。而由『原子option』组合成的整个 option,我们称为『复合 option』。baseOption
是必然被使用的,此外,满足了某个 query
条件时,对应的 option 会被使用 chart.mergeOption()
来 merge 进去。
多个 query 被满足时的优先级:
注意,可以有多个 query
同时被满足,会都被 mergeOption
,定义在后的后被 merge(即优先级更高)。
默认 query:
如果 media
中有某项不写 query
,则表示『默认值』,即所有规则都不满足时,采纳这个option。
容器大小实时变化时的注意事项:
在不少情况下,并不需要容器DOM节点任意随着拖拽变化大小,而是只是根据不同终端设置几个典型尺寸。
但是如果容器DOM节点需要能任意随着拖拽变化大小,那么目前使用时需要注意这件事:某个配置项,如果在某一个 query option
中出现,那么在其他 query option
中也必须出现,否则不能够回归到原来的状态。(left/right/top/bottom/width/height
不受这个限制。)
『复合 option』 中的 media
不支持 merge
也就是说,当第二(或三、四、五 ...)次 chart.setOption(rawOption)
时,如果 rawOption
是 复合option
(即包含 media
列表),那么新的 rawOption.media
列表不会和老的 media
列表进行 merge,而是简单替代。当然,rawOption.baseOption
仍然会正常和老的 option 进行merge。
其实,很少有场景需要使用『复合 option』来多次 setOption
,而我们推荐的做法是,使用 mediaQuery 时,第一次setOption使用『复合 option』,后面 setOption
时仅使用 『原子 option』,也就是仅仅用 setOption 来改变 baseOption
。
以上是EChart提供的关于移动端小屏幕自适应的方法,我另外提供一种方式
通过JS识别浏览器信息,然后根据所得的信息,设置图表容器的尺寸,然后再结合EChart的media query更好的展示图表
检测是否为移动端的JS
var ismobile = false;
var browser = {
versions: function () {
var u = navigator.userAgent, app = navigator.appVersion;
return {
trident: u.indexOf('Trident') > -1, //IE内核
presto: u.indexOf('Presto') > -1, //opera内核
webKit: u.indexOf('AppleWebKit') > -1, //苹果、谷歌内核
gecko: u.indexOf('Gecko') > -1 && u.indexOf('KHTML') == -1, //火狐内核
mobile: !!u.match(/AppleWebKit.*Mobile.*/) || !!u.match(/AppleWebKit/), //是否为移动终端
ios: !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/), //ios终端
android: u.indexOf('Android') > -1 || u.indexOf('Linux') > -1, //android终端或者uc浏览器
iPhone: u.indexOf('iPhone') > -1 || u.indexOf('Mac') > -1, //是否为iPhone或者QQHD浏览器
iPad: u.indexOf('iPad') > -1, //是否iPad
webApp: u.indexOf('Safari') == -1 //是否web应该程序,没有头部与底部
};
}(),
language: (navigator.browserLanguage || navigator.language).toLowerCase()
}
ismobile = browser.versions.mobile;
这段代码能够识别大部分的移动端设备的浏览器信息,对于一些特殊的浏览器可能会存在缺陷
根据浏览器尺寸,设置图表容器的大小
if (browser.versions.mobile) {
window.addEventListener("onorientationchange" in window ? "orientationchange" : "resize", hengshuping, false);
$("#chartmain").height(pageheight*0.6);
$("#chartmain").width(pagewidth * 0.95);
}
else {
$("#chartmain").height("500px");
$("#chartmain").width("700px");
} function hengshuping(){
if(window.orientation==180||window.orientation==0){
$("#chartmain").height($(window).height()-20);
$("#chartmain").width("100%");
}
if(window.orientation==90||window.orientation==-90){
$("#chartmain").height($(window).height()-20);
$("#chartmain").width("100%");
}
}
结合EChart的 Media Query 设置图表参数
function init(){
///折现报表实现代码
var myChart = echarts.init(document.getElementById('chartmain'));
option = {
baseOption:{
title : {
text: '奶牛数字化养殖报表',
subtext: '西部电子数据采集'
},
tooltip : {
trigger: 'axis'
},
legend: {
data:['每日饲喂量','产奶量']
},
toolbox: {
show : true,
feature : {
mark : {show: true},
dataView : {show: true, readOnly: false},
magicType : {show: true, type: ['line', 'bar', 'stack', 'tiled']},
restore : {show: true},
saveAsImage : {show: true}
}
},
calculable : true,
xAxis : [
{
type : 'category',
boundaryGap : false,
data : ['周一','周二','周三','周四','周五','周六','周日']
}
],
yAxis : [
{
type : 'value'
}
],
series : [
{
name:'每日饲喂量',
type:'line',
smooth:true,
itemStyle: {normal: {areaStyle: {type: 'default'}}},
data:[100, 200, 150, 130, 260, 830, 710]
},
{
name:'产奶量',
type:'line',
smooth:true,
itemStyle: {normal: {areaStyle: {type: 'default'}}},
data:[30, 182, 216, 156, 390, 300, 356]
}
]
},
media:[
//media开始
{
query:{},
option:{
title : {
text: '奶牛数字化养殖报表',
subtext: '西部电子数据采集'
},
tooltip : {
trigger: 'axis'
},
legend: {
data:['每日饲喂量','产奶量']
},
toolbox: {
show : true,
feature : {
mark : {show: true},
dataView : {show: true, readOnly: false},
magicType : {show: true, type: ['line', 'bar', 'stack', 'tiled']},
restore : {show: true},
saveAsImage : {show: true}
}
},
calculable : true,
xAxis : [
{
type : 'category',
boundaryGap : false,
data : ['周一','周二','周三','周四','周五','周六','周日']
}
],
yAxis : [
{
type : 'value'
}
],
series : [
{
name:'每日饲喂量',
type:'line',
smooth:true,
itemStyle: {normal: {areaStyle: {type: 'default'}}},
data:[100, 200, 150, 130, 260, 830, 710]
},
{
name:'产奶量',
type:'line',
smooth:true,
itemStyle: {normal: {areaStyle: {type: 'default'}}},
data:[30, 182, 216, 156, 390, 300, 356]
}
]
}
},
{
query:{maxWidth:400,ismobile:true},
option:{
title : {
text: '奶牛数字化养殖报表',
subtext: '西部电子数据采集'
},
tooltip : {
trigger: 'axis'
},
legend: {
data:['每日饲喂量','产奶量'],
right: 'center',
bottom: 0,
orient: 'horizontal'
},
toolbox: {
show : true,
orient:'vertical',
feature : {
mark : {show: true},
dataView : {show: true, readOnly: false},
magicType : {show: true, type: ['line', 'bar', 'stack', 'tiled']},
restore : {show: true},
saveAsImage : {show: true}
}
},
calculable : true,
xAxis : [
{
type : 'category',
boundaryGap : false,
data : ['周一','周二','周三','周四','周五','周六','周日']
}
],
yAxis : [
{
type : 'value'
}
],
series : [
{
name:'每日饲喂量',
type:'line',
smooth:true,
itemStyle: {normal: {areaStyle: {type: 'default'}}},
data:[100, 200, 150, 130, 260, 830, 710]
},
{
name:'产奶量',
type:'line',
smooth:true,
itemStyle: {normal: {areaStyle: {type: 'default'}}},
data:[30, 182, 216, 156, 390, 300, 356]
}
]
}
} //media结束
]
}; myChart.setOption(option);
}
效果展示
学习EChart.js(四) 移动端显示的更多相关文章
- OpenLayers学习笔记(四)— QML显示html中openlayers地图的坐标
GitHub:八至 作者:狐狸家的鱼 本文链接:实现QML中显示html中地图的坐标 如何QML与HTML通信已经在这篇文章 QML与HTML通信之画图 详细讲述了 1.HTML var coord; ...
- react.js学习之路四
针对学习react.js中,我感觉最大的疑惑点就是bind(this)的绑定和指向问题了,我被这个问题弄的头昏,有时候调用组件的时候,直接显示undefined,不存在这个组件,当时的心情是崩溃的,整 ...
- JavaWeb和WebGIS学习笔记(四)——使用uDig美化地图,并叠加显示多个图层
系列链接: Java web与web gis学习笔记(一)--Tomcat环境搭建 Java web与web gis学习笔记(二)--百度地图API调用 JavaWeb和WebGIS学习笔记(三)-- ...
- echart.js的使用与API
---恢复内容开始--- echart.js的使用与API 1.echart.js的使用: 第一步:在head标签或body下创建一个script标签去引用echart.js,(该文件可以在echar ...
- 如何系统地学习Node.js?
转载自知乎:http://www.zhihu.com/question/21567720 ------------------------------------------------------- ...
- JavaScript学习12 JS中定义对象的几种方式【转】
avaScript学习12 JS中定义对象的几种方式 转自: http://www.cnblogs.com/mengdd/p/3697255.html JavaScript中没有类的概念,只有对象. ...
- 从零开始学习Vue.js,学习笔记
一.为什么学习vue.js methods 只有纯粹的数据逻辑,而不是去处理 DOM 事件细节. vue.js兼具angular.js和react的优点,并且剔除了他们的缺点 官网:http://cn ...
- 前端MVC Vue2学习总结(四)——条件渲染、列表渲染、事件处理器
一.条件渲染 1.1.v-if 在字符串模板中,如 Handlebars ,我们得像这样写一个条件块: <!-- Handlebars 模板 --> {{#if ok}} <h1&g ...
- Vue 爬坑之路(十一)—— 基于 Nuxt.js 实现服务端渲染(SSR)
直接使用 Vue 构建前端单页面应用,页面源码时只有简单的几行 html,这并不利于网站的 SEO,这时候就需要服务端渲染 2016 年 10 月 25 日,zeit.co 背后的团队对外发布了一个 ...
随机推荐
- ORACLE 分页 java 用jdbc方式以 sys账号连接oracle数据的问题
2,3,4,6,8 betwenen 为闭区间,前后都包括 select * from(select a.*,rownum rn from (select * from student) a ) ...
- Android studio应用导入源码错误This attribute must be localized
This attribute must be localized 产生原因: 多语言错误,源码中关于语言的显示不能直接赋值,而是需要通过xml来实现: 例如 <TextView android: ...
- nginx timeout 配置 全局timeout 局部timeout web timeout
nginx比较强大,可以针对单个域名请求做出单个连接超时的配置. 比如些动态解释和静态解释可以根据业务的需求配置 proxy_connect_timeout :后端服务器连接的超时时间_发起握手等候响 ...
- JS中的Map与Set
Map Map是一组键值对的结构,具有极快的查找速度. 举个例子,假设要根据同学的名字查找对应的成绩,如果用Array实现,需要两个Array: var names = ['Michael', 'Bo ...
- jquery对象与dom对象之间互相转换的方法
本文主要讲述jquery对象和js里的dom对象之间互相转换的方法,使jquery对象可以直接使用js里的方法,或js里的dom对象使用jquery里的方法. jquery对象和dom对象是不一样的, ...
- .Net平台技术介绍、C#语言
转载别人的 只是用做学习 一.什么是.Net平台? .Net平台是微软搭建的技术平台,技术人员在此平台上进行应用的搭建与开发.它提供了运行所必须的环境.NET Framework类库以及CLR(公共 ...
- [javaSE] 数据结构(栈)
栈(stack)是一种线性存储结构,有以下特点: 1.栈中数据是按照先进后出的方式进出栈的 2.向栈中添加删除元素时,只能从栈顶进行操作 使用数组实现栈 定义一个类ArrayStack 实现入栈方法p ...
- Java编程基础知识总结大全(Ⅱ)
7.类型转换 精度从高到低 double float long int short(char) byte (1)自动类型转换 将一个低精度---高精度 (2)强制类型转换 将一个高精度---低精度 ...
- H5演示文稿快速制作
详见: http://www.geekfan.net/8107/ 或 http://www.jianshu.com/p/09a3bbb8b362
- 代码实现SpringMvc
偶然看到一篇100多行实现SpringMvc的博客,阅读后整理加实现出来.大家共勉!(纸上得来终觉浅,绝知此事要躬行.) 实现Spring的部分. Bean工厂,统一创建Bean: IOC,实现Bea ...