Safari浏览器中的CSS变换+宽度+左+顶部过渡跳转

时间:2019-06-07 20:00:51

标签: css sass cross-browser css-transitions transition

我使用以下代码实现了过渡:

h1 {
position: absolute;
z-index: 2;
line-height: 1;
font-size: 8em;
transition: all 10s;
pointer-events: none;
font-weight: 600;
width: 800px;
font-family: 'Crimson Text', serif;
margin: 0;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);

&.top-left {
  top: 0%;
  left: 0%;
  transform: translate(0%, 0%);
  width: 300px;
  font-size: 3em;
}

它在Safari上无法按需运行。我尝试做缩放动画,但效果相同。 知道如何解决这个问题吗?

Chrome: http://www.giphy.com/gifs/VzkdenswxQA29t6sNH

Safari: http://www.giphy.com/gifs/QW9RGCPQoqkFeRWLu7

1 个答案:

答案 0 :(得分:1)

问题是您正在导致属性转换,迫使浏览器计算布局更改(widthfont-size)。

问题的原因与浏览器计算在屏幕上呈现的内容的顺序有关。通常按此顺序:

  1. 样式(要应用的内容-CSS特异性)
  2. 布局(宽度/高度,字体大小,边距/填充,显示)
  3. 绘画(颜色,边框,背景,阴影等)
  4. 复合(位置,比例,不透明度等)

动画#3和#4非常有效。其他的东西不是很多,所以最好尝试避免这些。


您可以采取许多措施来全面提高性能

首先强制计算机使用其GPU进行渲染。最简单的方法是使用3d transform

h1 {
transform: translate3d(-50%, -50%, 0);
}

&.top-left {
  transform: translate(0, 0, 0);
}

下一步,让我们tell the browser弄乱这个元素,以便可以提高效率。

h1 {
 will-change: transform;
}

最后,我们需要重新考虑transform本身,以避免更改布局。 通过删除font-sizewidth属性并替换为transform: scale来实现。在理想的情况下,我们将删除顶部/左侧位置之间的过渡,但在这里可能还可以。< / p>

h1 {
   position: absolute;
   z-index: 2;
   line-height: 1;
   font-size: 8em;
   transition: all 10s;
   pointer-events: none;
   font-weight: 600;
   /* width: 800px; */
   font-family: 'Crimson Text', serif;
   margin: 0;
   top: 50%;
   left: 50%;
   transform: translate(-50%, -50%, 0) scale(1);
   will-change: transform;
}
&.top-left {
  top: 0%;
  left: 0%;
  transform: translate(0, 0, 0) scale(0.25);
  /* width: 300px; */
  /* font-size: 3em; */
}