javascript - 使用 jQuery 显示的元素上的 CSS 转换问题

标签 javascript jquery css

我有一个简单的切换加号,应该会触发一个 div 出现并旋转成一个 X,然后可以单击它来关闭 div。

一切都按计划进行,除了加号的旋转没有平滑过渡,它看起来已经旋转了。

如果我从 #showbox div 中删除 display:none 并删除 $("#showbox").show(),动画/过渡作品。只有当 div 被隐藏然后用 .show() 显示时,它才会旋转而没有动画。

我确定我能想到一个解决方法,我只是想知道是否有人可以解释为什么会发生这种情况

$("#togglebox").click(function() {
  $("#showbox").show();
  $("#showbox .toggleplus").toggleClass("togglex");
});
#showbox {
  background: #000;
  width: 500px;
  height: 200px;
  display: none;
}

.toggleplus {
  width: 30px;
  height: 30px;
  transition: all .5s;
  color:#111;
}

#showbox .toggleplus {
color:#FFF;
}

.togglex {
  transform: rotate(-46deg);
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="togglebox">
  <p>LEARN MORE</p>
  <div class="toggleplus">+</div>
</div>

<div id="showbox">
  <div class="toggleplus">+</div>
  <p>Blah Blah Blah</p>
</div>

最佳答案

问题是 UI 在与 JavaScript 执行的线程不同的线程中更新,并且 UI 线程的执行速度比 JS 快。

您可以通过添加一个短暂的延迟来解决这个问题,这会强制 UI 在函数完成之前不更新。

$("#togglebox").click(function(){
        $("#showbox").show();
        setTimeout(function(){
          $("#showbox .toggleplus").toggleClass("togglex");
        },20);
    });
#showbox {
    	background:#fff;
    	width:500px;
      height:200px;
    	display:none;
    }
    
    .toggleplus {
    	float:right;
    	width:30px;
    	height:30px;
    	transition:all .5s;
    }
    
    .togglex {
    	transform: rotate(-46deg);
    }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>


    <div id="togglebox">
        <p>LEARN MORE</p>
        <div class="toggleplus"></div>
    </div>
    	
    <div id="showbox">
        <div class="toggleplus">+</div>
        <p>Blah Blah Blah</p>
    </div>

使用 JQuery 实现此目的的另一种方法是将旋转类代码添加为 show() 的回调。 方法:

$("#togglebox").click(function(){
        // Passing a function to the show method sets it up as a callback to
        // be executed after the show() animation is complete.
        $("#showbox").show(function(){
          $("#showbox .toggleplus").toggleClass("togglex");
        });
    });
#showbox {
    	background:#fff;
    	width:500px;
      height:200px;
    	display:none;
    }
    
    .toggleplus {
    	float:right;
    	width:30px;
    	height:30px;
    	transition:all .5s;
    }
    
    .togglex {
    	transform: rotate(-46deg);
    }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>


    <div id="togglebox">
        <p>LEARN MORE</p>
        <div class="toggleplus"></div>
    </div>
    	
    <div id="showbox">
        <div class="toggleplus">+</div>
        <p>Blah Blah Blah</p>
    </div>

关于javascript - 使用 jQuery 显示的元素上的 CSS 转换问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45246548/

相关文章:

php - 如何将 javascript 变量传递给 PHP

javascript - 插件和 jQuery animate() 中的 "this"关键字存在问题

javascript - 如何比较 Angular 元素与 jQuery 元素

javascript - 如何使用 jquery 查找单词匹配项?

css - 如何垂直对齐内联图像及其后的内联文本?

javascript - 如何从使用 jQuery 单击的链接中获取耦合级别以上的元素文本?

javascript - 如何引用在 javascript for 语句中定义的对象?

javascript - 点击下拉列表

javascript - 导航 : Sub menu should display when hovered? - 不工作

javascript - 通过 html 调用 js 函数导致错误