【问题标题】:How do I get my transitionend event to fire?如何让我的 transitionend 事件触发?
【发布时间】:2021-04-10 16:55:08
【问题描述】:

我正在学习<progress> 元素,并尝试创建一个 CSS 过渡,使其在价值增加时看起来平滑。我想在transitionend 事件触发后执行 JS,但它不会。

我做错了什么?

$("button").on("click", function () {
    $("progress").val(100);
});

$("progress[value]").on(
    "transitionend webkitTransitionEnd oTransitionEnd MSTransitionEnd",
    function () {
        $("progress").val(0);
        alert("Completed");
    }
);
body {
    margin: 0;
    padding: 0;
    text-align: center;
}

button {
    margin: 10px;
    text-transform: uppercase;
    font-size: 1em;
}

.loadPageProgress progress {
    display: block;
    width: 100%;
    height: 5px;
    border: none;
    border-radius: 0;
    background-color: green;
    appearance: none;
    -webkit-appearance: none;
    -moz-appearance: none;
}

.loadPageProgress progress[value] {
    background-color: green;
    transition: all 1000ms ease-in-out;
    -webkit-transition: all 1000ms ease-in-out;
    -moz-transition: all 1000ms ease-in-out;
    -o-transition: all 1000ms ease-in-out;
}

.loadPageProgress progress[value]::-webkit-progress-bar {
    width: 100%;
    height: 5px;
    border: none;
    border-radius: 0;
    background-color: grey;
}

.loadPageProgress progress[value]::-webkit-progress-value {
    background-color: green;
    transition: all 1000ms ease-in-out;
    -webkit-transition: all 1000ms ease-in-out;
    -moz-transition: all 1000ms ease-in-out;
    -o-transition: all 1000ms ease-in-out;
}

.loadPageProgress progress[value]::-moz-progress-bar {
    width: 100%;
    height: 5px;
    border: none;
    border-radius: 0;
    background-color: grey;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="loadPageProgress">
    <progress value="0" max="100"></progress>
</div>

<button>start transition</button>

【问题讨论】:

    标签: javascript html jquery css css-transitions


    【解决方案1】:

    .val(x) 实际上并没有在进度元素上触发转换。它会立即更新。您看到的过渡是在伪元素 ::-webkit-progress-value 上,据我所知,它似乎不可能用 jQuery 来定位,因为它不是 DOM 的一部分。

    如果我从您的伪元素的 CSS 中删除过渡,您会看到这一点。它不再有过渡,只是立即更新进度。

    相反,您可以使用.animate 或类似的东西来更新您的进度并获得完成甚至步骤回调。请参阅代码 sn-p #2 以了解其实现方式。

    片段 1:已删除伪过渡。

    $("button").on("click", function () {
        $("progress").val(100);
    });
    
    $("progress[value]").on(
        "transitionend webkitTransitionEnd oTransitionEnd MSTransitionEnd",
        function () {
            $("progress").val(0);
            alert("Completed");
        }
    );
    body {
        margin: 0;
        padding: 0;
        text-align: center;
    }
    
    button {
        margin: 10px;
        text-transform: uppercase;
        font-size: 1em;
    }
    
    .loadPageProgress progress {
        display: block;
        width: 100%;
        height: 5px;
        border: none;
        border-radius: 0;
        background-color: green;
        appearance: none;
        -webkit-appearance: none;
        -moz-appearance: none;
    }
    
    .loadPageProgress progress[value] {
        background-color: green;
        transition: all 1000ms ease-in-out;
        -webkit-transition: all 1000ms ease-in-out;
        -moz-transition: all 1000ms ease-in-out;
        -o-transition: all 1000ms ease-in-out;
    }
    
    .loadPageProgress progress[value]::-webkit-progress-bar {
        width: 100%;
        height: 5px;
        border: none;
        border-radius: 0;
        background-color: grey;
    }
    
    .loadPageProgress progress[value]::-webkit-progress-value {
        background-color: green;
    }
    
    .loadPageProgress progress[value]::-moz-progress-bar {
        width: 100%;
        height: 5px;
        border: none;
        border-radius: 0;
        background-color: grey;
    }
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
    <div class="loadPageProgress">
        <progress value="0" max="100"></progress>
    </div>
    
    <button>start transition</button>

    片段 2:动画

    $("button").on("click", function () {
        $("progress").animate({value:100},{
          duration:2000,
          step: function(x){
            
          },
          complete: function(){
            console.log("Done!");
          }
        });
    });
    body {
        margin: 0;
        padding: 0;
        text-align: center;
    }
    
    button {
        margin: 10px;
        text-transform: uppercase;
        font-size: 1em;
    }
    
    .loadPageProgress progress {
        display: block;
        width: 100%;
        height: 5px;
        border: none;
        border-radius: 0;
        background-color: green;
        appearance: none;
        -webkit-appearance: none;
        -moz-appearance: none;
    }
    
    .loadPageProgress progress[value] {
        background-color: green;
        transition: all 1000ms ease-in-out;
        -webkit-transition: all 1000ms ease-in-out;
        -moz-transition: all 1000ms ease-in-out;
        -o-transition: all 1000ms ease-in-out;
    }
    
    .loadPageProgress progress[value]::-webkit-progress-bar {
        width: 100%;
        height: 5px;
        border: none;
        border-radius: 0;
        background-color: grey;
    }
    
    .loadPageProgress progress[value]::-webkit-progress-value {
        background-color: green;
    }
    
    .loadPageProgress progress[value]::-moz-progress-bar {
        width: 100%;
        height: 5px;
        border: none;
        border-radius: 0;
        background-color: grey;
    }
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
    <div class="loadPageProgress">
        <progress value="0" max="100"></progress>
    </div>
    
    <button>start transition</button>

    【讨论】:

      猜你喜欢
      • 2013-09-12
      • 2013-06-23
      • 2016-11-08
      • 1970-01-01
      • 1970-01-01
      • 2015-12-04
      • 1970-01-01
      • 2012-09-13
      • 2014-09-07
      相关资源
      最近更新 更多