我有一个奇怪的问题,只有在Safari(奇怪?LOL)。不管你使用的是iPhone、iPad还是桌面Mac;Safari使一个错误的计算定位标志,使用动画关键帧和变换
问题是徽标需要移动到他的房间,但在safari中,徽标也在左侧,当关键帧达到100%时,徽标完美地适合他的房间。
你可以在:https://amonarraiz.com上看到奇怪的效果(在Safari上访问与在其他浏览器上访问不同,代码是相同的)
下面是我的代码:.intro-wrapper {
position: fixed;
width: 100%;
height: 100%;
top: 0;
left: 0;
}
.intro-logo {
background: url(https://amonarraiz.com/css/img/slider/2.png) center center no-repeat;
background-size: cover;
width: 50rem;
height: 41rem;
position: absolute;
left: 50%;
top: 50%;
-ms-transform: translate(-86%, -52%);
-webkit-transform: translate(-86%, -52%);
transform: translate(-86%, -52%);
opacity: 0;
cursor: pointer;
}
.intro-in {
-moz-animation-duration: 3.75s;
-webkit-animation-duration: 3.75s;
animation-duration: 3.75s;
-moz-animation-name: intro-in;
-webkit-animation-name: intro-in;
animation-name: intro-in;
-moz-animation-iteration-count: 1;
-webkit-animation-iteration-count: 1;
animation-iteration-count: 1;
-moz-animation-fill-mode: forwards;
-webkit-animation-fill-mode: forwards;
animation-fill-mode: forwards;
-webkit-animation-timing-function: ease-in-out;
-moz-animation-timing-function: ease-in-out;
animation-timing-function: ease-in-out;
}
@-moz-keyframes intro-in {
0% {
opacity: 0.6;
width: 50rem;
height: 41rem;
-ms-transform: translate(-50%, -50%);
-webkit-transform: translate(-50%, -50%);
transform: translate(-50%, -50%);
}
30% {
opacity: 1;
width: 50rem;
height: 41rem;
-ms-transform: translate(-50%, -50%);
-webkit-transform: translate(-50%, -50%);
transform: translate(-50%, -50%);
}
100% {
opacity: 1;
width: 25.6rem;
height: 19.5rem;
-ms-transform: translate(-106%, -46%);
-webkit-transform: translate(-106%, -46%);
transform: translate(-106%, -46%);
}
}
@-webkit-keyframes intro-in {
0% {
opacity: 0.6;
width: 50rem;
height: 41rem;
-ms-transform: translate(-50%, -50%);
-webkit-transform: translate(-50%, -50%);
transform: translate(-50%, -50%);
}
30% {
opacity: 1;
width: 50rem;
height: 41rem;
-ms-transform: translate(-50%, -50%);
-webkit-transform: translate(-50%, -50%);
transform: translate(-50%, -50%);
}
100% {
opacity: 1;
width: 25.6rem;
height: 19.5rem;
-ms-transform: translate(-106%, -46%);
-webkit-transform: translate(-106%, -46%);
transform: translate(-106%, -46%);
}
}
@keyframes intro-in {
0% {
opacity: 0.6;
width: 50rem;
height: 41rem;
-ms-transform: translate(-50%, -50%);
-webkit-transform: translate(-50%, -50%);
transform: translate(-50%, -50%);
}
30% {
opacity: 1;
width: 50rem;
height: 41rem;
-ms-transform: translate(-50%, -50%);
-webkit-transform: translate(-50%, -50%);
transform: translate(-50%, -50%);
}
100% {
opacity: 1;
width: 25.6rem;
height: 19.5rem;
-ms-transform: translate(-106%, -46%);
-webkit-transform: translate(-106%, -46%);
transform: translate(-106%, -46%);
}
}
<div class="intro-wrapper">
<div class="intro-logo intro-in"></div>
</div>
我不知道这里有什么问题。所有浏览器都可以完美地渲染它(包括Google Chrome的模拟器),但是Safari (iOS/Mac)无法在动画运行时以正确的方式渲染它(当动画结束时,徽标坐在他的房间里)。
如果您需要更多的细节,请告诉我,我会尽快补充。
谢谢。
编辑
我将添加赏金,因为这没有足够的关注
使用带有百分比值的translate
,它根据元素的宽度和高度计算元素的位置。但是宽度和高度也随着动画的变化而变化。在我看来,这可能是一个Safari的错误,它根据初始宽度和高度计算翻译。
您有两种变通方法可供选择。变换时使用scale
或使用混凝土单位表示距离。如果你想使用比例,你必须改变一些数字,我不确定它到底是如何工作的。
如果你在动画中使用rem
而不是百分比,它可以工作:
.intro-wrapper {
position: fixed;
width: 100%;
height: 100%;
top: 0;
left: 0;
}
.intro-logo {
background: url(https://amonarraiz.com/css/img/slider/2.png) center center no-repeat;
background-size: cover;
width: 50rem;
height: 41rem;
position: absolute;
left: 50%;
top: 50%;
opacity: 0;
cursor: pointer;
}
.intro-in {
-moz-animation-duration: 3.75s;
-webkit-animation-duration: 3.75s;
animation-duration: 3.75s;
-moz-animation-name: intro-in;
-webkit-animation-name: intro-in;
animation-name: intro-in;
-moz-animation-iteration-count: 1;
-webkit-animation-iteration-count: 1;
animation-iteration-count: 1;
-moz-animation-fill-mode: forwards;
-webkit-animation-fill-mode: forwards;
animation-fill-mode: forwards;
-webkit-animation-timing-function: ease-in-out;
-moz-animation-timing-function: ease-in-out;
animation-timing-function: ease-in-out;
}
@-moz-keyframes intro-in {
0% {
opacity: 0.6;
width: 50rem;
height: 41rem;
-ms-transform: translate(-25rem, -21.5rem);
-webkit-transform: translate(-25rem, -21.5rem);
transform: translate(-25rem, -21.5rem);
}
30% {
opacity: 1;
width: 50rem;
height: 41rem;
-ms-transform: translate(-25rem, -21.5rem);
-webkit-transform: translate(-25rem, -21.5rem);
transform: translate(-25rem, -21.5rem);
}
100% {
opacity: 1;
width: 25.6rem;
height: 19.5rem;
-ms-transform: translate(-27.136rem, -8.97rem);
-webkit-transform: translate(-27.136rem, -8.97rem);
transform: translate(-27.136rem, -8.97rem);
}
}
@-webkit-keyframes intro-in {
0% {
opacity: 0.6;
width: 50rem;
height: 41rem;
-ms-transform: translate(-25rem, -21.5rem);
-webkit-transform: translate(-25rem, -21.5rem);
transform: translate(-25rem, -21.5rem);
}
30% {
opacity: 1;
width: 50rem;
height: 41rem;
-ms-transform: translate(-25rem, -21.5rem);
-webkit-transform: translate(-25rem, -21.5rem);
transform: translate(-25rem, -21.5rem);
}
100% {
opacity: 1;
width: 25.6rem;
height: 19.5rem;
-ms-transform: translate(-27.136rem, -8.97rem);
-webkit-transform: translate(-27.136rem, -8.97rem);
transform: translate(-27.136rem, -8.97rem);
}
}
@keyframes intro-in {
0% {
opacity: 0.6;
width: 50rem;
height: 41rem;
-ms-transform: translate(-25rem, -21.5rem);
-webkit-transform: translate(-25rem, -21.5rem);
transform: translate(-25rem, -21.5rem);
}
30% {
opacity: 1;
width: 50rem;
height: 41rem;
-ms-transform: translate(-25rem, -21.5rem);
-webkit-transform: translate(-25rem, -21.5rem);
transform: translate(-25rem, -21.5rem);
}
100% {
opacity: 1;
width: 25.6rem;
height: 19.5rem;
-ms-transform: translate(-27.136rem, -8.97rem);
-webkit-transform: translate(-27.136rem, -8.97rem);
transform: translate(-27.136rem, -8.97rem);
}
}
<div class="intro-wrapper">
<div class="intro-logo intro-in"></div>
</div>