在 VUE 項目中,設置 echarts 圖表爲響應式佈局

1. 瀏覽器頁面尺寸變化,圖表自動改變尺寸

在 echarts 中繪製圖表,都是使用預先指定了一個明確尺寸的 DOM 容器。這也就意味着,圖表一旦渲染完成,後續頁面尺寸發生變化,圖表也不會重新繪製以及改變尺寸。

圖表繪製完成後,容器尺寸變小,圖表右側部分被遮住:
部分圖表不可見

這時候,需要手動調用 echarts 實例的 resize 方法來解決。

// resize method
resize() {
 this.chart.resize();
}

// mounted 生命鉤子中,綁定 resize 事件處理函數
// 設置圖表在頁面尺寸變化時,圖表重新渲染排布
window.addEventListener("resize", this.resize);

銷燬組件前,清空 resize 事件處理函數。

// beforeDestroy 生命鉤子中,清空 resize 事件處理函數
window.removeEventListener("resize", this.resize);

增加以上配置後,容器尺寸變小,圖表也會重新調整尺寸,不會存在顯示不全的現象:
在這裏插入圖片描述

2. 不同屏幕配置下,使用不同佈局

這部分可以參考文檔中移動端自適應部分的內容。
echarts 中組件的定位設置以及Media Query 的能力,爲 echarts 圖表提供了圖表內部組件隨着容器尺寸變化而變化的能力

1. 組件的定位設置
  1. left/right/top/bottom/width/height 定位方式:
  • left:距離 DOM 容器左邊界的距離。

  • right:距離 DOM 容器右邊界的距離。

  • top:距離 DOM 容器上邊界的距離。

  • bottom:距離 DOM 容器下邊界的距離。

  • width:寬度。

  • height:高度。

    這六個量中,每個量都可以是『絕對值』(eg: {left: 23, height: 400})或者『百分比』(eg: {right: ‘30%’, bottom: ‘40%’})或者『位置描述』(eg: left: ‘center’, top: ‘middle’)。

  1. center / radius 定位方式:
  • center: [x, y]
  • radius: [內半徑,外半徑]
  1. 橫向(horizontal)和縱向(vertical)
    在細長的移動端屏幕上,可能適合使用『縱向佈局』;在PC寬屏上,可能適合使用『橫向佈局』。

    橫縱向佈局的設置,一般在『組件』或者『系列』的 orient 或者 layout 配置項上,設置爲 ‘horizontal’ 或者 ‘vertical’。

2. Media Query

echarts 中的 Media Query 的概念與 CSS 中的媒體查詢概念十分相似,它針對頁面的不同視口尺寸或配置來設置斷點,爲其提供合適的組件佈局。

在 option 中設置 Media Query 的語法格式如下所示:

option = {
    baseOption: { // 這裏是基本的『原子option』。
        title: {...},
        legend: {...},
        series: [{...}, {...}, ...],
        ...
    },
    media: [ // 這裏定義了 media query 的逐條規則。
        {
            query: {...},   // 這裏寫規則,現在支持三個屬性:width、height、aspectRatio(長寬比)。每個屬性都可以加上 min 或 max 前綴。
            option: {       // 這裏寫此規則滿足下的option。
                legend: {...},
                ...
            }
        },
        {
            query: {...},   // 第二個規則。
            option: {       // 第二個規則對應的option。
                legend: {...},
                ...
            }
        },
        {                   // 這條裏沒有寫規則,表示『默認』,
            option: {       // 即所有規則都不滿足時,採納這個option。
                legend: {...},
                ...
            }
        }
    ]
};

下面給出一個具體的例子,media query 部分的代碼如下:

{
  baseOption: {
    tooltip: {
      trigger: "item",
      formatter: "{a} <br/>{b}: {c} ({d}%)"
    },
    legend: {
      orient: "horizontal",
      top: 0,
      left: 10,
      data: [
        "已分配庫存",
        "凍結庫存",
        "未上架庫存",
        "其他區域庫存",
        "正常庫位庫存"
      ]
    },
    series: [
      {
        name: "庫存狀態",
        type: "pie",
        radius: ["40%", "80%"],
        center: ["50%", "56%"],
        avoidLabelOverlap: false,
        label: {
          show: false,
          position: "center"
        },
        emphasis: {
          label: {
            show: true,
            fontSize: "20",
            fontWeight: "bold"
          }
        },
        labelLine: {
          show: false
        }
      }
    ]
  },
  media: [
    {
      query: {
        minAspectRatio: 1,
        minWidth: 400
      },
      option: {
        legend: {
          orient: "vertical"
        },
        series: [
          {
            center: ["50%", "50%"]
          }
        ]
      }
    }
  ]
}

上面代碼中的 media query 十分簡單,就是當 容器尺寸大於等於 400px 且屏幕長寬比大於1時,改變圖例的爲垂直佈局,改變餅圖的放置位置。最終效果圖如下:

基礎佈局效果:
基礎佈局

滿足查詢條件佈局效果:
滿足查詢條件

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章