飞道的博客

大屏适配方案

407人阅读  评论(0)

目录

方案一:transform

当屏幕宽高比<=16:9时

当屏幕宽高比>16:9时

放入地图

方案二:rem


方案一:transform

思路:设置外层根元素的宽高,同时采用transform对该元素及其子元素进行缩放transform:scale(scaleRate),使该元素宽度适配当前窗口

缩放的倍数scaleRate有以下两种情况:

当屏幕宽高比<=16:9时

按照1920:1080计算,固定父元素width=1920px,height=1080px, 根据宽度缩小比例进行缩小。

步骤:屏幕的可视宽度rootWidth,屏幕缩放倍数 scaleRate=rootWidth/1920,此时Dom应显示的高度为1080 * scaleRate。父元素设置transform:scale(scaleRate)(此时屏幕底部会有一些空白)

当屏幕宽高比>16:9时

当屏幕宽高比>16:9时,1080*scaleRate > 实际高度,当前屏幕放不下,此时scaleRate按照高度计算,scaleRate=rootHeight/1080, width=rootWidth/scaleRate(因为transform:scale时会缩放,相当于Dom最后的宽度=rootWidth/scaleRate*scaleRate=rootWidth,此时屏幕水平方向的间距会比较大)


  
  1. <template>
  2. <div class="home">
  3. <div class="num">
  4. <div>123 </div>
  5. <div>456 </div>
  6. </div>
  7. </div>
  8. </template>
  9. <script>
  10. export default {
  11. name: "HomeView",
  12. components: {},
  13. data( ) {
  14. return {};
  15. },
  16. mounted( ) {
  17. this. resizeWindow();
  18. window. addEventListener( "resize", this. resizeWindow);
  19. },
  20. beforeDestroy( ) {
  21. window. removeEventListener( "resize", this. resizeWindow);
  22. },
  23. methods: {
  24. resizeWindow( ) {
  25. console. log( "resize---");
  26. let rootWidth = document. documentElement. clientWidth;
  27. let rootHeight = document. documentElement. clientHeight;
  28. let scaleRate = (rootWidth / 1920). toFixed( 3) * 1;
  29. // console.log(rootWidth, rootHeight, scaleRate);
  30. // console.log(1920 * scaleRate, 1080 * scaleRate);
  31. let targetDom = document. getElementsByClassName( "home")[ 0];
  32. // 当按照scale进行高度缩放时,缩放高度大于实际窗口高度,此时按照实际高度进行缩放
  33. if ( 1080 * scaleRate > rootHeight) {
  34. scaleRate = (rootHeight / 1080). toFixed( 3) * 1;
  35. // console.log(1920 * scaleRate, 1080 * scaleRate, scaleRate);
  36. targetDom. style. width = `${rootWidth / scaleRate}px`;
  37. }
  38. else{
  39. targetDom. style. width = '1920px'
  40. }
  41. targetDom. style. transform = `scale(${scaleRate})`;
  42. },
  43. },
  44. };
  45. </script>
  46. <style scoped>
  47. .home {
  48. width: 1920px;
  49. height: 1080px;
  50. padding: 20px;
  51. border: solid 5px #999;
  52. font-size: 24px;
  53. transform-origin: left top;
  54. }
  55. .num {
  56. display: flex;
  57. justify-content: space-between;
  58. }
  59. </style>

屏幕宽高比小于16:9

 屏幕宽高比=16:9

 屏幕宽高比大于16:9

放入地图

home.vue

1.设置resize全局监听,引入Amap组件

amap.vue

id=mapContainer节点作为地图的容器

踩坑:设置#mapContainer{width:100%;height: 100%},这样设置地图继承了父节点宽高,但是出现了一个问题,使用海量点渲染,点击事件不生效(LabelsLayer、LabelMarker),这是因为父元素的transform:scale改变了标注的位置

解决方法:父节点scale(x)倍,mapContainer也scale(1/x)倍,并把该节点设置为position:absolute,父元素设置 overflow: hidden;


  
  1. //home.vue
  2. <template>
  3. <div class="home">
  4. <Amap> </Amap>
  5. </div>
  6. </template>
  7. <script>
  8. import Amap from "./amap";
  9. import { resizeWindow } from "@/utils/resize.js";
  10. import { onMounted, onBeforeUnmount } from "vue";
  11. export default {
  12. name: "HomeView",
  13. components: { Amap },
  14. data( ) {
  15. return {};
  16. },
  17. setup( ) {
  18. onMounted( () => {
  19. resizeWindow();
  20. window. addEventListener( "resize", resizeWindow);
  21. });
  22. onBeforeUnmount( () => {
  23. window. removeEventListener( "resize", resizeWindow);
  24. });
  25. },
  26. };
  27. </script>
  28. <style scoped>
  29. .home {
  30. width: 1920px;
  31. height: 1080px;
  32. font-size: 24px;
  33. transform-origin: left top;
  34. position: relative;
  35. overflow: hidden;
  36. }
  37. </style>

  
  1. //amap.vue
  2. <template>
  3. <div id="mapContainer"> </div>
  4. </template>
  5. <script>
  6. </script>
  7. <style lang="less" scoped>
  8. #mapContainer {
  9. position: absolute;
  10. top: 0px;
  11. bottom: 0px;
  12. left: 0px;
  13. right: 0px;
  14. }
  15. </style>

  
  1. //resize.js
  2. export function resizeWindow( ) {
  3. //home节点的缩放,参考上面的缩放代码
  4. ......
  5. //mapContainer节点
  6. // 父级元素缩小的同时,放大地图,是地图根元素的transform:scale(1),这样地图上的marker标注才不会偏移
  7. let mapContainer = document. getElementById( 'mapContainer')
  8. let scaleRateReverse = ( 1 / scaleRate). toFixed( 5) * 1
  9. mapContainer. style. transform = `scale(${scaleRateReverse})`;
  10. }

方案二:rem


转载:https://blog.csdn.net/the_love_story/article/details/128794829
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场