echarts自适应大屏方案 亲测有用

这次在做项目的时候,蓝湖是 1920 x 1080 的设计图。
写页面的时候用的1920 x 1080 的像素标准直接来写。echarts 里面的尺寸 只能 写 12 或 12%。有的如:fontSize 之类的 只有 12 。导致 写的时候是 1920,输出到 4k 屏幕上,label 标签 和 字就很很小


image.png

解决方案:

将实际窗口的大小与设计图窗口大小做比得到要给相对的比率,每个单位数值和这个比率相乘即可。即:按比例缩放字体。比如设计图是19201080的,某个数值是fontSize:12,当前显示器是3840的大屏,那么你现在的字体大小应该是:12(3840/1920)= 24。

//当前视口宽度
let nowClientWidth = document.documentElement.clientWidth;
 
换算方法
function nowSize(val,initWidth=1920){
    return val * (nowClientWidth/initWidth);


// 使用的时候 nowSize(13)就代表1920下是13px
fontSize: nowSize(13)
width: nowSize(13)

如果你的项目chart不多,你在组件里写换算方法也可以,但更推荐在项目的全部做个封装。



具体到项目里封装一下:
chart-resize.js

// import Vue from "vue";
//当前视口宽度
let nowClientWidth = document.documentElement.clientWidth;
// 换算方法
window.nowSize = function(val, initWidth = 1920) {
    return val * (nowClientWidth / initWidth);
};

// Vue.prototype.$nowSize = nowSize

/*
*
一、使用:
    第一种
    // 例如字体在1920下为14px:  const vm=this;   
    // 然后在options里字体的大小单位用  vm.$nowSize(14)
    
    第二种:
    例如chart里的某字体在1920下为14px, 在options里字体的大小单位用: nowSize(14)

 **其他适配技巧**
1、图形的定位或位置偏移等用百分比设置
2、像lengend  tooltip  等属性的formatter回调函数里,可以用直接用rem,
例如:
 tooltip:{
    formatter: function(params){
        const tip=`<div style="font-size:1.5rem;">
            ${params.name}:<span style="font-size:1.6rem;">${params.value}</span>  <br>
        </div>`
        return tip
    }
},

*
*/



main.js:

import  "./scripts/chart-resize";


注意事项

echarts很多属性有默认值,那么当你的项目有自适应大屏需求时,这些默认值都要用nowSize方法改写掉!

图形要做到自适应,以下属性需全部改写:

  • x轴和y轴的轴线线条宽度
  • x轴和y轴的坐标字体大小
  • x轴和y轴的坐标字体大小
  • lengend 字体大小
  • tooltip字体大小
  • 。。。。



使用:
chart.vue
写成 window.nowSize(14) 或者 nowSize(14)
如果项目安装了eslint,开启了undefined检查,就写window.nowSize(14)

  let option = {
                xAxis: [{
                    type: 'category',
                    data: ['一级', '二级', '三级', '四级'],
                    axisLabel: {  // 坐标值
                        show: true,
                        color: "#eee",
                        // fontSize: 12,
                        fontSize: nowSize(14),
                    },
                    axisTick:{  // 刻度点
                        show: false,
                    },
                    axisPointer:{ // 鼠标划上提示线
                        // show: false,
                        type: 'shadow'
                    }
                }],
                yAxis: {
                    min:0,  //取0为最小刻度
                    max: max2, //取100为最大刻度
                    minInterval:2, //分割刻度
                    type: 'value',
                    // show: false, // 隐藏y轴
                    axisTick:{  // 刻度点
                        show: false,
                    },
                    axisLabel: {  // 坐标值
                        show: false,
                    },
                    axisPointer:{
                        show: false
                    },
                    splitLine:{ // y轴网格线
                        show: true,
                        lineStyle:{
                            type:'solid', // 设置背景为虚线
                            width: 0.3, // 网格线线宽
                            // color: '#eee',
                            color: [' #354ea0', '#354ea3'],  // 使用深浅的间隔色
                        }
                    },
                },
                tooltip:{
                    backgroundColor: 'rgba(1, 1, 1, 0.9)',
                    borderColor: "rgba(0, 225, 255, 0.17)",
                    textStyle:{
                        color: 'rgba(255, 255, 255, 0.99)',
                        fontSize: nowSize(17),
                    },
                    formatter: function(params){
                        //  ${params.marker}  
                        const tip=`<div style="font-size:1.4rem;">
                         ${params.name}:<span style="color:${params.color.colorStops[0].color};font-weight:800; ">${params.value}</span>  <br>
                        </div>`
                    return tip
                    }
                },
                grid:{ // 设置图形位置  横纵轴偏移
                    left: '10%',
                    top: '17%',
                    height: '66%',
                },
                series: [{
                        data: chart_data,
                        type: 'bar',
                        barWidth: "38%",
                        label: { //  柱子上方展示数量
                                show: true, //开启显示
                                position: 'top', //在上方显示
                                color: '#47bdce',
                                // fontSize: 12,
                                fontSize: nowSize(14)
                        },
                        itemStyle: {
                                color: function (params) {
                                    var colorList = [
                                        ['#fb6560', '#fb3e35'],
                                        ['#ff9717', '#f56812'],
                                        ['#fff766eb', '#EFE42A'],
                                        ['#61dbe8', '#4e9ff5'],
                                    ];
                                    var index = params.dataIndex;
                                    if (params.dataIndex >= colorList.length) {
                                        index = params.dataIndex - colorList.length;
                                    }
                                    return new echarts.graphic.LinearGradient(0, 0, 0, 1,
                                        [{
                                            offset: 0,
                                            color: colorList[index][0]
                                        },
                                        {
                                            offset: 1,
                                            color: colorList[index][1]
                                        }
                                        ]);
                                },        
                        }
                }]
            };
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,793评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,567评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,342评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,825评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,814评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,680评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,033评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,687评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,175评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,668评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,775评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,419评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,020评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,206评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,092评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,510评论 2 343

推荐阅读更多精彩内容