您好,登錄后才能下訂單哦!
今天小編給大家分享一下怎么用Vue指令實現大屏元素分辨率適配的相關知識點,內容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。
平時我們使用的 web 端的適配方案,主要有以下幾種:
vw/vh 配合百分比實現,讓元素根據窗口大小進行自動調整
fontSize 配合 rem 實現“單位寬度”的統一
根據不同的分辨率范圍調整頁面布局
版心布局,配合最小寬度
目前大多數屏幕適配方案的原理都是采用的以上的幾種方式,但是這幾種方式也有很大的弊端:瀏覽器文字有最小尺寸!
在一般的 1080p 及以上的分辨率的屏幕中,大多數設計圖的比例和顯示效果都能完美還原。但如果某個系統的頁面內容太多,或者瀏覽器部分使用的分辨率(不是物理分辨率)達不到完整顯示的要求,采用上面的幾種方式就有可能造成 文字的計算大小小于瀏覽器的最小字體大小,此時就有可能因為文字寬度超出元素而導致頁面樣式崩潰。
版心布局配合最小寬度可以保證顯示效果,但是不適合大屏項目。
在上面的幾種方案都不滿足時,大家一般就會采用另外一種方案:CSS3 scale 縮放。
通過計算設計圖尺寸比例與實際的頁面顯示區域大小,來動態調整元素的縮放比例。
個人認為這是針對小分辨率情況下保留顯示內容及樣式最好的一種處理方式。
當然,這種方式依然有一些弊端:
縮放后可能會造成邊緣顯示模糊
如果內部存在 canvas 元素,可能導致 canvas 內部的內容渲染失真
高德地圖 1.x 會導致事件坐標偏移 (2.0 已經修復)
...
這里簡單回顧一下 Vue 的自定義指令:通過配置自定義指令和綁定參數,在組件/元素加載、更新、銷毀等不同時期執行對應的處理邏輯。
Vue 的自定義指令包含一下幾個鉤子函數:
bind: 解析到指令綁定時執行,僅執行一次
inserted: 插入父節點時執行
update:組件觸發更新時執行
componentUpdated:所有組件更新結束之后執行
unbind:元素解綁(銷毀)時執行,也只執行一次
這里因為我們只需要在初始化時綁定瀏覽器的 resize 事件來調整元素縮放,所以只需要配置 inserted 即可;當然,為了優化代碼邏輯,減少資源消耗等情況,也需要在 unbind 階段去取消 resize 事件的一個回調函數。
代碼如下:
// 縮放指令
import Vue from "vue";
function transformScale(el, options) {
const { target = "width", origin = "top left" } = options;
Vue.nextTick(() => {
// 獲取顯示區域高寬
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;
說明:
指令接收一個對象參數,用來指定比例計算方式和縮放定位
需要一個全局配置 CONF 對象,用來指定默認的頁面尺寸
為了保證頁面已經加載完,能獲取到 dom 元素,需要調用 Vue.nextTick
需要銷毀監聽事件
整個代碼其實很簡單,就是通過監聽 resize 事件去調整元素的縮放比例。
但是這里我也做了一點小的配置,用來適應更多的情況:
接收一個 target 配置,用來確認比例計算方式;可以以寬度或者高度作為統一的縮放標準,也可以分別計算
接收 transform 的 origin 配置,保證不同位置的元素可以縮放到不同的位置,避免縮放偏移
不涉及綁定元素的尺寸,只需要默認尺寸即可;寫代碼時可以直接根據設計圖配置元素尺寸
當然,這個指令不能說有多完美,依然有很多有漏洞的地方,比如沒有防抖、縮放不會改變css指定的尺寸,容易出現滾動條等;
并且因為之前的項目中還涉及到很多圖表、地圖,也經常導致一些顯示問題,所以后面有增加了一些新的指令,但是分辨率適配這個問題還是要根據實際情況來確定具體的方案。
以上就是“怎么用Vue指令實現大屏元素分辨率適配”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。