Анимация Safari webkit CSS3 не запускается, когда элемент отображается в DOM

#javascript #html #css #safari #css-animations

Вопрос:

Как уже упоминалось в названии, анимация в Safari (15.1) не запускается.

Я создал простую анимацию загрузчика при загрузке файла, для свойства отображения родительского div установлено значение » нет «при загрузке страницы, затем после успешной проверки формы свойство возвращается в значение «блокировать». Эта функция, похоже, работает в каждом браузере, кроме Safari. После отправки формы страница загружается, и если я отменю процесс загрузки в браузере, анимация волшебным образом начнет работать просто отлично.

Итак, мой вопрос: почему анимация не запускается, когда это должно быть?

CSS:

 .load-dots {
    position: relative;
}

.load-dot {
    position: absolute;
    top: -30px;
    width: 20px;
    height: 20px;
    border-radius: 100%;
    background-color: turquoise;
    animation: move-dot 1s ease infinite;
    transform-origin: center center;
}

.load-dot:nth-child(1) {
    left: -60px;
    animation-delay: .1s;
}

.load-dot:nth-child(2) {
    left: -30px;
    animation-delay: .2s;
}

.load-dot:nth-child(3) {
    left: 0px;
    animation-delay: .3s;
}

.load-dot:nth-child(4) {
    left: 30px;
    animation-delay: .4s;
}

.load-dot:nth-child(5) {
    left: 60px;
    animation-delay: .5s;
}

@keyframes move-dot {
    0% {
        transform: translate(0, 0);
        opacity: 1;
        background-color: aqua;
    }

    50% {
        transform: translate(0, 50px) scale(.4);
        opacity: .5;
        background-color: navy;
    }

    100% {
        transform: translate(0, 0);
        opacity: 1;
        background-color: aqua;
    }
}

@-webkit-keyframes move-dot {
    0% {
        -webkit-transform: translate(0, 0);
        opacity: 1;
        background-color: aqua;
    }

    50% {
        -webkit-transform: translate(0, 50px) scale(.4);
        opacity: .5;
        background-color: navy;
    }

    100% {
        -webkit-transform: translate(0, 0);
        opacity: 1;
        background-color: aqua;
    }
}

@-moz-keyframes move-dot {
    0% {
        -moz-transform: translate(0, 0);
        opacity: 1;
        background-color: aqua;
    }

    50% {
        -moz-transform: translate(0, 50px) scale(.4);
        opacity: .5;
        background-color: navy;
    }

    100% {
        -moz-transform: translate(0, 0);
        opacity: 1;
        background-color: aqua;
    }
}
 

HTML:

 <section id="upload-image">
    <form action="/upload" method="POST" enctype="multipart/form-data" class="needs-validation" onclick="validate()"
      novalidate>
      <div class="mx-auto input-group mt-3 px-3 px-md-0" style="max-width: 480px">

        <span class="input-group-text" id="basic-addon1">
          <i class="bi bi-image"></i>
        </span>
        <input id="file-select" type="file" name="file" accept="image/png, image/gif, image/jpeg, image/jpg"
          class="form-control" aria-label="file-upload" aria-describedby="basic-addon1" required />
        <button class="btn btn-upload" type="submit" id="upload-button">Upload</button>
        
        <div class="valid-feedback" id="validation-message">
          Uploading image...
        </div>
      </div>
    </form>

    <div class="load-dots loader-animation mx-auto position-relative">
      <div class="load-dot"></div>
      <div class="load-dot"></div>
      <div class="load-dot"></div>
      <div class="load-dot"></div>
      <div class="load-dot"></div>

    </div>
  </div>
</section>
 

JavaScript:

 <script>
  (function () {
    'use strict'

    const forms = document.querySelectorAll('.needs-validation')

    Array.from(forms)
      .forEach(function (form) {
        form.addEventListener('submit', function (event) {
          if (!form.checkValidity()) {
            event.preventDefault()
            event.stopPropagation()
          } else {
            var loader = document.querySelector(".load-dots");
            loader.style.display = "block";

            document.querySelector("#validation-message").style.display = "block";
            document.body.style.cursor = 'wait'
            document.querySelector("#upload-button").disabled = true
          }

          form.classList.add('was-validated')
        }, false)
      })
  })()
</script>

<script>
  document.addEventListener("DOMContentLoaded", function () {
    document.querySelector("#validation-message").style.display = "none";
    document.querySelector(".load-dots").style.display = "none";
  });
</script>