Форум программистов, компьютерный форум, киберфорум
JavaScript для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.68/25: Рейтинг темы: голосов - 25, средняя оценка - 4.68
Эксперт JS
2037 / 1096 / 409
Регистрация: 29.04.2016
Сообщений: 2,625

Как остановить анимацию отдельного блока

22.08.2018, 18:10. Показов 5181. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем добрый вечер.
Перейдя в песочницу вы увидите анимацию двух блоков (если посмотреть что и как там работает то станет понятно о чем я говорю).

Там есть три кнопки: "Остановить 1", "Остановить 2", "Остановить все".
Из этих кнопок работает только "Остановить все".

Пробовал из переменной interval сделать объект: в зависимости от кол-ва блоков (в цикле) создается interval[0] и interval[1] --- но тогда скорость анимации умножается на кол-во итераций (что логично) и это неприемлимо.

Остановить "все" я могу, меня интересует именно "как остановить каждый из блоков по отдельности".
Как правильно запустить requestAnimationFrame(), или сделать что-то иначе, что бы можно было остановить каждый блок по отдельности?

Надеюсь понятно изложил суть проблемы. Если вдруг я что-то изложил непонятно или коряво- спрашивайте, буду признателен за любую, даже мелочную, помощь. Спасибо.
HTML5
1
2
3
4
5
6
7
8
9
10
<div class="workSpace">
    <div class="box" id="boxOne">1</div>
    <div class="box" id="boxTwo">2</div>
 
    <div class="buttons">
        <div class="button" id="stopOne">"Остановить 1" НЕ работает</div>
        <div class="button" id="stopTwo">"Остановить 2" НЕ работает</div>
        <div class="button" id="stopAll">"Остановить все" работает</div>
    </div>
</div>
-------------------------------------------------------------------------------------------------
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
var coord = 0, interval;
var box = document.querySelectorAll('.box');
 
moveRight();
 
function moveRight(){
    interval = requestAnimationFrame(moveRight);
    coord += 1;
 
    for(i=0; i<box.length; i++){
        box[i].style.left = coord + 'px';
    }
}
 
document.querySelector('#stopAll').onclick = ()=> {
    cancelAnimationFrame(interval);
}
 
document.querySelector('#stopOne').onclick = ()=> {
    // как их можно остановить по отдельности
}
 
document.querySelector('#stopTwo').onclick = ()=> {
    // как их можно остановить по отдельности
}
-------------------------------------------------------------------------------------------------
CSS
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
html, body{
    margin: 0px 0px 0px 0px;
    width:  100%;
    height:  100%;
    overflow:  hidden;
}
 
.workSpace{
    width: 100%;
    height: 100%;
    background: #eee5ff;
    font-family: comic sans ms;
    overflow:  hidden;
}
 
.buttons{
    position:  relative;
    top: 250px;
}
 
.button{
    margin-left: 10px;
    padding: 10px 10px 10px 10px;
    cursor: pointer;
    letter-spacing: 1px;
    border: 2px solid #eee5ff;
    border-radius: 7px;
    color:  #fff;
    display: inline-block;
    text-align: center;
}
.button:hover{
    /* background: #eee5ff; */
    border: 2px solid #000000;
}
 
.box{
    text-align:  center;
    color: #fff;
}
 
#boxOne{
    width: 50px;
    height: 50px;
    font-size: 33px;
    overflow: hidden;
    position: absolute;
    background: #795548;
    left: 180px;
    top: 20px;
}
 
#boxTwo{
    width: 100px;
    height: 100px;
    font-size: 67px;
    overflow:  hidden;
    position: absolute;
    background: #009688;
    left: 180px;
    top: 90px;
}
 
#stopOne{
    width: 140px;
    background: #795548;
}
 
#stopTwo{
    width: 140px;
    background: #009688;
}
 
#stopAll{
    width: 150px;
    background: linear-gradient(to top left, #009688, #795548);
}
 
#stopOne:active{
    background: red;
}
#stopTwo:active{
    background: red;
}
#stopAll:active{
    background: #00af00;
}
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
22.08.2018, 18:10
Ответы с готовыми решениями:

Как остановить анимацию
Доброго времени суток. Есть две анимации которые работают по очереди, необходимо через определённое количество циклов остановить этот...

