最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Vue指令實現(xiàn)大屏元素分辨率適配詳解

 更新時間:2022年09月29日 08:58:42   作者:MiyueFE  
這篇文章主要為大家介紹了Vue指令實現(xiàn)大屏元素分辨率適配詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

前言

隨著前端技術(shù)的不斷發(fā)展、數(shù)據(jù)中心(中臺)之類的概念的不斷升級、物聯(lián)網(wǎng)設(shè)備的更新和普及,越來越多的業(yè)主(項目)喜歡在系統(tǒng)中添加一個或者多個可視化大屏,用來集中的展現(xiàn)數(shù)據(jù)變化、位置變化等等,老板們也更喜歡稱之為“態(tài)勢”。

當然,作為程序員一般都不關(guān)心“老板們”的想法,只要完成項目即可。但是經(jīng)常會有這樣的問題:我有一個大屏的模板,但是用戶的瀏覽器分辨率不夠,或者有的有書簽欄有的沒有書簽欄,更或者是有的全屏了有的只是小窗口,這樣就有了代碼對不同分辨率場景下的適配需求了。

1. 常見的適配方案

平時我們使用的 web 端的適配方案,主要有以下幾種:

  • vw/vh 配合百分比實現(xiàn),讓元素根據(jù)窗口大小進行自動調(diào)整
  • fontSize 配合 rem 實現(xiàn)“單位寬度”的統(tǒng)一
  • 根據(jù)不同的分辨率范圍調(diào)整頁面布局
  • 版心布局,配合最小寬度

目前大多數(shù)屏幕適配方案的原理都是采用的以上的幾種方式,但是這幾種方式也有很大的弊端:瀏覽器文字有最小尺寸!

在一般的 1080p 及以上的分辨率的屏幕中,大多數(shù)設(shè)計圖的比例和顯示效果都能完美還原。但如果某個系統(tǒng)的頁面內(nèi)容太多,或者瀏覽器部分使用的分辨率(不是物理分辨率)達不到完整顯示的要求,采用上面的幾種方式就有可能造成 文字的計算大小小于瀏覽器的最小字體大小,此時就有可能因為文字寬度超出元素而導致頁面樣式崩潰。

版心布局配合最小寬度可以保證顯示效果,但是不適合大屏項目。

2. CSS3 縮放方案

在上面的幾種方案都不滿足時,大家一般就會采用另外一種方案:CSS3 scale 縮放。

通過計算設(shè)計圖尺寸比例與實際的頁面顯示區(qū)域大小,來動態(tài)調(diào)整元素的縮放比例。

個人認為這是針對小分辨率情況下保留顯示內(nèi)容及樣式最好的一種處理方式。

當然,這種方式依然有一些弊端:

  • 縮放后可能會造成邊緣顯示模糊
  • 如果內(nèi)部存在 canvas 元素,可能導致 canvas 內(nèi)部的內(nèi)容渲染失真
  • 高德地圖 1.x 會導致事件坐標偏移 (2.0 已經(jīng)修復)
  • ...

3. 封裝一個縮放指令

這里簡單回顧一下 Vue 的自定義指令:通過配置自定義指令和綁定參數(shù),在組件/元素加載、更新、銷毀等不同時期執(zhí)行對應的處理邏輯。

Vue 的自定義指令包含一下幾個鉤子函數(shù):

  • bind: 解析到指令綁定時執(zhí)行,僅執(zhí)行一次
  • inserted: 插入父節(jié)點時執(zhí)行
  • update:組件觸發(fā)更新時執(zhí)行
  • componentUpdated:所有組件更新結(jié)束之后執(zhí)行
  • unbind:元素解綁(銷毀)時執(zhí)行,也只執(zhí)行一次

這里因為我們只需要在初始化時綁定瀏覽器的 resize 事件來調(diào)整元素縮放,所以只需要配置 inserted 即可;當然,為了優(yōu)化代碼邏輯,減少資源消耗等情況,也需要在 unbind 階段去取消 resize 事件的一個回調(diào)函數(shù)。

代碼如下:

// 縮放指令
import Vue from "vue";
function transformScale(el, options) {
  const { target = "width", origin = "top left" } = options;
  Vue.nextTick(() => {
    // 獲取顯示區(qū)域高寬
    const width = window.innerWidth;
    const height = window.innerHeight;
    el.style.transformOrigin = origin;
    if (target === "ratio") {
      const scaleX = width / CONF.width;
      const scaleY = height / CONF.height;
      el.style.transform = `scaleX(${scaleX}) scaleY(${scaleY})`;
    } else {
      let scaleProportion = 1;
      if (target === "width") {
        scaleProportion = width / CONF.width;
      }
      if (target === "height") {
        scaleProportion = height / CONF.height;
      }
      el.style.transform = `scale(${scaleProportion})`;
    }
  });
}
function inserted(el, binding) {
  const options = binding.options || { passive: true };
  const callback = () => transformScale(el, binding.value);
  window.addEventListener("resize", callback);
  callback();
  el._onResize = {
    callback,
    options
  };
}
function unbind(el) {
  if (!el._onResize) {
    return;
  }
  const { callback } = el._onResize;
  window.removeEventListener("resize", callback);
  delete el._onResize;
}
export const Scale = {
  inserted,
  unbind
};
export default Scale;

