echarts 如何覆盖源码样式——dataview为例

问题

源码的echarts的dataview在显示时会遮挡住工具栏toolbox,现在需要做到的是不遮住。

解决方法

通过看dataview的源码(位置:echarts/lib/component/toolbox/feature/DaaView.js) 发现,dataview的实现就是在现有的图表上加了一层,并且样式都是写死在style中的。由于dataview的数据渲染就是在onclick事件中,因此我们重写该方法即可。
在这里插入图片描述
可参考代码:

feature: {
 mydataView: {
    show: true,
    icon:
      "M17.5,17.3H33 M17.5,17.3H33 M45.4,29.5h-28 M11.5,2v56H51V14.8L38.4,2H11.5z M38.4,2.2v12.7H51 M45.4,41.7h-28",
    title: "数据视图",
    onclick: (ecModel, api) => {
		let axisData = api.getOption().xAxis[0].data; //坐标数据
		let series = api.getOption().series; //折线图数据
		//创建画布
		var container = api.getDom();
		if (this._dom) {
			container.removeChild(this._dom); //防止重复创建
			this._dom = root;
		}
		var root = document.createElement("div");
		root.style.cssText =
		"position:absolute;left:0px;top:25px;bottom:5px;right:0px";
		root.style.backgroundColor = "#fff"; // Create elements
		var header = document.createElement("h4");
		header.innerHTML = "数据视图";
		header.style.cssText = "margin: 10px 20px;";
		root.appendChild(header);
		// 创建表格
		var viewMain = document.createElement("div");
		viewMain.style.cssText =
		"display:block;width:100%;overflow:auto;";
		var taObj = document.createElement("table");
		taObj.border = "1";
		taObj.cellPadding = "0";
		taObj.cellSpacing = "0";
		taObj.style.cssText = "margin:0 auto;";
		viewMain.appendChild(taObj);
		//数据渲染表头 
		var thObj = document.createElement("tr");
		taObj.appendChild(thObj);
		var td1 = document.createElement("td");
		td1.innerHTML = "时间";
		thObj.appendChild(td1);
		series.forEach(function (item) {
			//组装表头内容
			var td2 = document.createElement("td");
			td2.innerHTML = item.name;
			thObj.appendChild(td2);
		});
      //数据渲染行列内容
      for (var i = 0; i < axisData.length; i++) {
        //创建行,在行中添加内容,并且追加到父元素table中
        var trObj = document.createElement("tr");
        taObj.appendChild(trObj);
        //创建第一个列,然后加入到行中
        var td1 = document.createElement("td");
        td1.innerHTML = axisData[i];
        trObj.appendChild(td1);
        //创建第二个列,然后加入到行中
        for (let j = 0; j < series.length; j++) {
          let num = series[j].data[i];
          let number = Math.round(num * 100) / 100;
          var td2 = document.createElement("td");
          td2.innerHTML = number;
          trObj.appendChild(td2);
        }
      }
      var self = this; //添加标志位
      //关闭功能
      function close() {
        container.removeChild(root);
        self._dom = null;
      }
      var eventTool = require("zrender/lib/core/event");

      var buttonContainer = document.createElement("div");
      buttonContainer.style.cssText =
        "position:absolute;bottom:0;left:0;right:0;";
      var closeButton = document.createElement("div");
      closeButton.style.cssText =
        "float:right;margin-right:20px;border:none;color:#fff;cursor:pointer;padding:2px 5px;font-size:12px;border-radius:3px";
      eventTool.addEventListener(closeButton, "click", close);
      closeButton.style.backgroundColor = "red";
      closeButton.innerHTML = "关闭";
      buttonContainer.appendChild(closeButton);
      root.appendChild(buttonContainer);
      root.appendChild(viewMain);

      viewMain.style.height = container.clientHeight - 80 + "px";
      container.appendChild(root);
      this._dom = root;
    },
  },
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要优化饼图的dataView中的样式,可以通过以下步骤进行: 1. 在echarts实例化的时候,设置dataView的参数,例如: ```javascript var myChart = echarts.init(document.getElementById('main')); myChart.setOption({ toolbox: { feature: { dataView: { show: true, title: '数据视图', readOnly: true, lang: ['数据视图', '关闭', '刷新'], optionToContent: function(opt) { var axisData = opt.series[0].data; var html = '<table style="width:100%;text-align:center"><tbody><tr><td>名称</td><td>值</td></tr>'; for (var i = 0, l = axisData.length; i < l; i++) { html += '<tr><td>' + axisData[i].name + '</td><td>' + axisData[i].value + '</td></tr>'; } html += '</tbody></table>'; return html; } } } }, series: [{ name: '访问来源', type: 'pie', radius: '55%', data: [{ value: 335, name: '直接访问' }, { value: 310, name: '邮件营销' }, { value: 234, name: '联盟广告' }, { value: 135, name: '视频广告' }, { value: 1548, name: '搜索引擎' } ] }] }); ``` 2. 在optionToContent函数中,可以自定义生成的html代码,样式可以通过css设置,例如: ```javascript optionToContent: function(opt) { var axisData = opt.series[0].data; var html = '<table style="width:100%;text-align:center"><tbody><tr><td>名称</td><td>值</td></tr>'; for (var i = 0, l = axisData.length; i < l; i++) { html += '<tr><td>' + axisData[i].name + '</td><td>' + axisData[i].value + '</td></tr>'; } html += '</tbody></table>'; html = '<div style="font-size:14px;color:#333">' + html + '</div>'; return html; } ``` 在这里,我设置了表格的居中和字体颜色,同时在外层包裹了一个div,设置了字体大小。 3. 如果需要更加复杂的样式,可以使用JavaScript或jQuery来进行修改。例如,通过jQuery来修改table的样式: ```javascript optionToContent: function(opt) { var axisData = opt.series[0].data; var html = '<table><tbody><tr><td>名称</td><td>值</td></tr>'; for (var i = 0, l = axisData.length; i < l; i++) { html += '<tr><td>' + axisData[i].name + '</td><td>' + axisData[i].value + '</td></tr>'; } html += '</tbody></table>'; html = '<div style="font-size:14px;color:#333">' + html + '</div>'; $(html).find('table').css({ 'border': '1px solid #ccc', 'border-collapse': 'collapse', 'width': '100%', 'text-align': 'center' }); $(html).find('th,td').css({ 'border': '1px solid #ccc', 'padding': '5px' }); return html; } ``` 在这里,我使用了jQuery来选取生成的html中的table元素,并设置了边框、宽度和居中对齐等样式
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值