大屏幕适配方法之:transform:scale()

CSS3新增的属性transform主要用于设置元素的变形,比如旋转、倾斜、缩放等。我们今天要用到的正式它的缩放功能transform:scale()

取值

  • 单一数值
    单一的数值即指定了一个缩放系数,同时作用于 X 轴和 Y 轴让该元素进行缩放,相当于指定了单个值的 scale()(2D 缩放) 函数。

  • 两个长度/百分比值
    两个数值即分别指定了 2D 比例的 X 轴和 Y 轴的缩放系数,相当于指定了两个值的 scale()(2D 缩放)函数。

  • 三个长度/百分比值
    三个数值即分别指定了 3D 比例的 X 轴、Y 轴和 Z 轴的缩放系数。相当于一个 scale3d() 函数。

工作中遇到一个问题,页面中其他元素通过使用VW、VH实现了自适应。唯独两个echarts图无法设置VW和VH,导致鼠标滚轮滚动页面出现严重变形。

解决方式一

在拖动窗口或者鼠标滚轮在页面中滚动实现缩放时,监听window的resize事件,并在事件中调用echarts的resize()方法。

window.onresize = function () {
					echart1.resize()
					echart2.resize()
}

并无卵用~

解决方式二

同事建议使用vue-echarts,通过属性autoresize可以实现echarts图的自动缩放

<template>
    <div style="width:100vw">
      <v-chart autoresize :option="option_column" style="height: 400px"></v-chart>
    </div>
</template>
 
<script>
export default {
  data() {
    return {
      option_column: {
        title: { text: "Column Chart" },
        tooltip: {},
        xAxis: {
          data: ["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"],
        },
        yAxis: {},
        series: [
          {
            name: "销量",
            type: "bar",
            data: [5, 20, 36, 10, 10, 20],
          },
        ],
      },
    };
  },
};
</script>
 
<style  scoped lang="scss">
</style>

可能是代码结构或者别的问题,依然无法实现echarts图缩放而不变形的效果。

最终解决方法

公司的项目使用了微前端架构,不同的小项目可以融合在一起,别的项目页面与我所开发的页面结构大致相同,它们已经实现了缩放功能。由于他们的代码是通过低代码平台实现的,我们无法查看它们的代码逻辑。但经过同事提醒,它们可能使用了transform:scale()这个属性来实现的,通过控制台观察它们元素属性,最后找到了最外层使用的transform:scale()的元素。最后经过一步步调整,终于靠transform:scale()实现了,页面整体的缩放。

步骤
  1. 首先要给页面的最外层设置一个宽高,一般是设计图的尺寸,并指定缩放的基准点。
	.app{	 
			width:1900px;
			height:1080px;
			transform-origin: top left;
		}
  1. 设置window.resize的监听事件,并在回调函数中计算出页面缩放的比例,并同步设置给外层app的transform:scale()上
window.onresize = function () {
					echart1.resize()
					echart2.resize()
					setTimeout(() => {						
						let currentWidth = window.innerWidth;
						// let scale = currentWidth / idealWidth;
						// const currentSize = { width: window.innerWidth, height: window.innerHeight };
						// const scale = Math.min(initialSize.width / currentSize.width, initialSize.height / currentSize.height); // 取较小的比例,以防止页面变形
						var scaleW = window.innerWidth / 1900; // 假设1200px是设计稿的原始宽度
						var scaleH = window.innerHeight / 1080; // 假设1200px是设计稿的原始宽度
						  // document.body.style.transform = 'scale(' + scale + ')'; // 缩放比例
						  // document.body.style.transformOrigin = 'top left'; // 确保缩放从左上角开始
						console.log(currentWidth,'currentWidth....')
						console.log(scaleW,'scaleW....')
						console.log(scaleH,'scaleH....')
						//document.getElementById('app').style.transform = `scale(${scale}, ${scale})`;
						document.getElementById('app').style.transform = `scale(${scaleW}, ${scaleH})`;
					}, 500);
				}
			},

最终完美实现了,与其他项目一样的缩放效果!完结!散花~

使用 `scale` 进行屏幕适配是一种相对简单的适配方案,它通过 `scale` 属性,根据屏幕大小,对页面进行整体缩放。其实现方式如下: ### 优点 - 相对简单易实现:通过 CSS 的 `transform` 属性设置 `scale` 可以很容易地对页面进行缩放处理。 - 保持页面结构:使用 `Scale` 可以在不改变页面结构的情况下实现屏幕适配,保持页面元素的相对位置关系 [^1]。 ### 缺点 - 可能造成画面失真:由于使用缩放操作,页面元素可能会出现拉伸或压缩的情况,导致页面视觉效果不佳。 - 对性能的影响:页面进行缩放操作可能会增加页面的重绘与重排次数,影响页面性能。 - 当缩放比例过大时候,事件热区会偏移 [^1]。 ### 代码示例 下面是一个使用 `scale` 进行屏幕适配的简单示例: ```html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <style> body { margin: 0; padding: 0; display: flex; justify-content: center; align-items: center; height: 100vh; } .container { width: 1200px; height: 800px; background-color: #f0f0f0; border: 1px solid #ccc; /* 计算缩放比例 */ transform: scale(calc(100vw / 1200)); transform-origin: top left; } </style> </head> <body> <div class="container"> <!-- 这里放置页面内容 --> <h1>这是一个示例标题</h1> <p>这是一段示例文本。</p> </div> </body> </html> ``` 在上述代码中,通过 `transform: scale(calc(100vw / 1200));` 计算出缩放比例,使得 `.container` 元素根据视口宽度进行缩放。 ### 注意事项 - 要注意缩放可能造成的画面失真和性能问题。 - 当缩放比例过大时,要处理好事件热区偏移的问题 [^1]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值