javascript - Mounted 中的类更改不触发转换 vuejs

标签 javascript css animation vue.js css-transitions

当我尝试将类添加到挂载生命周期中的元素时,过渡效果不起作用。该元素立即作为最终状态出现:

但是,如果我使用 setTimeout 来延迟类更改,转换将起作用。

new Vue({
  el: '#example-1',
  mounted: function () { 
     // setTimeout(function () {
      let test = document.getElementsByClassName('test')[0]
      test.classList.add('loaded')
     // }, 0) 
  }
})
.test {
  color:red;
  font-size:60px;
  transform:none;
  transition: all 1s linear;
}

.test.loaded {
  transform: translateX(400px)
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.13/vue.js"></script>


<div id="example-1">
  <h1 class='test'>
    fa
  </h1>
</div>

我理解为什么在 vanilla js 中会发生这种情况:转换需要从一种呈现状态发生到另一种呈现状态。延迟是为了让初始元素首先呈现。( Refer to this SO post )

然而在Vue中,我认为Mounted已经意味着初始 View 已经被渲染了。所以已经有一个初始渲染状态。

从这个例子看来,情况并非如此。

所以 mounted !== 被渲染了吗?

最佳答案

如果在将元素添加到 DOM 之后立即添加类,浏览器将无法触发 CSS 转换,因为当浏览器检查转换时,它还会检查之前应用的转换,结果是无,因此它会跳过过渡。这就是为什么您需要一些 setTimeoutrequestAnimationFrame 来使其工作的原因。 这是一个没有 Vue 的演示 🙂

const a = document.createElement('div')
a.textContent = 'fa'
a.classList.add('test')
document.body.appendChild(a)
a.classList.add('loaded')

关于javascript - Mounted 中的类更改不触发转换 vuejs,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48658868/

相关文章:

javascript - 具有更新功能的 knockout 自定义选择 Binder

javascript - 不支持 ES6 扩展语法 IE

javascript - AJAX 没有设置 PHP $_POST 变量,所以它返回 'Undefined'

html - CSS Animation 正在 Google Chrome 中创建动画效果

javascript - 局部变量到全局javascript

javascript - 等待函数结束

html - 帮助在 MVC3 中使用 CSS id/class id

html - bool 玛导航栏菜单在移动设备上默认打开

java - (Java)尝试使用(工作)动画类对硬币数组列表进行动画处理

android - 低至 android api 8 支持的值动画