文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2024-12-03 10:52

关注

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

fullScreenContainer.vue

  1.  
  2.   
 
  •  
  •  
  •  
  •  
  • "scss"
  • #full-screen-container { 
  •   position: fixed; 
  •   top: 0px; 
  •   left: 0px; 
  •   overflow: hidden; 
  •   transform-origin: left top
  •   z-index: 999; 
  •  
  • autoResize.js

    1. export default { 
    2.     data() { 
    3.         return { 
    4.             dom: ''
    5.             width: 0, 
    6.             height: 0, 
    7.             debounceInitWHFun: ''
    8.             domObserver: '' 
    9.         }; 
    10.     }, 
    11.     methods: { 
    12.         debounce(delay, callback) { 
    13.             let lastTime; 
    14.  
    15.             return function() { 
    16.                 clearTimeout(lastTime); 
    17.  
    18.                 const [that, args] = [this, arguments]; 
    19.  
    20.                 lastTime = setTimeout(() => { 
    21.                     callback.apply(that, args); 
    22.                 }, delay); 
    23.             }; 
    24.         }, 
    25.  
    26.         observerDomResize(dom, callback) { 
    27.             const MutationObserver = 
    28.                 window.MutationObserver || 
    29.                 window.WebKitMutationObserver || 
    30.                 window.MozMutationObserver; 
    31.  
    32.             const observer = new MutationObserver(callback); 
    33.  
    34.             observer.observe(dom, { 
    35.                 attributes: true
    36.                 attributeFilter: ['style'], 
    37.                 attributeOldValue: true 
    38.             }); 
    39.  
    40.             return observer; 
    41.         }, 
    42.         async autoResizeMixinInit() { 
    43.             const { 
    44.                 initWH, 
    45.                 getDebounceInitWHFun, 
    46.                 bindDomResizeCallback, 
    47.                 afterAutoResizeMixinInit 
    48.             } = this; 
    49.  
    50.             await initWH(false); 
    51.  
    52.             getDebounceInitWHFun(); 
    53.  
    54.             bindDomResizeCallback(); 
    55.  
    56.             if (typeof afterAutoResizeMixinInit === 'function'
    57.                 afterAutoResizeMixinInit(); 
    58.         }, 
    59.         initWH(resize = true) { 
    60.             const { $nextTick, $refs, ref, onResize } = this; 
    61.  
    62.             return new Promise(resolve => { 
    63.                 $nextTick(() => { 
    64.                     const dom = (this.dom = $refs[ref]); 
    65.  
    66.                     this.width = dom ? dom.clientWidth : 0; 
    67.                     this.height = dom ? dom.clientHeight : 0; 
    68.  
    69.                     if (!dom) { 
    70.                         console.warn( 
    71.                             'DataV: Failed to get dom node, component rendering may be abnormal!' 
    72.                         ); 
    73.                     } else if (!this.width || !this.height) { 
    74.                         console.warn( 
    75.                             'DataV: Component width or height is 0px, rendering abnormality may occur!' 
    76.                         ); 
    77.                     } 
    78.  
    79.                     if (typeof onResize === 'function' && resize) onResize(); 
    80.  
    81.                     resolve(); 
    82.                 }); 
    83.             }); 
    84.         }, 
    85.         getDebounceInitWHFun() { 
    86.             const { initWH } = this; 
    87.  
    88.             this.debounceInitWHFun = this.debounce(100, initWH); 
    89.         }, 
    90.         bindDomResizeCallback() { 
    91.             const { dom, debounceInitWHFun } = this; 
    92.  
    93.             this.domObserver = this.observerDomResize(dom, debounceInitWHFun); 
    94.  
    95.             window.addEventListener('resize', debounceInitWHFun); 
    96.         }, 
    97.         unbindDomResizeCallback() { 
    98.             let { domObserver, debounceInitWHFun } = this; 
    99.  
    100.             if (!domObserver) return
    101.  
    102.             domObserver.disconnect(); 
    103.             domObserver.takeRecords(); 
    104.             domObserver = null
    105.  
    106.             window.removeEventListener('resize', debounceInitWHFun); 
    107.         } 
    108.     }, 
    109.     mounted() { 
    110.         const { autoResizeMixinInit } = this; 
    111.  
    112.         autoResizeMixinInit(); 
    113.     }, 
    114.     beforeDestroy() { 
    115.         const { unbindDomResizeCallback } = this; 
    116.  
    117.         unbindDomResizeCallback(); 
    118.     } 
    119. }; 

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

    1.  
    2.  
    3.  
    4.  
    5.  

     

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

     

    来源:前端历劫之路内容投诉

    免责声明:

    ① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

    ② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

    软考中级精品资料免费领

    • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

      难度     813人已做
      查看
    • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

      难度     354人已做
      查看
    • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

      难度     318人已做
      查看
    • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

      难度     435人已做
      查看
    • 2024年上半年系统架构设计师考试综合知识真题

      难度     224人已做
      查看

    相关文章

    发现更多好内容

    猜你喜欢

    AI推送时光机
    位置:首页-资讯-后端开发
    咦!没有更多了?去看看其它编程学习网 内容吧
    首页课程
    资料下载
    问答资讯