說明:

  • 指令接收一個對象參數(shù),用來指定比例計算方式和縮放定位
  • 需要一個全局配置 CONF 對象,用來指定默認的頁面尺寸
  • 為了保證頁面已經(jīng)加載完,能獲取到 dom 元素,需要調(diào)用 Vue.nextTick
  • 需要銷毀監(jiān)聽事件

整個代碼其實很簡單,就是通過監(jiān)聽 resize 事件去調(diào)整元素的縮放比例。

但是這里我也做了一點小的配置,用來適應更多的情況:

  • 接收一個 target 配置,用來確認比例計算方式;可以以寬度或者高度作為統(tǒng)一的縮放標準,也可以分別計算
  • 接收 transform 的 origin 配置,保證不同位置的元素可以縮放到不同的位置,避免縮放偏移
  • 不涉及綁定元素的尺寸,只需要默認尺寸即可;寫代碼時可以直接根據(jù)設(shè)計圖配置元素尺寸

4. 后記

當然,這個指令不能說有多完美,依然有很多有漏洞的地方,比如沒有防抖、縮放不會改變css指定的尺寸,容易出現(xiàn)滾動條等;

并且因為之前的項目中還涉及到很多圖表、地圖,也經(jīng)常導致一些顯示問題,所以后面有增加了一些新的指令,但是分辨率適配這個問題還是要根據(jù)實際情況來確定具體的方案。

以上就是Vue指令實現(xiàn)大屏元素分辨率適配詳解的詳細內(nèi)容,更多關(guān)于Vue指令大屏元素分辨率適配的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • vue中如何動態(tài)綁定圖片,vue中通過data返回圖片路徑的方法

    vue中如何動態(tài)綁定圖片,vue中通過data返回圖片路徑的方法

    下面小編就為大家分享一篇vue中如何動態(tài)綁定圖片,vue中通過data返回圖片路徑的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-02-02
  • Vue實現(xiàn)登錄功能全套超詳細講解(含封裝axios)

    Vue實現(xiàn)登錄功能全套超詳細講解(含封裝axios)

    這篇文章主要給大家介紹了關(guān)于Vue實現(xiàn)登錄功能(含封裝axios)的相關(guān)資料,Vue是現(xiàn)在前端最流行的框架之一,作為前端開發(fā)人員應該要熟練的掌握它,需要的朋友可以參考下
    2023-10-10
  • Vue ElementUI實現(xiàn):限制輸入框只能輸入正整數(shù)的問題

    Vue ElementUI實現(xiàn):限制輸入框只能輸入正整數(shù)的問題

    這篇文章主要介紹了Vue ElementUI實現(xiàn):限制輸入框只能輸入正整數(shù)的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-07-07
  • vue中axios請求的封裝實例代碼

    vue中axios請求的封裝實例代碼

    這篇文章主要給大家介紹了關(guān)于vue中axios請求封裝的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用vue具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧要的朋友可以參考下
    2019-03-03
  • Vue實現(xiàn)用戶自定義字段顯示數(shù)據(jù)的方法

    Vue實現(xiàn)用戶自定義字段顯示數(shù)據(jù)的方法

    今天小編就為大家分享一篇Vue實現(xiàn)用戶自定義字段顯示數(shù)據(jù)的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-08-08
  • moment轉(zhuǎn)化時間戳出現(xiàn)Invalid Date的問題及解決

    moment轉(zhuǎn)化時間戳出現(xiàn)Invalid Date的問題及解決

    這篇文章主要介紹了moment轉(zhuǎn)化時間戳出現(xiàn)Invalid Date的問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • vue中組件的3種使用方式詳解

    vue中組件的3種使用方式詳解

    這篇文章主要給大家介紹了關(guān)于vue中組件的3種使用方式,文中通過示例代碼介紹的非常詳細,對大家學習或者使用vue具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-03-03
  • Vue-element中el-input輸入卡頓問題的解決

    Vue-element中el-input輸入卡頓問題的解決

    這篇文章主要介紹了Vue-element中el-input輸入卡頓問題的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • Vue開發(fā)中整合axios的文件整理

    Vue開發(fā)中整合axios的文件整理

    這篇文章主要給大家整理了在Vue開發(fā)中整合axios要用到的文件,在vue開發(fā)中,不可避免要整合axios,文中通過示例代碼介紹的非常詳細,需要的朋友們下面來一起看看吧。
    2017-04-04
  • vue3結(jié)合ts從零實現(xiàn)vueuse的useRouteQuery方法

    vue3結(jié)合ts從零實現(xiàn)vueuse的useRouteQuery方法

    這篇文章主要為大家詳細介紹了如何使用vue3與ts從零實現(xiàn)一個類vueuse的useRouteQuery方法,并解決vueuse的useRouteQuery方法存在的一些問題,感興趣的可以了解下
    2024-03-03

最新評論

凉城县| 博乐市| 永吉县| 阿荣旗| 杨浦区| 涟水县| 绥棱县| 九台市| 常熟市| 东港市| 宣化县| 无极县| 特克斯县| 石楼县| 涞源县| 迁西县| 泽库县| 西畴县| 沈丘县| 肥西县| 怀仁县| 洛扎县| 枣阳市| 兴山县| 五原县| 施秉县| 梁山县| 鹿邑县| 贵阳市| 枞阳县| 陕西省| 台北县| 龙南县| 轮台县| 滨海县| 彝良县| 卓资县| 宝兴县| 武安市| 铜陵市| 沾益县|