首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >正在尝试使用transitionend event而不是setTimeout

正在尝试使用transitionend event而不是setTimeout
EN

Stack Overflow用户
提问于 2017-06-04 03:21:50
回答 1查看 611关注 0票数 2

我有这样的代码:

代码语言:javascript
复制
$("#disable").click(function () {
     $("body").append("<div id='blackDisable' class='fade'> </div>");
    setTimeout(function () {
        $("#blackDisable").addClass("showBack");
    }, 150);
});
代码语言:javascript
复制
.fade {
    opacity: 0;
    transition: opacity .15s linear;
}
        
.showBack {
    opacity: .5;
}

#blackDisable {
    position: fixed;
    top: 0;
    bottom: 0;
    left: 0;
    right: 0;
    z-index: 2222;
    background-color: black;
}
代码语言:javascript
复制
<button id="disable">Click Me</button>
<script src="https://code.jquery.com/jquery-3.2.1.min.js" integrity="sha256-hwg4gsxgFZhOsEEamdOYGBf13FyQuiTwlAQgxVSNgt4=" crossorigin="anonymous"></script>

我不想使用setTimeout来强制转换工作,所以我搜索了一个解决方案,找到了transitionend事件,并用transitionend事件处理程序替换了setTimeout,但它没有触发。

如何删除此setTimeout并使用transitionend事件?

提前感谢并为我的英语道歉!

EN

回答 1

Stack Overflow用户

发布于 2017-06-04 03:48:18

transitionend与您的问题有任何关系-因为没有注册任何end的转换。

这是一个立即将类分配给新创建的(还不是DOM样式可发现的)元素的问题- without a callback - setTimeout实际上就像一个“DOM就绪的黑客”。

没有setTimeout?有两种方式(甚至更多):

1. animation (代替transition)

代码语言:javascript
复制
$("#disable").click(function() {

  $("body").append("<div id='blackDisable' class='fade'></div>");
  $("#blackDisable").addClass("showBack");
  
});
代码语言:javascript
复制
.fade {
  opacity: 0;
  /* no transition */
}

.showBack {
  /*opacity: .5; not ready, instead let the browser assign/trigger keyframes */
  animation : fadeIn 0.3s linear forwards;
}

#blackDisable {
  position: fixed;
  top: 0;
  bottom: 0;
  left: 0;
  right: 0;
  z-index: 2222;
  background-color: black;
}

@keyframes fadeIn {
  to { opacity: 0.5; }
}
代码语言:javascript
复制
<button id="disable">Click Me</button>
<script src="https://code.jquery.com/jquery-3.2.1.min.js" integrity="sha256-hwg4gsxgFZhOsEEamdOYGBf13FyQuiTwlAQgxVSNgt4=" crossorigin="anonymous"></script>

2.在任何事件之前追加

并使用CSS visibility来防止重叠问题。

代码语言:javascript
复制
// Append on DOM ready
$("body").append("<div id='blackDisable' class='fade'></div>");

// CALLBACK
$("#disable").click(function() {
  // Since the callback, it's now discoverable,
  // DOM set, CSS styles are set and we can transition! 
  $("#blackDisable").addClass("showBack");

});
代码语言:javascript
复制
.fade {
  opacity: 0;
  visibility: hidden; /* you need this!!!!!! */
  transition: opacity .3s linear;
}

.showBack {
  opacity: .5;
  visibility: visible; /* and this!!!!!! */
}

#blackDisable {
  position: fixed;
  top: 0;
  bottom: 0;
  left: 0;
  right: 0;
  z-index: 2222;
  background-color: black;
}
代码语言:javascript
复制
<button id="disable">Click Me</button>
<script src="https://code.jquery.com/jquery-3.2.1.min.js" integrity="sha256-hwg4gsxgFZhOsEEamdOYGBf13FyQuiTwlAQgxVSNgt4=" crossorigin="anonymous"></script>

3.队列

代码语言:javascript
复制
$("#disable").click(function() {

  $("body").append("<div id='blackDisable' class='fade'></div>");
  
  // Instead of setTimeout but again mimicking a callback
  $("#blackDisable").delay().queue(function(){
    $(this).addClass("showBack");
  });
  
});
代码语言:javascript
复制
.fade {
  opacity: 0;
  transition: opacity .3s linear;
}

.showBack {
  opacity: .5;
}

#blackDisable {
  position: fixed;
  top: 0;
  bottom: 0;
  left: 0;
  right: 0;
  z-index: 2222;
  background-color: black;
}
代码语言:javascript
复制
<button id="disable">Click Me</button>
<script src="https://code.jquery.com/jquery-3.2.1.min.js" integrity="sha256-hwg4gsxgFZhOsEEamdOYGBf13FyQuiTwlAQgxVSNgt4=" crossorigin="anonymous"></script>

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

https://stackoverflow.com/questions/44347745

复制
相关文章

相似问题

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