代码之家  ›  专栏  ›  技术社区  ›  Mario Vernari

css不透明度转换立即切换到零

  •  0
  • Mario Vernari  · 技术社区  · 7 年前

    我不明白为什么同一个元素上的复合过渡(不透明度和高度)不遵循预期的持续时间。然而,这个问题只在第一次运行时发生,然后开始完美工作。

    更新:

    我找到了一个更苗条的方法来证明这个问题。

    通过单击“开始”按钮,右边的框立即变为透明,并且不会像左边的框一样慢慢褪色。

    $("button").on("click", function() {
      doNative();
      doJQuery();
    });
    
    function doNative() {
      const elem = document.getElementById("bn");
      elem.style.opacity = 0;
      elem.style.height = 0;
      elem.style.transitionDuration = "2s";
      elem.style.transitionProperty = "opacity, height";
    }
    
    function doJQuery() {
      const elem = $("#bj");
      elem.css({
        opacity: 0,
        height: 0,
        "transition-duration": "2s",
        "transition-property": "opacity, height",
      });
    }
    .block {
      width: 200px;
      font-size: 24px;
      font-family: Tahoma;
      display: inline-block;
      margin: 10px;
      border: 1px solid gray;
    }
    
    .initial {
      opacity: 1;
      height: 200px;
    }
    <script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>
    <div>
      <button>start</button>
    </div>
    
    <div>
      <div class="block">
        <div id="bn" class="initial">This box is collapsed using the native transition API</div>
      </div>
      <div class="block">
        <div id="bj" class="initial">This box is collapsed using the jQuery transition API</div>
      </div>
    </div>

    传统内容(不再相关):

    以下是描述上下文的片段:

    items.css({
      opacity: 0,
      height: 0,
      "transition-duration": transitionDuration + "ms",
      "transition-property": "opacity, height"
    });
    

    为了更好地阐明实际和预期的行为,请看这支笔: https://codepen.io/highfield/pen/dKLKKo

    一旦运行,通过按下“隐藏”按钮,“项目”块立即消失,但预期的行为是沿着一定的间隔淡出。 在这个奇怪的初始阶段之后,“show”和“hide”函数的行为完全符合预期。

    我还注意到,通过从“transition property”css字段中删除“height”,不透明度将正确淡出。

    如何解决这个问题?

    2 回复  |  直到 7 年前
        1
  •  0
  •   feeela    7 年前

    在执行任何转换之前,必须在目标元素上设置转换属性。若要使初始动画也工作,应将基本转换定义设置为 #s1 css中的元素。

        2
  •  0
  •   Mario Vernari    7 年前

    最后,我找到了问题所在。

    字段的顺序似乎很重要,但我不明白为什么本地版本工作得很好,即使是随机顺序。通过如下更改jquery版本,转换行为正确:

    function doJQuery() {
      const elem = $("#bj");
      elem.css({
        "transition-duration": "2s",
        "transition-property": "opacity, height",
        opacity: 0,
        height: 0,
      });
    }