看这标题,可能会有一些人不太明白,那么直接上图,就是柱图展示形式如下图(兼容IE8)

要想实现这样展示效果。我们想用echarts直接实现不行的,即使是纹理填充也不可行的,但是我们可以借助echarts柱图展示来进行二次操作来现实。那么如何实现呢?

下面我们开始讲解:

1.思路:

从设计图中,我们要知道蓝色部分随着值的变化而变化,而灰色部分高度是不变的。

我们可以通过把柱图的透明度设为0,然后获取每根柱图的高度,每根柱图的位置,然后创建一个元素,把获取到每根柱图的高度和位置赋给这个元素,通过设置元素背景图片填充样式来实现

2.根据上面的思路,那就开始着手了,直接上代码

先把样式设置好:

    <style>
*{margin: 0;padding: 0;}
.bar-p,.bar-g{
position: absolute;
z-index: 9999;
width:22px ;/*柱图的宽度*/
}
.bar-p>span,.bar-g>span{
position: absolute;
left: 50%;
width: 80px;
text-align: center;
margin-left: -40px;
margin-top: -18px;
}
.bar-g>span{
color: #808182;
}
.bar-p>span{
color: #0b7cd1;
}
.bar-p{background: url("../img/bar.png") repeat-y 50% 100%;}
/*灰色的在这里高度是固定的,不管多大值*/
.bar-g{background: url("../img/bar1.png") no-repeat 50% 100%;height: 5px!important;}
</style>

html和js代码:

<div id="main" style="width: 60%; height: 500px;margin:10px auto;"></div>
<script>
/*
* @echarts3版本:v3.2.2
* */
var option=null,xAxisData=[],numData=[],numData1=[];
for(var i=1;i<9;i++){
xAxisData.push('币种'+i);
if(i>=6) numData[i-1]=-10;
else numData[i-1]=i*20;
numData1[i-1]=Math.abs(numData[i-1]);
}
option = {
color: ['#3398DB'],
tooltip : {
trigger: 'item',
formatter:'{b}:{c}',
axisPointer : { // 坐标轴指示器,坐标轴触发有效
type : 'shadow' // 默认为直线,可选为:'line' | 'shadow'
}
},
grid: {
left: '3%',
right: '4%',
bottom: '3%',
containLabel: true
},
xAxis : [
{
type : 'category',
data : xAxisData,
axisLine:{
lineStyle:{
color:'#ccc'
}
},
axisTick:false // 坐标轴刻度不显示的话直接这样
}
],
yAxis : [
{
type : 'value',
axisLabel:{
show:false
},
splitLine:{
lineStyle:{
color:'#ddd'
}
},
axisLine:{
show:false
},
axisTick:false // 坐标轴刻度不显示的话直接这样
}
],
series : [
{
type:'bar',
barWidth: 22,
data:numData1,
itemStyle:{
normal:{
opacity:0
}
}
}
]
};
var myChart = echarts.init(document.getElementById('main'));
// 使用刚指定的配置项和数据显示图表。
myChart.setOption(option);
/*
* getModel() echarts模型的获取
* getSeriesByIndex(i) 这个i表示series的下标,现在的series只有一个 所以直接是0
* */
var model=myChart.getModel(),
layer=model.getSeriesByIndex(0),
layouts=layer._data._itemLayouts;// 获取每根柱图的位置和高度和宽度
var div=document.getElementById('main').getElementsByTagName('div')[0]; // 获得div
var elem,height=document.getElementById('main').offsetHeight,bottom=height-layouts[0]['y'];
for(var i= 0,len=layouts.length;i<len;i++){
elem=document.createElement('div');
if(numData[i]<0) elem.className='bar-g';
else elem.className='bar-p';
elem.style.bottom=bottom+'px';
elem.style.left=layouts[i]['x']+'px';
elem.style.height=Math.abs(layouts[i]['height'])+'px';
elem.innerHTML='<span>'+numData[i]+'</span>';
div.appendChild(elem);
}
</script>

运行结果如下:

