echarts图表大小自适应,resize()
利用ResizeObserver监听html元素变化,可以很方便实现效果。
代码如下:
1 var myChart = echarts.init(document.getElementById('web_base_count_chart'), 'macarons'); 2 var option = { 3 tooltip: { 4 trigger: 'axis' 5 }, 6 legend: { 7 data: [ '网站访问量', '数据评价次数', '数据下载次数', 'APP应用数'], 8 x:'center', 9 y:'bottom', 10 padding:[0,30,10,30] 11 }, 12 grid: { 13 left: '2%', 14 right: '10%', 15 bottom: '15%', 16 top: '2%', 17 containLabel: true 18 }, 19 xAxis: { 20 type: 'category', 21 boundaryGap: false, 22 data: months 23 }, 24 yAxis: { 25 type: 'value', 26 axisLabel: { 27 formatter: function (v) { 28 return parseInt(v) 29 } 30 } 31 }, 32 series: [ 33 { 34 name: '网站访问量', 35 type: 'line', 36 // stack: '总量', 37 data: visitdata 38 }, 39 { 40 name: '数据评价次数', 41 type: 'line', 42 // stack: '总量', 43 data: evadata 44 }, 45 { 46 name: '数据下载次数', 47 type: 'line', 48 // stack: '总量', 49 data: downloaddata 50 }, 51 { 52 name: 'APP应用数', 53 type: 'line', 54 // stack: '总量', 55 data: appdata 56 } 57 ] 58 }; 59 // 使用刚指定的配置项和数据显示图表。 60 myChart.clear(); 61 myChart.setOption(option); 62 var myObserver = new ResizeObserver(entries => { 63 entries.forEach(entry => { 64 console.log("resize++++++"); 65 myChart.resize(); 66 }); 67 }); 68 myObserver.observe(document.querySelector('#web_base_count_chart'));
Object.observe() 方法用于异步地监视一个对象的修改。
详情见:https://developer.mozilla.org/zh-CN/docs/Web/API/ResizeObserver
ResizeObserver
Experimental
这是一个实验中的功能
此功能某些浏览器尚在开发中,请参考浏览器兼容性表格以得到在不同浏览器中适合使用的前缀。由于该功能对应的标准文档可能被重新修订,所以在未来版本的浏览器中该功能的语法和行为可能随之改变。
ResizeObserver 接口可以监听到 Element 的内容区域或 SVGElement的边界框改变。内容区域则需要减去内边距padding。(有关内容区域、内边距资料见盒子模型 )
ResizeObserver避免了在自身回调中调整大小,从而触发的无限回调和循环依赖。它仅通过在后续帧中处理DOM中更深层次的元素来实现这一点。如果(浏览器)遵循规范,只会在绘制前或布局后触发调用。
构造器
ResizeObserver()- 创建并返回一个
ResizeObserver对象。
属性
无。
Event handlers
无。
方法
ResizeObserver.disconnect()- 取消和结束目标对象上所有对
Element或SVGElement观察。 ResizeObserver.observe()- 开始观察指定的
Element或SVGElement。 ResizeObserver.unobserve()- 结束观察指定的
Element或SVGElement。
示例
以下示例通过观察box的宽度变化从而改变其边框圆角半径。
const resizeObserver = new ResizeObserver(entries => { for (let entry of entries) { entry.target.style.borderRadius = Math.max(0, 250 - entry.contentRect.width) + 'px'; } }); resizeObserver.observe(document.querySelector('.box:nth-child(2)'));
浙公网安备 33010602011771号