首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在CSS转换上获取jank

在CSS转换上获取jank
EN

Stack Overflow用户
提问于 2018-12-31 23:53:51
回答 4查看 478关注 0票数 1

使用以下CSS,我正在准备我的片段消息,以便在视口中滑动:

代码语言:javascript
复制
.Segment {
    position: absolute;
    width: 100%;
    overflow: hidden;
    top: -5px;
    top: 0;
    outline: 1px solid orange;
}

.Segment__message {
  display: inline-block;
  margin-top: 15px;
  left: 100%;
  transform: translateX(0);
  position: relative;
  padding-left: 10px;
  will-change: transform;
  font-size: 30px;
}

如果我动态地应用以下样式,我会遇到一些非常轻微的问题:

代码语言:javascript
复制
var message = document.querySelector(".Segment__message");
message.style = "transition: all 20s linear; transform: translateX(calc(-100vw - 100%))"

这是相当微妙的,但更明显的是在75英寸的屏幕上将显示这一点。

使用Chrome的性能工具,我可以看到一些FPS下降,一度下降到8FPS。我能做些什么来进一步解决这个问题吗?

https://codepen.io/anon/pen/OrOvdP

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2019-01-03 05:17:53

我从.Segment__message中删除了position属性,并仅使用transform定位它。

我还使用了translate3d,它可以强制硬件加速,并在过去为我提高了动画性能。

我在Firefox、Chrome或Safari中看不到jank,代码如下。

代码语言:javascript
复制
var link = document.querySelector(".slide");
var message = document.querySelector(".Segment__message");

var styleStr = `transition: all 10s linear; transform: translate3d(-100%, 0, 0)`;

link.onclick = () => {
  message.style = styleStr;
}
代码语言:javascript
复制
.Segment {
  position: absolute;
  width: 100%;
  overflow: hidden;
  top: 0;
  outline: 1px solid orange;
}

.Segment__message {
  display: inline-block;
  margin-top: 15px;
  transform: translate3d(100vw, 0, 0);
  padding-left: 10px;
  will-change: transform;
  font-size: 30px;
}

.Segment__message::after {
  content: "/";
  color: blue;
  display: block;
  float: right;
  padding-left: 15px;
}

.slide {
  display: block;
  margin-top: 50px;
}
代码语言:javascript
复制
<div class="Segment">
  <div class="Segment__message">I am a message</div>
</div>

<a class="slide" href="#">Slide left</a>

票数 4
EN

Stack Overflow用户

发布于 2019-01-03 05:36:39

您可以进行一些增强,以确保您的消息将被绘制在一个新的、独立的层上,如:

代码语言:javascript
复制
.Segment {
    // ...
    perspective: 600px;
    z-index:2;
}
.Segment__message {
    // ...
    z-index:3;
    will-change: transform;
    transform-style: preserve-3d;
    font-size: 30px;
}

但是有一个小技巧,你可以和will-change属性一起做,如果你要应用一些非常小的延迟(如0.1s),你的动画将在它触发之前被预先渲染,因此应该更平滑:

代码语言:javascript
复制
message.style = "transition: all 10s linear .1s; transform: translateX(calc(-100vw - 100%))"
票数 1
EN

Stack Overflow用户

发布于 2019-01-01 00:30:15

在第一个视图中,它可能是带有vw和%的calc()部分。这种混合有时会在我的项目中造成麻烦,因为你得到的是非整数,浏览器会自动四舍五入。所以我把你的codepen里的100%改成了100vw。结果是一个流畅得多的动画-至少在Chrome中是这样。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53989222

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档