关于当元素设置transform-style: preserve-3d后,某些苹果手机rotateY属性设置会不显示问题

477 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第28天,点击查看活动详情

问题来源

最近在写一个需求,某个图片需要旋转一定的角度做展示,想到了css中的transform属性。如下图

image.png 我需要这个背景图绕Y轴旋转一定的角度,与墙面贴合,那么应该怎么做呢?这里肯定要想要3d变换了。

需求实现

前期先查阅了关于3d变换的相关知识点如下。

父元素样式

  • 3D变换需要父元素设置样式才能保留3d的变化效果

  • 保留3D变换:transform-style: preserve-3d,默认值为flat表示不保留3D变换

  • 设置视角深度:perspective: 1000px

    • 观察点位置:perspective-origin

      • 默认值为:perspective-origin: center center;
      • 第一个代表x轴上的位置,第二个值代表y轴上的位置
      • 取值可以为:关键字、长度值,百分比值(相对于当前元素的宽或高),可以为负值
      • 可以设置的关键字:top bottom center left right
      • 上面关键字的顺序无关,浏览器会自动调整
      • top == 0% bottom == 100% center == 50% left == 0% right == 100%
      • 设置的偏移值都是从元素左上角开始的

位移:translate3d translateX translateY translateZ

  • translate3d(x, y, z):必须传递三个参数
  • translateX(x) translateY(y) translateZ(z)
  • 参数单位为px
  • x值:为正则沿着x轴向右位移,为负则沿着x轴向右位移
  • y值:为正则沿着y轴向下位移,为负则沿着y轴向上位移
  • z值:为正则沿着z轴向屏幕外位移,为负则沿着z轴向屏幕内位移

旋转:rotate3d rotateX rotateY rotateZ

  • rotate3d(x, y, z, angle):沿着x,y,z三个方向矢量值确定的坐标点旋转angle角度(比较少用)
    x,y,z为三个方向的矢量值,无单位

  • rotateX(angle) rotateY(angle) rotateZ(angle) 沿着元素中心点穿过的(X/Y/Z)轴旋angle角度

  • 参数angle单位为deg

  • angle值:为正则为顺时针旋转,为负则为逆时针旋转

  • 可以通过transform-origin: left来设置比如绕着元素的左边框旋转

  • backface-visibility 属性定义当元素旋转到背面向屏幕时是否可见

    • visible 背面可见
    • hidden 背面不可见

缩放:scale3d scaleX scaleY scaleZ

  • scale3d(num, num, num):必须传递三个参数
  • scaleX(x) scaleY(y) scaleZ(z),分别代表x和y轴和z轴方向缩放相应的倍数
  • 参数为数字,无单位
  • scaleZ(z)是难点,指的z轴方向上的纵深,并不会在z轴方向加厚元素,需要在父元素设置,然后观察子元素位移距离的增加

对于这里我们应该实现transform属性即可,如下

	.v-parent {
		position: absolute;
		left: 2400rpx;
		top: 526rpx;
		transform-style: preserve-3d;//保留3D变换
		perspective: 1000;

		.v-child {
			position: relative;
			// transform: rotate3d(0, 0.5, 0, -60deg);
			transform: rotateY(-60deg);
			display: flex;
			justify-content: center;
			align-items: center;
			width: 650rpx;
			height: 334rpx;
			background-image: url(~@/static/bg-room-right.png);
			background-repeat: no-repeat;
			background-size: cover;
			.img-src {
				width: 632rpx;
				height: 316rpx;
			}
		}

image.png

这样就可以达到效果,可以看到饶Y轴旋转了一定的角度,但是当用苹果真机测试的时候,发现不显示了,旋转后元素不见了。

解决问题

经查验测试需要在父元素在设置一层属性

transform-style: flat;/* 让子盒子位于此元素所在的平面内(子盒子被扁平化) 默认值为flat表示不保留3D变换*/

这样就可以在3d变换后,在保留回扁平化平面,保持同一个平面显示,因此可以正常显示了,之前我感觉如果没有设置这个,那么旋转后可能到父元素的背面去了,因此看不到了。

总结

css3的这个transform属性可能还是多少存在一些兼容性问题,开发过程就是得不断试验,查阅资料,一定能解决问题。