看这标题,可能会有一些人不太明白,那么直接上图,就是柱图展示形式如下图(兼容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. Tried to obtain the web lock from a thread other than the main thread or the web thread. This may be

    有些操作只能回到主线程操作 比如: mbprogresshud只能在主线程中使用 而且注意凡是关于布局的代码也只能下载主线程

  2. spring 定时任务 taskScheduler详解

    spring 3.0版本后,自带了一个定时任务工具,而且使用简单方便,不用配置文件,可以动态改变执行状态.也可以使用cron表达式设置定时任务. 被执行的类要实现Runnable接口 TaskSche ...

  3. springmvc注解式事务手动回滚

    Spring的AOP事务管理默认是针对unchecked exception回滚(运行期异常,Runtime Exception),如果希望手动控制事务的回滚,可以通过 TransactionAspe ...

  4. Ansible_自动化运维《Ansible之初识-1》

    1.Ansible简介 1.1 Ansible介绍 Ansible 是一个简单的自动化运维管理工具,基于Python开发,集合了众多运维工具(puppet.cfengine.chef.func.fab ...

  5. Ext Js详解指南

    什么是Ext JS 走进Ext的世界 Ext JS是一款富客户端开发框架它基于javascript.HTML和CSS开发而成,无需安装任何插件即可在常用浏览器中创建出绚丽的页面效果. 个人总结Ext ...

  6. vc中Error spawning cl.exe错误的解决方法.

    可能很多人在安装VC 6.0后有过点击“Compile”或者“Build”后被出现的 “Compiling... ,Error spawning cl.exe”错误提示给郁闷过.很多人的 选择是重装, ...

  7. Codeforce 水题报告

    最近做了好多CF的题的说,很多cf的题都很有启发性觉得很有必要总结一下,再加上上次写题解因为太简单被老师骂了,所以这次决定总结一下,也发表一下停课一星期的感想= = Codeforces 261E M ...

  8. 纪中集训 Day 6

    今天他们回去了,就剩我和DWJ(一位初三大大(后来问云神才知道的ORZ))一起在做题,不得不说他真的是太厉害了,一个升初三大大在各种方面都比我强QAQ 让我突然感觉到自己的高一还是不够努力啊QAQ 连 ...

  9. c++动态库与静态库

    windows下: 在进行库创建的时候会用到导出符号,在函数,类的声明处直接指出. 静态库:用的时候通常将 #pagram (lib,"name"),包含头文件,可以使用任何导出类 ...

  10. 连载《一个程序猿的生命周期》-《发展篇》 - 7.是什么阻碍了"程序猿"的发展?

    有两件事想记录一下,具有普遍性和代表性."程序猿"加了引号,是泛指一类人,也并非局限于IT行业.       山东子公司的总经理是公司大股东之一,个子不高.有些秃顶.面容显老,但看 ...