highchart宽度自适应的问题-图表压缩到一起

之前有个项目用到highchart展示图表。由于图比较多,便做了一个可以根据需要使图进行自动伸展和收缩的按钮,当点击收缩时,图slideup收缩起来。

这个时候出现了一个问题,当图收缩后,再展示的时候,highchart生成的图变形了。。。。oh mygod~~~

我们来一起思考一下,变形的表象是什么?

审查元素可知,是宽度小了。宽度小了,图里面的元素挤压到了一起,形成了一个小块,模糊不清。

变形的本质是什么?

搜索highchart的配置相关文档(可见http://www.helloweba.com/view-blog-156.html),发现highchart本身在创建的时候chart的宽度是可以不用设定的。而我在项目中正好也没设定。于是乎该chart的宽度根据父div来自适应。那么可能就是根据父div来自适应的时候出现了问题。

我的父元素div,也就是chart的容器,设定了宽度为48%百分比。我的chart在收缩的时候,刚好宽度为48px.这让我不禁想到是否之间有相关的关系。

当我把宽度设定为50%时,出现问题的highchart的宽度自然成为了50px.基本可以确定是由于父元素宽度的问题。

此时解决方案一来了

将原来的宽度设置为固定px宽度,例如500px.问题解决。原来是由于我的按钮使得highchart发生收缩的时候,highchart触发了自适应的一个宽度调整,而父div宽度设置的宽度为百分比,于是highchart取了那个百分比前面的数据为自己的宽度。。。。汗。。。highchart不应该判断一下是百分比还是固定px设置么?

遗留问题:此时还是会有遗留问题。那么多宽度不一的屏幕和屏幕分辨率,谁说我的highchart图就一定要宽度固定咩?哼哼哼~~~

解决方案二:

创建highchart的时候,没有固定宽度,那么我可以给一个固定宽度。当然,这个固定宽度,其实也是动态获取的父div容器的宽度,然后设定,相当于给了个默认的宽度。然后highchart就不会自己适应来适应去啦~~~弄的我好怕怕...(PS:本质还是highchart的宽度有点奇怪,取了width:a%里的a px来作为宽度)

eg:

 1 var myWidth = $('#container').css('width').slice(0,-2);//获取container容器的宽度,创建时自带宽度。会带有px,highchart的width只认数字。
 2 $('#container').highcharts({
 3             chart: {
 4                 type: 'arearange',
 5                 width:myWidth;
 6             },
 7             
 8             title: {
 9                 text: 'title'
10             },
11         
12             xAxis: {
13                 type: 'datetime'
14             },
15             
16             yAxis: {
17                 title: {
18                     text: null
19                 }
20             },
21         
22            
23             
24             legend: {
25                 enabled: false
26             },
27         
28             series: [{
29                 name: 'Temperatures',
30                 data: data,
31                 color: '#FF0000',
32                 negativeColor: '#0088FF'
33             }]
34         
35         });
36     });

遗留问题:设定了固定宽度后,当浏览器缩小的时候,失去了自适应的能力。

解决方案三:

highchart的API:chart.reflow ()

Reflows the chart to its container. By default, the chart reflows automatically to its container following a window.resize event, as per the chart.reflow option. However, there are no reliable events for div resize, so if the container is resized without a window resize event, this must be called explicitly.

根据这个chart的容易reflow这个chart。默认下,chart会伴随着window.resize事件自动地根据它所属于的container容器reflow,根据每个chart.reflow属性。但是,对于div的resize有一些不可靠的事件,所以如果container 重新调整大小而window没有触发resize事件,这个函数必须明确地被调用。

解决方法:

一开始创建highchart的时候,不带width属性,这样保证了自适应。

点击下拉按钮,展示完整的higchart图表的时候,调用chart.reflow()。这样图表重新根据container调整了大小。chart恢复到了正常的状态。嘎嘎嘎~~

reflow的效果可以查看:http://jsfiddle.net/gh/get/jquery/1.7.2/highslide-software/highcharts.com/tree/master/samples/highcharts/chart/reflow-true/

chart会根据window或者frame的大小进行合适的调整。

对于reflow原理相关的,回头深入学习了总结一下。

 

 

转载于:https://www.cnblogs.com/luckyflower/p/4357745.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Highcharts是一个用于制作交互式图表JavaScript库,可以创建各种类型的图表,包括复合图表。 要创建一个复合图表,需要使用Highcharts的组合图表功能,该功能允许将多个图表组合在一起以显示多个数据系列。以下是一个创建复合图表的基本步骤: 1. 创建一个空的Highcharts图表对象。 2. 添加一个或多个数据系列,每个系列对应一个不同的图表类型,例如柱状图、折线图、面积图等。 3. 配置每个数据系列的选项,包括颜色、标签、线型等。 4. 配置图表的整体选项,例如标题、图例、坐标轴等。 5. 将图表渲染到HTML页面中。 下面是一个创建包含柱状图和折线图的复合图表的示例代码: ```javascript // 创建一个空的Highcharts图表对象 var chart = Highcharts.chart('container', { title: { text: '复合图表示例' }, xAxis: { categories: ['一月', '二月', '三月', '四月', '五月', '六月'] }, yAxis: [{ // 配置左侧Y轴 title: { text: '销售额' } }, { // 配置右侧Y轴 title: { text: '利润' }, opposite: true }], series: [{ // 添加第一个数据系列,使用柱状图 name: '销售额', type: 'column', yAxis: 0, data: [100, 200, 150, 250, 300, 200] }, { // 添加第二个数据系列,使用折线图 name: '利润', type: 'line', yAxis: 1, data: [50, 100, 80, 120, 150, 100] }] }); ``` 在上面的代码中,我们创建了一个包含柱状图和折线图的复合图表,其中左侧Y轴表示销售额,右侧Y轴表示利润。柱状图表示销售额,折线图表示利润。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值