Форум программистов, компьютерный форум, киберфорум
JavaScript для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
Эксперт JS
 Аватар для DrType
6553 / 3624 / 1075
Регистрация: 07.09.2019
Сообщений: 5,877
Записей в блоге: 1

Странный эффект при анимации

19.12.2019, 19:40. Показов 1302. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Не знаю, какой заголовок был бы более информативным.

Код такой:
PHP/HTML
1
2
3
4
5
6
7
<div style="margin-left:100px">
<div id="but"><b>X</b></div>
<div class="t" id="trans"></div>
<div class="t" id="trans1"></div>
<div class="t" id="trans2"></div> 
<div class="t" id="trans3"></div>
</div>
CSS
1
2
3
4
5
6
.t{position:absolute; height:500px; width:400px}
#trans{z-index:2; background-color:#ffffff;}
#trans1{margin-left:50px;  z-index:1;  background-color:#cccccc}
#trans2{margin-left:100px;  z-index:0; background-color:#aaaaaa}
#trans3{margin-left:150px; z-index:-1; background-color:#444444}
#but{display:none; margin-left:-100px}
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 const trans=document.getElementById("trans");
const trans1=document.getElementById("trans1") ;
const trans2=document.getElementById("trans2");
const trans3=document.getElementById("trans3");
const x=document.getElementById("but");
/*Для каждого блока вводим свой счётчик:*/
trans.j=0;
trans1.j=0;
trans2.j=0;
trans3.j=0;
/*Анимация:*/
function tr(block){setTimeout(function(){requestAnimationFrame(function(){tr(block)});  if(block.j<=80){block.style.transform="perspective(700px) translateX("+-(block.j)*2+"px)  rotateY("+-(block.j)+"deg)"; block.j++} /**/ }, 20)};//конец анимации.
let arr=[trans3, trans2, trans1, trans]; 
for (let div of arr){div.style.marginTop=arr.indexOf(div)*-50+150+"px"; div.innerHTML="Lorem ipsum dolor met"};
for(let n=0; n<arr.length-1; n++){arr[n].addEventListener("click", ()=>{x.style.display="inherit"; for(let bl of arr.slice(n+1)){tr(bl); bl.j=0};})};
/*по клику на x всёдолжно вернуться в исходное состояние:*/
x.addEventListener("click", ()=>{for(let block of arr){block.style.transform="perspective(0px) rotateY(0deg) translateX(0px)"; block.j=81}; })
И вроде как всё работает. Но после клика по блоку "x" анимация протекает странно: ускоренно, с наложениями блоков друг на друга.
Я хотел сделать так, чтобы после клика по "x" все блоки возвращались в исходное положение, и в дальнейшем вели себя как и прежде, до клика. Где ошибка? Или может быть, код вообще переписать?

Вот как всё это выглядит: https://codepen.io/Berners-Lee/pen/GRgNrJe
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
19.12.2019, 19:40
Ответы с готовыми решениями:

Странный комбинационный эффект
В форме ввода имеются два textarea, причем в одно окно инфа вводится напрямую, а в другое - с использованием визуального редактора tiny_mce...

Эффект ластика при добавлении анимации к тексту
Есть флешка, при нажатии мышкой на верхней картинке она стирается и проявляется нижняя картинка. При добавлении анимации к тексту, всё...

Эффект смещения или анимации
Не знаю как это назвать, даже не знаю на чем реализовано, CSS или JS , мой друг хочет на сайт такой эффект показа фона, не знаю как даже...

2
380 / 230 / 115
Регистрация: 22.11.2016
Сообщений: 379
19.12.2019, 22:44
Лучший ответ Сообщение было отмечено DrType как решение

Решение

PHP/HTML
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
<!DOCTYPE html>
<html>
<head>
    <title></title>
    <style type="text/css">
        body { background-color: #ccccff; }
        #books {
            top: 100px;
            width: 100%;
            height: 400px;
            position: relative;
        }
        .book {
            position: absolute; 
            border: 6px solid black; 
            border-left: 1px solid black; 
            border-top-left-radius:15px; 
            border-bottom-left-radius:15px; 
            background: red;
            width: 300px;
            height: inherit;
            transition: transform 2s;
        }
        .transformation {
            transform: perspective(700px) translateX(-160px) rotateY(-80deg);
            transition: transform 2s;
        }
    </style>
</head>
<body>
    <button>Закрыть страницы</button>
    <div id="books">
        <div class="book">PAGE 1
            <p>Lorem ipsum dolor sit amet, consectetue. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et m eu pede mollis pretium.</p>
        </div>
        <div class="book">PAGE 2
            <p>Lorem ipsum dolor sit amet, consectetuer adipisccus ut, imperdiet a, venenatis vitae, justo. Nullam dictum felis eu pede mollis pretium.</p></div>
        <div class="book">3</div>
        <div class="book">4</div>
        <div class="book">5</div>
        <div class="book">6</div>
        <div class="book">7</div>
    </div>
    
 
    <script type="text/javascript">
        "use strict";
        function openAllPreviousSiblings(el) { // Функция для открытия предыдущих страниц (котрые перед страницей)
            let prev = el.previousElementSibling;
            if (prev) {
                prev.classList.add("transformation");
                openAllPreviousSiblings(prev);
            }
        }
        let books = document.querySelectorAll(".book");
        document.querySelector("button").addEventListener("click", () => { // Закрыть
            books.forEach(el => el.classList.remove("transformation"));
        });
        books.forEach((el, i, arr) => { // сдвигаем страницы и устанавливаем события.
            el.style = `right: ${50 - i * 1.5}%; z-index: ${arr.length - i}`; // z-index и right
            el.addEventListener("click", () => {
                openAllPreviousSiblings(el); // Если нажали на перед - открываются предыдущие страницы.
                // if (!el.previousElementSibling) el.classList.add("transformation");
            });
        });
    </script>
</body>
</html>
2
Эксперт JS
 Аватар для DrType
6553 / 3624 / 1075
Регистрация: 07.09.2019
Сообщений: 5,877
Записей в блоге: 1
20.12.2019, 00:59  [ТС]
fixeri, это здорово!
То есть, основная идея в том, что анимация осуществляется средствами CSS, а запускается путём добавления элементу класса с соответствующим стилевым правилом. Соответственно, «закрытие» страниц осуществляется исключением элемента из класса.

И вообще здорово — функция openAllPreviousSiblings определена рекурсивно, и т. д. ...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
20.12.2019, 00:59
Помогаю со студенческими работами здесь

Эффект ожидания перед воспроизведением анимации
Здравствуйте форумчане, хочу обратиться с незаурядной для меня проблемой. Думаю существует супер легкое решение. Но ничего придумать не...

Эффект анимации для фоновой картинки в слайдере
Добрый день! Подскажите, как добавить эффект для фоновой картинки каждому активному слайду в плагине owl.carousel.js Пробую...

Странный doc(rtf) файл (совсем странный)
Добрый день, сегодня на работе столкнулся с очень странным .doc файлом. 3 страницы - вес 45,9 МБ. &quot;Что за черт&quot; -думаю я....

Как сделать эффект размытия (эффект стекла) в Xaml?
Как сделать эффект размытия(эффект стекла) в Xaml?

Старт анимации не при старте программы, а при нажатии кнопки
Всем привет, как можно переделать нижеприведённый код чтобы анимация срабатывала не при старте программы а при нажатии кнопки? import...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
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