Как заставить HTML-div быстро перемещаться вправо (менее 1 секунды) и исчезать?

Я хотел бы, чтобы html div быстро перемещался вправо (например, менее чем на 1 секунду) и исчезал. Затем снова появитесь прямо в том месте, где div был в самом начале этого процесса через 1 секунду. Этот процесс запускается нажатием кнопки и повторяется 10 раз.

Я попытался использовать свойство перехода в CSS для достижения этой цели, но результат - это не то, что я хотел. При перемещении вправо div исчезнет напрямую, а не исчезнет.

Может быть, то, что я хочу сделать, невозможно достичь с помощью CSS? В таком случае что мне использовать?

Код css:

#box1 {
    width: 100px;
    height: 100px;
    background: red;
    -webkit-transition-property: left, right; /* Safari */
    -webkit-transition-duration: 2s; /* Safari */
    transition-property: left, right;
    transition-duration: 2s;
    position:absolute;
    left: 0;
}

#box1:hover {
  transition-delay:1s;
  left: 100px;
  transition-delay:1s;
  opacity:0;
}

Код Javascript:

    var elem = document.getElementById("box1"); 
    $('#b').click(function(){
        var i = 0;
        while (i < 10){

          setTimeout(function(){
            elem.setAttribute("style","left: 1000px;");
          }, 500);
          setTimeout(function(){
            elem.setAttribute("style"," opacity: 0;");
          }, 500);
          i ++;
        }
    })

В CSS это невозможно. Вам придется использовать keyframes, но это также можно сделать в JS, если вы хотите пойти по этому пути. В любом случае, не могли бы вы опубликовать свой код.

zfrisch 05.10.2018 23:27
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
3
1
91
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете добиться этого разными способами:

1-использование перехода и метода jQuery css:

//changing the style of the box using css method of jQuery
var animationDuration = 800;
var animationRepetition = 10;
//this array will be used to clear timeouts if user click while animation still going
var timeoutIds = [];
$("#css_method").click(function() {
  for (var i = 0; i < timeoutIds.length; i++) {
    clearTimeout(timeoutIds[i]);
  }
  timeoutIds = [];
  for (var i = 0; i < animationRepetition; i++) {
    var index = i;
    var id1 = setTimeout(function() {

      $("#box1").addClass("left-opacity-transition").css({
        left: 500,
        opacity: 0
      });
    }, 2 * index * animationDuration)
    var id2 = setTimeout(function() {

      $("#box1").removeClass("left-opacity-transition").css({
        left: 0,
        opacity: 1
      });
    }, ((2 * index) + 1) * animationDuration);
    timeoutIds.push(id1, id2);
  }
});
#box1 {
  width: 100px;
  height: 100px;
  background-color: red;
  position: relative;
  left: 0;
}

button {
  margin-top: 30px;
}

.left-opacity-transition {
  -webkit-transition-property: left, opacity;
  /* Safari */
  -webkit-transition-duration: .8s;
  /* Safari */
  transition-property: left, opacity;
  transition-duration: .8s;
}
<script src = "https://ajax.googleapis.com/ajax/libs/jquery/1.10.0/jquery.min.js"></script>
<div id = "box1"></div>
<button id = "css_method" type='button'>use css method</button>

2-использование анимированного метода jQuery:

//using the animate method of jQuery you can remove the transition from style
var animationDuration = 800;
var animationRepetition = 10;
$("#animate_method").click(function() {
  var $box1 = $("#box1");
  $box1.finish();
  for (var i = 0; i < animationRepetition; i++) {
    $box1.animate({
      left: 500,
      opacity: 0
    }, 800, function() {
      $box1.css({
        left: 0,
        opacity: 1
      });
    });
  }

});
#box1 {
  width: 100px;
  height: 100px;
  background-color: red;
  position: relative;
}

button {
  margin-top: 30px;
}
<script src = "https://ajax.googleapis.com/ajax/libs/jquery/1.10.0/jquery.min.js"></script>
<div id = "box1" class = "fade-in-left"></div>
<button id = "animate_method" type='button'>use animate method</button>

3-использование перевода в классе css:

//using the translateX you also can change the element position in X axis
var animationDuration = 800;
var animationRepetition = 10;
//this array will be used to clear timeouts if user click while animation still going
var timeoutIds = [];
$("#translate_button").click(function() {
  for (var i = 0; i < timeoutIds.length; i++) {
    clearTimeout(timeoutIds[i]);
  }
  timeoutIds = [];
  for (var i = 0; i < animationRepetition; i++) {
    var index = i;
    var id1 = setTimeout(function() {
      $("#box1").addClass("transform-opacity-transition translate-fade-left");
    }, 2 * index * animationDuration);
    var id2 = setTimeout(function() {
      $("#box1").removeClass("transform-opacity-transition translate-fade-left");
    }, ((2 * index) + 1) * animationDuration);
    timeoutIds.push(id1, id2);
  }
});
#box1 {
  width: 100px;
  height: 100px;
  background-color: red;
  position: absolute;
}

button {
  position: absolute;
  top: 150px;
}

.translate-fade-left {
  transform: translateX(500px);
  -webkit-transform: translateX(500px);
  opacity: 0;
}

.transform-opacity-transition {
  -webkit-transition-property: transform, opacity;
  /* Safari */
  -webkit-transition-duration: .8s;
  /* Safari */
  transition-property: transform, opacity;
  transition-duration: .8s;
}
<script src = "https://ajax.googleapis.com/ajax/libs/jquery/1.10.0/jquery.min.js"></script>
<div id = "box1"></div>
<button id = "translate_button" type='button'>use translate</button>

Спасибо за ваш ответ. Но под «повторным появлением» я подразумеваю повторное появление непосредственно в той позиции, в которой исходный элемент div был до начала всего процесса, вместо того, чтобы элемент возвращался в исходную позицию. (Извините, что я не ясно выразился в своем вопросе.) Вы не будете возражать, если вы соответственно обновите свои ответы?

Aqqqq 06.10.2018 07:43

да, конечно, вам просто нужно будет удалить переходы, когда вы вернете элемент в исходное положение, я отредактировал это, и если это все еще не желаемое поведение, просто дайте мне знать, и я постараюсь это исправить. Я рекомендую вам использовать второй подход (2 с использованием метода jQuery для анимации), потому что он совместим с браузером (не требует перехода или преобразования css), а метод анимации более точен по времени, чем setTimeout.

Stakvino 06.10.2018 13:45

Спасибо. Просто предложение: если вам это удобно, вы также можете поместить код из предыдущей версии вашего ответа в jsfiddle и поместить ссылку в свой ответ для справки.

Aqqqq 06.10.2018 15:21

@Aqqqq Спасибо за предложение, я обязательно буду работать с вашим советом, ура.

Stakvino 06.10.2018 22:31

Другие вопросы по теме