其实上面的js代码是实现了这个效果,但是有一个问题,就是for循环输出div的,每次循环都是从document中创建一个div,其实这样是不可取的,而且每次都要设置样式!

所以我们应该通过从innerHTML来输出会更好,因为我们的代码就是要简洁、性能优化得最好、条理清晰,更少的代码做更多的事情等!

所以我们要改成下面这样的:

<script>
/*
* @echarts3版本:v3.2.2
* */
var option=null,xAxisData=[],numData=[],numData1=[];
for(var i=1;i<9;i++){
xAxisData.push('币种'+i);
if(i>=6) numData[i-1]=-10;
else numData[i-1]=i*20;
numData1[i-1]=Math.abs(numData[i-1]);
}
option = {
color: ['#3398DB'],
tooltip : {
trigger: 'item',
formatter:'{b}:{c}',
axisPointer : { // 坐标轴指示器,坐标轴触发有效
type : 'shadow' // 默认为直线,可选为:'line' | 'shadow'
}
},
grid: {
left: '3%',
right: '4%',
bottom: '3%',
containLabel: true
},
xAxis : [
{
type : 'category',
data : xAxisData,
axisLine:{
lineStyle:{
color:'#ccc'
}
},
axisTick:false // 坐标轴刻度不显示的话直接这样
}
],
yAxis : [
{
type : 'value',
axisLabel:{
show:false
},
splitLine:{
lineStyle:{
color:'#ddd'
}
},
axisLine:{
show:false
},
axisTick:false // 坐标轴刻度不显示的话直接这样
}
],
series : [
{
type:'bar',
barWidth: 22,
data:numData1,
itemStyle:{
normal:{
opacity:0
}
}
}
]
};
var myChart = echarts.init(document.getElementById('main'));
// 使用刚指定的配置项和数据显示图表。
myChart.setOption(option);
/*
* getModel() echarts模型的获取
* getSeriesByIndex(i) 这个i表示series的下标,现在的series只有一个 所以直接是0
* */
var model=myChart.getModel(),
layer=model.getSeriesByIndex(0),
layouts=layer._data._itemLayouts;// 获取每根柱图的位置和高度和宽度
var div=document.getElementById('main').getElementsByTagName('div')[0]; // 获得div
var elem="",height=document.getElementById('main').offsetHeight,bottom=height-layouts[0]['y'];
for(var i= 0,len=layouts.length;i<len;i++){
elem+='<div class="'+(numData[i]<0?'bar-g':'bar-p')+
'"style="bottom:'+bottom+'px;left:'+layouts[i]['x']+'px;height:'+Math.abs(layouts[i]['height'])+'px;">'+
'<span>'+numData[i]+'</span>'+
'</div>';
}
div.appendChild(document.createElement('div'));
div.getElementsByTagName('div')[0].innerHTML=elem;
</script>

运行结果如下:

echarts柱图自定义为硬币堆叠的形式的更多相关文章

  1. vue 使用Echarts 环形图 自定义legend formatter 富文本标签

    main.js 引入echarts // 引入echarts import Echarts from 'echarts' Vue.prototype.$echarts = Echarts   < ...

  2. echarts 中 柱图 、折线图、柱图层叠

    app.title = '折柱混合'; option = { tooltip: { trigger: 'axis', axisPointer: { type: 'cross', crossStyle: ...

  3. echarts - 特殊需求实现代码汇总之【柱图】篇

    其实包括饼图.线图在内,和柱图都一样的感觉,他们的配置项基本也是对应的那几个,所以想实现某些相似的效果,只要找到对应的属性就可以了. 1.柱图渐变色设置 还记得上篇线图中的实现是在areaStyle的 ...

  4. ECharts折线图堆叠设置为不堆叠的方法

    下图是ECharts折线图堆叠的官方源码,设置折线图不堆叠只需要将每一个stack的值设置为不一样的名称或者将stack属性删除即可. option = { title: { text: '折线图堆叠 ...

  5. Echarts设置y轴值间隔 以及设置 barWidth : 30,//柱图宽度

    需求:如图,y轴之间的距离太小,这样就太过于拥挤了,现在要修改echarts里面的属性,设置y轴值间隔让图表看上去舒服一些.     其实很多问题,真的只是因为自己没有好好的看文档,很多文档上面都写的 ...

  6. Echarts-柱状图柱图宽度设置

    先看两张图 图中柱图只需要设置series中的坐标系属性barWidth就可以, 这种图柱状图,折叠柱状图都适应 eg: /** * 堆积柱状图 * @param xaxisdata x轴:标签(数组 ...

  7. d3.js 教程 模仿echarts折线图

    今天我们来仿echarts折线图,这个图在echarts是折线图堆叠,但是我用d3改造成了普通的折线图,只为了大家学习(其实在简单的写一个布局就可以).废话不多说商行代码. 1 制作 Line 类 c ...

  8. echarts雷达图

    用echarts展现雷达图的定制 <!doctype html> <html> <head> <meta charset="utf-8"& ...

  9. dev控件chart简单实现多图例,双曲线,双柱图,曲线与柱图

    1.效果图 2.数据源代码: ; i < ; i++) { == ) { dt1.Rows.Add( * i); dt2.Rows.Add( * i+); } else { dt1.Rows.A ...

随机推荐

  1. 一篇文章搞定css3 3d效果

    css3 3d学习心得 卡片反转 魔方 banner图 首先我们要学习好css3 3d一定要有一定的立体感 通过这个图片应该清楚的了解到了x轴 y轴 z轴是什么概念了. 首先先给大家看一个小例子: 卡 ...

  2. Kafka概念入门(一)

    序:如何保证kafka全局消息有序? 比如,有100条有序数据,生产者发送到kafka集群,kafka的分片有4个,可能的情况就是一个分片保存0-25,一个保存25-50......这样消息在kafk ...

  3. C# 6 与 .NET Core 1.0 高级编程 - 39 章 Windows 服务(下)

    译文,个人原创,转载请注明出处(C# 6 与 .NET Core 1.0 高级编程 - 39 章 Windows 服务(下)),不对的地方欢迎指出与交流. 章节出自<Professional C ...

  4. C语言 memcpy二维数组的复制

    今天在实现二维数组的复制功能时,竟然出现了好多问题,还是太不小心了. 我们知道,平时进行矩阵复制,无非是二重循环进行赋值操作,所以今天想改用利用memcpy进行复制操作,当然一维数组的复制在上一篇文章 ...

  5. Dynamics CRM 2015-Form之控制Ribbon Button

    在上一篇中,我用一个例子,简单介绍了如何添加Ribbon Button,以及如何理解RibbonDiffXml,对这方面还不清楚的,可以先看看这篇博文:Dynamics CRM 2015-Form之添 ...

  6. 关系型数据库MySql-模糊搜索优化(like %abc%):全文搜索引擎技术选型

    1.阿里云OpenSearch 阿里云开放搜索OpenSearch是一款阿里巴巴自主研发的大规模分布式搜索引擎平台,该平台承载了淘宝.天猫.1688.神马搜索.口碑.菜鸟等搜索业务,通过OpenSea ...

  7. 如何让 Git 忽略掉文件中的特定行内容?

    近期在git遇到几个问题,让我重新认识到git的强大性,下面列出来记录一下 有一个数据库的配置文件,在用 git add 添加到 index file 时不能透露了相关配置.而如果用 .gitigno ...

  8. 自己动手搭建苹果推送Push服务器

    今天我们来说下怎么自己建一个Push推送服务器, 当然还是用的苹果的APNS 这里我们讲的的自己服务器端的实现 在做推送服务器之前我们要先做一些准备动作 #1. 确保你的App ID有启用PushNo ...

  9. spring+struts2+ibatis 框架整合以及解析

    一. spring+struts2+ibatis 框架 搭建教程 参考:http://biancheng.dnbcw.net/linux/394565.html 二.分层 1.dao: 数据访问层(增 ...

  10. mysql 常用命令集锦

    Mysql安装目录数据库目录/var/lib/mysql/配置文件/usr/share/mysql(mysql.server命令及配置文件)相关命令/usr/bin(mysqladmin mysqld ...