4

从0到1搭建一款页面自适应组件(Vue.js)

 3 years ago
source link: http://developer.51cto.com/art/202102/646225.htm
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

组件将根据屏幕比例及当前浏览器窗口大小,自动进行缩放处理。

建议在组件内使用百分比搭配flex进行布局,以便于在不同的分辨率下得到较为一致的展示效果。

使用前请注意将body的margin设为0,否则会引起计算误差。

fullScreenContainer.vue

autoResize.js

export default { data() { return { dom: '', width: 0, height: 0, debounceInitWHFun: '', domObserver: '' }; }, methods: { debounce(delay, callback) { let lastTime; return function() { clearTimeout(lastTime); const [that, args] = [this, arguments]; lastTime = setTimeout(() => { callback.apply(that, args); }, delay); }; }, observerDomResize(dom, callback) { const MutationObserver = window.MutationObserver || window.WebKitMutationObserver || window.MozMutationObserver; const observer = new MutationObserver(callback); observer.observe(dom, { attributes: true, attributeFilter: ['style'], attributeOldValue: true }); return observer; }, async autoResizeMixinInit() { const { initWH, getDebounceInitWHFun, bindDomResizeCallback, afterAutoResizeMixinInit } = this; await initWH(false); getDebounceInitWHFun(); bindDomResizeCallback(); if (typeof afterAutoResizeMixinInit === 'function') afterAutoResizeMixinInit(); }, initWH(resize = true) { const { $nextTick, $refs, ref, onResize } = this; return new Promise(resolve => { $nextTick(() => { const dom = (this.dom = $refs[ref]); this.width = dom ? dom.clientWidth : 0; this.height = dom ? dom.clientHeight : 0; if (!dom) { console.warn( 'DataV: Failed to get dom node, component rendering may be abnormal!' ); } else if (!this.width || !this.height) { console.warn( 'DataV: Component width or height is 0px, rendering abnormality may occur!' ); } if (typeof onResize === 'function' && resize) onResize(); resolve(); }); }); }, getDebounceInitWHFun() { const { initWH } = this; this.debounceInitWHFun = this.debounce(100, initWH); }, bindDomResizeCallback() { const { dom, debounceInitWHFun } = this; this.domObserver = this.observerDomResize(dom, debounceInitWHFun); window.addEventListener('resize', debounceInitWHFun); }, unbindDomResizeCallback() { let { domObserver, debounceInitWHFun } = this; if (!domObserver) return; domObserver.disconnect(); domObserver.takeRecords(); domObserver = null; window.removeEventListener('resize', debounceInitWHFun); } }, mounted() { const { autoResizeMixinInit } = this; autoResizeMixinInit(); }, beforeDestroy() { const { unbindDomResizeCallback } = this; unbindDomResizeCallback(); }};

这样,一个页面自适应组件就这样搭建完成了,下面,我们将引入组件看一下效果。

效果很好,这样对于一些开发自适应页面非常容易。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK