工做中碰到个奇怪的问题,折腾了大半天,终于算是解决了,这里把分析思路和解决办法记录下。css
项目是作响应式的公司官网,前期的静态图页面切完后就提交给后台做为模板使用了,我也就基本退出项目。前端
在后端落地时发如今在移动端页面显示不太对劲,显得很模糊。第一想法是meta的头部被覆盖了,查看源代码果真发现是被覆盖了。css3
这是我习惯用的meta头部,使页面宽度根据设备宽度自适应变化算法
<meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no" />
但是后端落地的框架是按模板直接引入的,有部分的公共资源居然也包含了设置viewport的meta。后端引入的是这个样子的:后端
<meta name="viewport" id="viewport" content="width=640px, user-scalable=no">
这一头部是被一段不得不被加入的js文件所append进入的,并且被明确告知,该js文件不能够被修改!因此这一设置宽度为固定640px的将我本来设置随设备宽度变化的meta覆盖了!浏览器
问题就来了,静态页面已经完成,且因为历史代码因素,有至关部分的代码在当初并无使用rem单位,已经没法大规模修改css效果了。只有经过js重置设置viewport宽度再次进行覆盖了......这却是挺简单的,无非就是代码至关的丑陋而已。app
但又一个问题来了,这个官网页面还动态引入了iframe页面,这些iframe页面是固定的640px宽度。这就很崩溃了!我加了随设备宽度变化的mata,那么这些iframe就不能看了;我再也不次加meta,那么官网自己就不能看了!框架
好在这些iframe是经过统一的方法引入,虽然不能更改引入方法的js文件,但在业务代码中再次监听倒也还能够。因此再次这个绑定点击事件,判断iframe是否被引入后,就是使用某些特殊方法的时候了!学习
css3有个transform: scale()
的方法,能够对元素进行缩放,虽然真正占位的宽高并无变化,但在显示效果上仍是不错的。scala
经过计算缩放比例 = 设备宽度 / 640
能够得出对应的缩放比例,再对引入的iframe设置transform: scale(缩放比例)
就能够实现漂亮的缩放了!
事情到这里就结束了吗?不!尚未!iframe是缩放了,可高度也被缩放了,内容显示不完整了。这里设置height: 设备高度 / 缩放比例
能够还原本来的iframe高度。
觉得结束了?并无!还有问题存在!iframe层被scale()
属性缩放后,默认的向下和向右也移动了一段距离,这是由于scale()
默认是按中心进行缩放的!这里花了大量时间去寻找合适的方法解决,好比负margin、translate()等,可是因为难以计算合适的移动比例系数,恕本人算法辣鸡,这一方法尝试好久终于决定仍是放弃......
翻看css手册发现了一个熟悉又陌生的属性
设置旋转元素的基点位置: transform-origin: x-axis y-axis z-axis;
它有3个属性值,分别表明定义视图被置于X、Y、Z轴的何处。
他乡遇故知,久旱逢甘霖!要的就是你啊!设置transform-origin: 0 top 0
解决~
其实吧,这个属性很早就被用到了,只不过我最开始写的是缩写transform-origin: 0
,被浏览器解析以后的就是transform-origin: 0 center 0
......当时的感觉就是左右解决了,一直想的都是把iframe移上去,却不知人家自带这样的功能,只不过被我忽略了。学习仍是不能囫囵吞枣啊,一个属性居然能够浪费半天的时间,我大概不是个合格的前端......(逃