成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

怎么用Vue指令實(shí)現(xiàn)大屏元素分辨率適配

今天小編給大家分享一下怎么用Vue指令實(shí)現(xiàn)大屏元素分辨率適配的相關(guān)知識(shí)點(diǎn),內(nèi)容詳細(xì),邏輯清晰,相信大部分人都還太了解這方面的知識(shí),所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。

網(wǎng)站建設(shè)哪家好,找成都創(chuàng)新互聯(lián)!專注于網(wǎng)頁設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、微信小程序定制開發(fā)、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項(xiàng)目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了招遠(yuǎn)免費(fèi)建站歡迎大家使用!

1. 常見的適配方案

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

  • vw/vh 配合百分比實(shí)現(xiàn),讓元素根據(jù)窗口大小進(jìn)行自動(dòng)調(diào)整

  • fontSize 配合 rem 實(shí)現(xiàn)“單位寬度”的統(tǒng)一

  • 根據(jù)不同的分辨率范圍調(diào)整頁面布局

  • 版心布局,配合最小寬度

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

在一般的 1080p 及以上的分辨率的屏幕中,大多數(shù)設(shè)計(jì)圖的比例和顯示效果都能完美還原。但如果某個(gè)系統(tǒng)的頁面內(nèi)容太多,或者瀏覽器部分使用的分辨率(不是物理分辨率)達(dá)不到完整顯示的要求,采用上面的幾種方式就有可能造成 文字的計(jì)算大小小于瀏覽器的最小字體大小,此時(shí)就有可能因?yàn)槲淖謱挾瘸鲈囟鴮?dǎo)致頁面樣式崩潰。

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

2. CSS3 縮放方案

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

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

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

當(dāng)然,這種方式依然有一些弊端:

  • 縮放后可能會(huì)造成邊緣顯示模糊

  • 如果內(nèi)部存在 canvas 元素,可能導(dǎo)致 canvas 內(nèi)部的內(nèi)容渲染失真

  • 高德地圖 1.x 會(huì)導(dǎo)致事件坐標(biāo)偏移 (2.0 已經(jīng)修復(fù))

  • ...

3. 封裝一個(gè)縮放指令

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

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

  • bind: 解析到指令綁定時(shí)執(zhí)行,僅執(zhí)行一次

  • inserted: 插入父節(jié)點(diǎn)時(shí)執(zhí)行

  • update:組件觸發(fā)更新時(shí)執(zhí)行

  • componentUpdated:所有組件更新結(jié)束之后執(zhí)行

  • unbind:元素解綁(銷毀)時(shí)執(zhí)行,也只執(zhí)行一次

這里因?yàn)槲覀冎恍枰诔跏蓟瘯r(shí)綁定瀏覽器的 resize 事件來調(diào)整元素縮放,所以只需要配置 inserted 即可;當(dāng)然,為了優(yōu)化代碼邏輯,減少資源消耗等情況,也需要在 unbind 階段去取消 resize 事件的一個(gè)回調(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;

說明:

  • 指令接收一個(gè)對(duì)象參數(shù),用來指定比例計(jì)算方式和縮放定位

  • 需要一個(gè)全局配置 CONF 對(duì)象,用來指定默認(rèn)的頁面尺寸

  • 為了保證頁面已經(jīng)加載完,能獲取到 dom 元素,需要調(diào)用 Vue.nextTick

  • 需要銷毀監(jiān)聽事件

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

但是這里我也做了一點(diǎn)小的配置,用來適應(yīng)更多的情況:

  • 接收一個(gè) target 配置,用來確認(rèn)比例計(jì)算方式;可以以寬度或者高度作為統(tǒng)一的縮放標(biāo)準(zhǔn),也可以分別計(jì)算

  • 接收 transform 的 origin 配置,保證不同位置的元素可以縮放到不同的位置,避免縮放偏移

  • 不涉及綁定元素的尺寸,只需要默認(rèn)尺寸即可;寫代碼時(shí)可以直接根據(jù)設(shè)計(jì)圖配置元素尺寸

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

并且因?yàn)橹暗捻?xiàng)目中還涉及到很多圖表、地圖,也經(jīng)常導(dǎo)致一些顯示問題,所以后面有增加了一些新的指令,但是分辨率適配這個(gè)問題還是要根據(jù)實(shí)際情況來確定具體的方案。

以上就是“怎么用Vue指令實(shí)現(xiàn)大屏元素分辨率適配”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會(huì)為大家更新不同的知識(shí),如果還想學(xué)習(xí)更多的知識(shí),請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

分享題目:怎么用Vue指令實(shí)現(xiàn)大屏元素分辨率適配
網(wǎng)址分享:http://jinyejixie.com/article28/pgepjp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供虛擬主機(jī)、服務(wù)器托管、企業(yè)網(wǎng)站制作網(wǎng)站收錄、微信小程序

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站建設(shè)
泊头市| 普陀区| 鹤峰县| 沙湾县| 神农架林区| 桐庐县| 十堰市| 外汇| 乐都县| 永和县| 津南区| 台中县| 福海县| 太白县| 邯郸县| 马关县| 教育| 葫芦岛市| 渝中区| 长寿区| 云阳县| 大兴区| 工布江达县| 远安县| 新巴尔虎右旗| 新沂市| 芦山县| 广灵县| 临江市| 海兴县| 阜康市| 南澳县| 汶上县| 开远市| 保靖县| 扎鲁特旗| 宁国市| 甘南县| 军事| 杭锦后旗| 涿鹿县|