教你使用vue-autofit 一行代碼搞定自適應(yīng)可視化大屏
可視化大屏適配/自適應(yīng)現(xiàn)狀
可視化大屏的適配是一個(gè)老生常談的話題了,現(xiàn)在其實(shí)不乏一些大佬開源的自適應(yīng)插件、工具但是我為什么還要重復(fù)造輪子呢?因?yàn)槟壳笆忻嫔线m配工具每一個(gè)都無法做到完美的效果,做出來的東西都差不多,最終實(shí)現(xiàn)效果都逃不出白邊的手掌心,可以解決白邊問題的,要么太過于復(fù)雜,要么會(huì)影響dom結(jié)構(gòu)。
三大常用方式
vw/vh方案
概述:按照設(shè)計(jì)稿的尺寸,將
px
按比例計(jì)算轉(zhuǎn)為vw
和vh
優(yōu)點(diǎn):可以動(dòng)態(tài)計(jì)算圖表的寬高,字體等,靈活性較高,當(dāng)屏幕比例跟 ui 稿不一致時(shí),不會(huì)出現(xiàn)兩邊留白情況
缺點(diǎn):每個(gè)圖表都需要單獨(dú)做字體、間距、位移的適配,比較麻煩
scale方案
概述:也是目前效果最好的一個(gè)方案
優(yōu)點(diǎn):代碼量少,適配簡單 、一次處理后不需要在各個(gè)圖表中再去單獨(dú)適配.
缺點(diǎn):留白,據(jù)說有事件熱區(qū)偏移,但是我目前沒有發(fā)現(xiàn)有這個(gè)問題,即使是地圖也沒有
rem + vw vh方案
概述:這名字一聽就麻煩,具體方法為獲得
rem
的基準(zhǔn)值 ,動(dòng)態(tài)的計(jì)算html根元素的font-size ,圖表中通過vw
vh
動(dòng)態(tài)計(jì)算字體、間距、位移等優(yōu)點(diǎn):布局的自適應(yīng)代碼量少,適配簡單
缺點(diǎn):留白,有時(shí)圖表需要單獨(dú)適配字體
基于此背景,我決定要造一個(gè)簡單又好用的輪子。
解決留白問題
留白問題是在使用scale時(shí)才會(huì)出現(xiàn),而其他方式實(shí)現(xiàn)起來又復(fù)雜,效果也不算太理想,總會(huì)破壞掉原有的結(jié)構(gòu),可能使元素?cái)D在一起,所以我們還是選擇使用scale方案,不過這次要做出一點(diǎn)小小的改變。
常用分辨率
首先來看一下我的拯救者的分辨率:
它可以代表從1920往下的分辨率
我們可以發(fā)現(xiàn),比例分別是:1.77、1.6、1.77、1.6、1.33... 總之,沒有特別夸張的寬高比。
計(jì)算補(bǔ)齊白邊所需的px
只要沒有特別夸張的寬高比,就不會(huì)出現(xiàn)特別寬或者特別高的白邊,那么我們能不能直接將元素寬高補(bǔ)過去?也就是說,當(dāng)屏幕右側(cè)有白邊時(shí),我們就讓寬度多出一個(gè)白邊的px,當(dāng)屏幕下方有白邊時(shí),我們就讓高度多出一個(gè)白邊的px。
很喜歡CSGO玩家的一句話:"?。?quot;
先想一下,如果此時(shí)按寬度比例縮放,會(huì)在下方留下白邊,所以設(shè)置一下它的高度,設(shè)置多少呢?比如 scale==0.8 ,也就是說整個(gè)#app縮小了0.8倍,我們需要將高擴(kuò)大多少倍才可以回到原來的大小呢?
emmm.....
算數(shù)我最不在行了,啟動(dòng)高材生
原來是八分之十,我vue燒了。
當(dāng)瀏覽器窗口比設(shè)計(jì)稿大或者小的時(shí)候,就應(yīng)該觸發(fā)縮放,但是比例不一定,如果按照scale等比縮放時(shí),寬度從1920縮小0.8倍也就是1536,而高度縮小0.8也就是743,如果此時(shí)瀏覽器高度過高,那么就會(huì)出現(xiàn)下方的白邊,根據(jù)高材生所說的,縮小0.8后只需要放大八分之十就可以變回原大小,所以以現(xiàn)在的高度743*1.25=928,使寬度=928px就可以完全充滿白邊!
真的是這樣嗎?感覺哪里不對(duì)勁...
是瀏覽器高度!我忽略了瀏覽器高度,我可以直接使用瀏覽器高度乘以1.25然后再縮放達(dá)0.8!就是 1 !
也就是說 clientHeight / scale 就等于我們需要的高度!
我們用代碼試一試
function keepFit(designWidth, designHeight, renderDom) { let clientHeight = document.documentElement.clientHeight; let clientWidth = document.documentElement.clientWidth; let scale = 1; if (clientWidth / clientHeight < designWidth / designHeight) { scale = (clientWidth / designWidth) document.querySelector(renderDom).style.height = `${clientHeight / scale}px`; } else { scale = (clientHeight / designHeight) document.querySelector(renderDom).style.width = `${clientWidth / scale}px`; } document.querySelector(renderDom).style.transform = `scale(${scale})`; }
上面的代碼可能看起來亂糟糟的,我來解釋一下:
參數(shù)分別是:設(shè)計(jì)稿的寬高和你要適配的元素,在vue中可以直接傳#app。
下面的if判斷的是寬度固定還是高度固定,當(dāng)屏幕寬高比小于設(shè)計(jì)寬高比時(shí),
我們把高度寫成 clientHeight / scale ,寬度也是同理。
最終效果
將這段代碼放到App.vue的mounted運(yùn)行一下
如上圖所示:我們成功了,我們僅用了1 2 3 4....這么幾行代碼,就做到了足以媲美復(fù)雜寫法的自適應(yīng)!
我把這些東西封裝了一個(gè)npm包:vue-autofit ,開箱即用,歡迎下載!
親手打造集成工具:vue-autofit
這是一款可以使你的項(xiàng)目一鍵自適應(yīng)的工具 github源碼??go
- 從npm下載
npm i vue-autofit
- 引入
import autofit from 'vue-autofit'
- 快速開始
autofit.init()
默認(rèn)參數(shù)為1920*929(即去掉瀏覽器頭的1080), 直接在大屏啟動(dòng)時(shí)調(diào)用即可
- 使用
export default { mounted() { autofit.init({ designHeight: 1080, designWidth: 1920, renderDom:"#app", resize: true }) }, }
以上使用的是默認(rèn)參數(shù),可根據(jù)實(shí)際情況調(diào)整,參數(shù)分別為
* - renderDom(可選):渲染的dom,默認(rèn)是 "#app",必須使用id選擇器
* - designWidth(可選):設(shè)計(jì)稿的寬度,默認(rèn)是 1920
* - designHeight(可選):設(shè)計(jì)稿的高度,默認(rèn)是 929 ,如果項(xiàng)目以全屏展示,則可以設(shè)置為1080
* - resize(可選):是否監(jiān)聽resize事件,默認(rèn)是 true
以上就是教你使用vue-autofit 一行代碼搞定自適應(yīng)可視化大屏的詳細(xì)內(nèi)容,更多關(guān)于vue-autofit自適應(yīng)可視化大屏的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
vuejs實(shí)現(xiàn)本地?cái)?shù)據(jù)的篩選分頁功能思路詳解
今天做項(xiàng)目需要一份根據(jù)本地?cái)?shù)據(jù)的篩選分頁功能,下面小編把vuejs實(shí)現(xiàn)本地?cái)?shù)據(jù)的篩選分頁功能的實(shí)現(xiàn)思路分享到腳本之家平臺(tái),需要的朋友可以參考下2017-11-11React和Vue實(shí)現(xiàn)路由懶加載的示例代碼
路由懶加載是一項(xiàng)關(guān)鍵技術(shù),它可以幫助我們提高Web應(yīng)用的加載速度,本文主要介紹了React和Vue實(shí)現(xiàn)路由懶加載的示例代碼,具有一定的參考價(jià)值,感興趣的可以了解一下2024-01-01vue腳手架配置預(yù)渲染及prerender-spa-plugin配置方式
這篇文章主要介紹了vue腳手架配置預(yù)渲染及prerender-spa-plugin配置方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-05-05解決vue-cli@3.xx安裝不成功的問題及搭建ts-vue項(xiàng)目
這篇文章主要介紹了解決vue-cli@3.xx安裝不成功的問題及搭建ts-vue項(xiàng)目.文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-02-02詳解vue-meta如何讓你更優(yōu)雅的管理頭部標(biāo)簽
這篇文章主要介紹了詳解vue-meta如何讓你更優(yōu)雅的管理頭部標(biāo)簽,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-01-01vue實(shí)現(xiàn)復(fù)制文字復(fù)制圖片實(shí)例詳解
這篇文章主要為大家介紹了vue實(shí)現(xiàn)復(fù)制文字復(fù)制圖片實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02