当前位置:   article > 正文

vue3 可视化大屏自适应屏幕组件_vue3 可视化面板组件

vue3 可视化面板组件

首先定义了一个名叫ScreenContainerOptions的组件,需要传的参数如下

  1. export type ScreenContainerOptions = {
  2. width?: string | number
  3. height?: string | number
  4. screenFit?: boolean // 是否开启屏幕自适应,不然会按比例显示
  5. }

组件的主要代码如下

  1. onMounted(async () => {
  2. await initSize()
  3. updateSize()
  4. updateScale()
  5. window.addEventListener('resize', onResize)
  6. isReady.value = true // 执行完上面的方法后再渲染slot插槽
  7. })
  8. // 初始化宽高
  9. const initSize = () => {
  10. return new Promise((resolve) => {
  11. nextTick(() => {
  12. dom = refName.value
  13. parentDom = refNameParent.value
  14. // 获取大屏的真实尺寸(不传值就是dom元素的宽高)
  15. widthRef.value = props.options?.width || dom.clientWidth
  16. heightRef.value = props.options?.height || dom.clientHeight
  17. // 获取屏幕尺寸,避免重复计算
  18. if (!screenWidthRef.value || !screenHeightRef.value) {
  19. screenWidthRef.value = window.screen.width
  20. screenHeightRef.value = window.screen.height
  21. }
  22. resolve(true)
  23. })
  24. })
  25. }
  26. // 更新宽高
  27. const updateSize = () => {
  28. dom.style.width = `${widthRef.value || screenWidthRef.value}px`
  29. dom.style.height = `${heightRef.value || screenHeightRef.value}px`
  30. }
  31. // 更新缩放比例
  32. const updateScale = () => {
  33. // window.innerWidth 获取当前展示区域的宽度
  34. const currentWidth = window.innerWidth
  35. // 获取大屏最终真实的宽度
  36. const realWidth = widthRef.value || screenWidthRef.value
  37. // 是否开启屏幕适配,不会按照比例
  38. const { screenFit } = props.options
  39. // 如果不想屏幕留白,而是自适应宽高的话
  40. let heightScale = 1
  41. // window.innerWidth 获取当前展示区域的宽度
  42. const currentHeight = window.innerHeight
  43. // 获取大屏最终真实的宽度
  44. const realHeight = heightRef.value || heightRef.value
  45. if (screenFit) {
  46. heightScale = currentHeight / realHeight
  47. // if (parentDom) {
  48. // parentDom.style.height = dom.style.height = `${window.innerHeight}px` // 父容器宽度设置为原屏幕的宽度
  49. // }
  50. }
  51. // 算出缩放比例并赋值
  52. // 只需要根据宽度计算即可
  53. const scale = currentWidth / realWidth
  54. dom && (dom.style.transform = `scale(${scale}, ${screenFit ? heightScale : 1})`) // 不开启screenFit的话高度不需要缩放
  55. if (parentDom) {
  56. parentDom.style.width = `${window.innerWidth}px` // 父容器宽度设置为原屏幕的宽度
  57. screenFit && (parentDom.style.height = `${window.innerHeight}px`) // 父容器宽度设置为原屏幕的宽度
  58. }
  59. }
  60. // 浏览器resize事件触发回调
  61. const onResize = async () => {
  62. await initSize()
  63. await nextTick()
  64. updateScale()
  65. }

组件完整代码地址

https://github.com/jimchou-h/vue-study/blob/dev/src/components/ScreenContainer.vue

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/566499
推荐阅读
相关标签
  

闽ICP备14008679号