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原理相关的,回头深入学习了总结一下。

时间: 2025-01-17 14:52:38

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

CSS自适应布局(包括两边宽度固定中间宽度自适应与中间宽度固定两边宽度自适应)

1.两边宽度固定,中间宽度自适应 (1)非CSS3布局,浮动定位都可以(以下用浮动) css样式: #left { float: left;width: 200px; background: lime;} #right { float: right; width: 200px; background: lime;} #center { margin:0 200px; background: blue} html: <div id="left">left</div>

抛砖引玉之宽度自适应布局

抛砖引玉之宽度自适应布局 什么是宽度自适应布局呢? 就是当浏览器窗口大小改变时,浏览器里的元素宽度也随之改变,从而达到自适应布局. 常见的宽度自适应布局有: 1.  两列:左边宽度不变,右边宽度自适应 2.  三列:左右两边宽度不变,中间部分自适应 3.  三列:左右两边宽度自适应,中间部分不变 一.利用div+css实现以上“自适应布局” (1)两列:左边宽度固定,右边宽度自适应 利用div+float+margin,已在随笔‘float剖析’中讲解,具体代码和效果图见下: <!DOCTYPE

记一道css面试题 : 三栏布局两边宽度固定,中间宽度自适应,并且布局随屏幕大小改变。

前几天面试时有道css题没做出来,回来好好学习一番后把其记录下来. 题目是这样的:左中右三栏布局,左右两栏宽度固定,左右两栏的宽度为200像素,中间栏宽度自适应.当屏幕小于600px时,3栏会分别占用一行.像这样 当屏幕大于600px时,是这样 我做出来用了css3的@media,如果不用这个,好吧,水平有限想不出来... 下面是代码: <!DOCTYPE> <html> <head> <style> body{ margin: 0 ; padding: 0

左右两栏宽度自适应,中间一栏宽度固定

左右两栏宽度自适应,中间一栏宽度固定:中间一栏宽度固定,左右两栏宽度自适应效果在众多网页中都有应用,有不错的使用效果,下面就简单介绍一下如何此效果:代码实例如下: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name="author" content="http://www.51texiao.cn/" /> <

手机网页宽度 , 图片宽度 自适应

网页宽度 页面box不要写宽度或 width:100% 之类的 去掉 头部加上下面代码: <meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=0.5, maximum-scale=2.0, user-scalable=yes" /> 图片宽度 <script type="text/javascript"> f

二列div宽度自适应

二列div宽度自适应:建议:尽可能的手写代码,可以有效的提高学习效率和深度.在之前的教程已经介绍了一列div宽度自适应.实现自适应效果的主要手段就是设置对象的width属性值为百分数.代码实例: <!DOCTYPE html> <html> <head> <meta charset=" utf-8"> <meta name="author" content="http://www.softwhy.com

一列div宽度固定、一列div宽度自适应

一列固定.一列宽度自适应:建议:尽可能的手写代码,可以有效的提高学习效率和深度.之前的代码中,已经介绍过一列宽度自适应和二列宽度自适应,实现自适应的效果一般就是将相应对象的宽度以百分比的形式表示.在实际的布局中,一列宽度固定.一列宽度自适应.下面我们就以左侧div宽度固定,右侧div宽度是自适应为例.代码实例: <!DOCTYPE html> <html> <head> <meta charset=" utf-8"> <meta n

图片超过DIV宽度自适应

.main_con img { max-width: 610px; height: auto; cursor: pointer; border: 0px double #cccccc; padding: 2px; zoom: expression( function(elm) { if (elm.width>610) { var oldVW = elm.width; elm.width=610; elm.height = elm.height*(610 /oldVW); } elm.style.

我熟知的三种三栏网页宽度自适应布局方法

一.前言在如今各个分辨率显示器N足鼎立的时期,页面采用流动性布局(亦可称自适应布局)不失为一个好选择.当然,具体实现不是那么容易,需要一定的css功力和实践经验.本文不讲细节,只讲外部的自适应架构,这也是实现整个页面自适应的前提.目前为止,我所熟知的左中右三栏宽度自适应于浏览器的方法有三个:绝对定位法,margin负值法以及自身浮动法.这些方法简洁实用,且无兼容性问题.如果您想在您的页面上使用流动性布局,相信本文给您一些启示的. 二.三种方法为了演示的需要,首先限定下示例的布局结构:左中右三栏布