Как остановить анимацию
Делаю так анимацию: public void anitation_wait(){ ImageSourceConverter converter = new ImageSourceConverter(); ...

Как остановить анимацию
Как остановить анимацию в коде из другого контрола? ThicknessAnimation TA3 = new ThicknessAnimation(); TA3.From =...

3
Эксперт JSЭксперт HTML/CSS
2151 / 1496 / 651
Регистрация: 16.04.2016
Сообщений: 3,696
22.08.2018, 19:13
Лучший ответ Сообщение было отмечено zlojnaxa как решение

Решение

zlojnaxa, приветствую
Напишите ф-ю с принимаемым в качестве параметра селектором. Используйте отдельно для каждого свой таймер. Это как вариант.

Но лучше две ф-ии отрисовки для каждого из объектов, не забудьте обработать ситуацию, чтобы функцию невозможно было отработать и анимации не будет. Тогда и таймер будет только один. Что есть гуд.
1
Эксперт JS
2037 / 1096 / 409
Регистрация: 29.04.2016
Сообщений: 2,625
22.08.2018, 22:07  [ТС]
Qwerty_Wasd, Приветствую

Точно так! Спасибо ОГРОМЕННОЕ за правильную подсказку!
Сообственно вот что я хотел добиться, но не понимал, до вашей подсказки, как:
Песочница
HTML5
1
2
3
4
5
6
7
8
9
10
<div class="workSpace">
    <div class="box" id="boxOne">1</div>
    <div class="box" id="boxTwo">2</div>
 
    <div class="buttons">
        <div class="stopButton" id="stopOne">"Остановить 1" НЕ работает</div>
        <div class="stopButton" id="stopTwo">"Остановить 2" НЕ работает</div>
        <div class="stopButton" id="stopAll">"Остановить все" работает</div>
    </div>
</div>
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
var box = document.querySelectorAll('.box'), workSpace = document.querySelectorAll('.workSpace')[0];
var workArea = {},  coord = {}, interval = {};
 
[...box].map((e,i)=>{
    workArea[i] = {
        x : workSpace.offsetWidth - e.offsetWidth,
        y : workSpace.offsetHeight - e.offsetHeight
    };
    coord[i] = {
        x: 0,
        y: 0
    };
    moveRight(e,i);
});
 
function moveRight(e,i){
    interval[i] = requestAnimationFrame(  ()=>moveRight(e,i)  );
    if(coord[i].x <= workArea[i].x){
        coord[i].x += 5;
        e.style.left = coord[i].x + 'px';
    }
    if(coord[i].x > workArea[i].x){
        cancelAnimationFrame(interval[i]);
    }
}
 
// остановить по-отдельности
[...document.querySelectorAll('.stopButton')].map((e,i)=>{
    e.onclick = ()=> {
        cancelAnimationFrame(interval[i]);
    }
});
 
// остановить все
document.querySelector('#stopAll').onclick = ()=> {
    for(i=0; i<Object.keys(interval).length; i++){
        cancelAnimationFrame(interval[i]);
    }
}
CSS
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
html, body{
    margin: 0px 0px 0px 0px;
    width:  100%;
    height:  100%;
    overflow:  hidden;
}
 
.workSpace{
    width: 100%;
    height: 100%;
    background: #eee5ff;
    font-family: comic sans ms;
    overflow:  hidden;
}
 
.buttons{
    position:  relative;
    top: 450px;
}
 
.stopButton{
    margin-left: 10px;
    padding: 10px 10px 10px 10px;
    cursor: pointer;
    letter-spacing: 1px;
    border: 2px solid #eee5ff;
    border-radius: 7px;
    color:  #fff;
    display: inline-block;
    text-align: center;
}
.stopButton:hover{
    /* background: #eee5ff; */
    border: 2px solid #000000;
}
 
.box{
    text-align:  center;
    color: #fff;
}
 
#boxOne{
    width: 50px;
    height: 50px;
    font-size: 33px;
    overflow: hidden;
    position: absolute;
    background: #795548;
    left: 180px;
    top: 20px;
}
 
#boxTwo{
    width: 200px;
    height: 100px;
    font-size: 67px;
    overflow:  hidden;
    position: absolute;
    background: #009688;
    left: 180px;
    top: 90px;
}
 
#boxThree{
    width: 130px;
    height: 61px;
    font-size: 25px;
    overflow:  hidden;
    position: absolute;
    background: #dad2e9;
    color: #eee5ff;
    text-align:  center;
    line-height: 25px;
    left: 180px;
    top: 210px;
}
 
#stopOne{
    width: 140px;
    background: #795548;
}
 
#stopTwo{
    width: 140px;
    background: #009688;
}
 
#stopAll{
    width: 150px;
    background: linear-gradient(to top left, #009688, #795548);
}
 
#stopOne:active{
    background: #00af00;
}
#stopTwo:active{
    background: #00af00;
}
#stopAll:active{
    background: #00af00;
}
Мне нужно было сделать что бы каждый из div-ов "чувствовал" границу экрана, вот как сейчас:
Оба чувствительны к правой границе экрана

До того как вы подсказали они оба останавливались когда div с большей шириной касался правой границы экрана, вот как это выглядело:
Останавливается когда div с большей шириной касается правой границы экрана
Код выглядел по-другому --- это для наглядности.

Еще раз спасибо большое.
0
Эксперт JSЭксперт HTML/CSS
2151 / 1496 / 651
Регистрация: 16.04.2016
Сообщений: 3,696
22.08.2018, 22:08
zlojnaxa, да не за что, хорошего кода
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
22.08.2018, 22:08
Помогаю со студенческими работами здесь

Как остановить анимацию?
Добрый день. У меня установлена анимация при входе курсора в объект, а когда курсор выходит из объекта элементы становятся на прежние...

Как остановить спонтанную анимацию?
Добрый день! Подскажите, где тут поставить &quot;.stop().&quot;, чтобы анимация не повторялась многократно, если помотать мышью над картинками...

Как остановить анимацию gif в PictureBox?
Вопрос в сабже... Задача по нажатию клавиши остановить воспроизведение фреймов картинки gif заданной в PictureBox

Как остановить анимацию в нужный момент?
Добрый день. Программирую пока не в классах. У меня следующая проблема: имеется некий мувиклип, который является кнопкой. Этот мувиклип...

Как остановить анимацию в Chrome, Firefox?
Подскажите, что не так? Почему при добавлении класса, анимация не останавливается? Проверял инструментами разработчика, класс добавляется...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru