useSizeAdapt.js 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637
  1. // 用法:
  2. // width: calc(950 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  3. import { onBeforeUnmount, ref } from 'vue'
  4. export default function useSizeAdapt(windowWidthWhenDesign = 1920, windowHeightWhenDesign = 1080, needReactivity = true) {
  5. const windowSizeInCssForRef = ref('')
  6. const windowSizeWhenDesignForRef = ref('')
  7. const scaleRate = ref(-1)
  8. function compute() {
  9. if (window.innerWidth / window.innerHeight > windowWidthWhenDesign / windowHeightWhenDesign) {
  10. windowSizeWhenDesignForRef.value = windowHeightWhenDesign
  11. windowSizeInCssForRef.value = window.innerHeight + 'px' // 用100vh的话在移动端会有兼容性问题。
  12. scaleRate.value = windowHeightWhenDesign / window.innerHeight
  13. } else {
  14. windowSizeWhenDesignForRef.value = windowWidthWhenDesign
  15. windowSizeInCssForRef.value = '100vw'
  16. scaleRate.value = windowWidthWhenDesign / window.innerWidth
  17. }
  18. }
  19. compute()
  20. if (needReactivity) {
  21. window.addEventListener('resize', compute)
  22. onBeforeUnmount(() => {
  23. window.removeEventListener('resize', compute)
  24. })
  25. }
  26. return {
  27. windowSizeInCssForRef,
  28. windowSizeWhenDesignForRef,
  29. scaleRate,
  30. }
  31. }