2::Динамика слайдов в Reveler

Большим преимущиством Reveler от PowerPoint это Javascript и вся его мощь.
Если вы занете JS вы можете делать всё что угодно со своими слайдами, но если вы лентяй и знаете AlpineJS, то вам это будет сделать еще проще).

Поговорим сначала про чистый JavaScript. JavaScript пишется как и в обычном HTML в геге <script>, но со своими правилами и модификаторами

<slide> <script> console.log("Hello world"); </script> <h1>При открытии слайда в консоль выведится "Hello world"</h1> </slide>

Но этот скрипт будет запускатся при каждом открытии слайда, но это поведение мы можем поменять. Если вы добавите атребут global в тег <script>, который скажет скрипту запускатся только перед отрытием презентации.

<slide> <script global> console.log("Presentation opened"); </script> <h1>Скрипт выполнится до открытия презентации</h1> </slide>

Если же мы хотим чтобы скрипт выполнятся при открытии слайда, но только один раз, то есть при первом открытии нам нужно добавить атребут ones

<slide> <script ones> console.log("The slide opened for the first time"); </script> <h1>Скрипт выполнится при первом открытии слайда</h1> </slide>

С помощью скриптов вы можете создавать динамические элементы и анимации. Например, вы можете создать анимированную загрузку, которая будет запускаться при переходе на слайд:

<slide class="loading"> <script> Reveler.slide.on(_id, "beforeChange", function() { document.querySelector(".loading").classList.add("active"); }); Reveler.slide.on(_id, "afterChange", function() { document.querySelector(".loading").classList.remove("active"); }); </script> <div class="w-screen h-screen flex items-center justify-center"> <div class="loader"></div> </div> </slide>

Создание динамических слайдов при помощи AlpineJS

Ванильный JS это конечно классно, но использовать UI библиотеки это намного лучше. В Reveler можно использовать AlpineJS, но с небольшими ограничениями (нельзя пока что использовать Alpine.data() , Alpine. store() , Alpine. bind()) и с небольшими изменениями синтаксиса. Чтобы использовать AlpineJS в место написания атребута x-data="" вы должны использовать тег <reactive> и писать всю логику в нем.

<slide class="hello relative"> <div class="w-screen h-screen flex flex-col" x-on:click="toggle" > <reactive> open: false, toggle() { this.open = !this.open; }, </reactive> <h1 class=" absolute bottom-10rem left-10rem leading-6 text-7rem font-extrabold " x-show="open" >Name ofpresentation</h1> </div> </slide>

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

<slide class="question"> <div class="w-screen h-screen flex flex-col" > <reactive> answer: '', </reactive> <h2 class="text-4xl font-bold mb-4">What is the capital of France?</h2> <label class="inline-block mr-4"> <input type="radio" name="answer" value="Paris" x-model="answer" > <span>Paris</span> </label> <label class="inline-block"> <input type="radio" name="answer" value="London" x-model="answer" > <span>London</span> </label> <div x-show="answer === 'Paris'"> <p class="text-xl mt-4">Correct!</p> </div> <div x-show="answer === 'London'"> <p class="text-xl mt-4">Incorrect.</p> </div> </div> </slide>

Использование глобальной переменной Reveler

Глобальный объект Reveler имеет несколько свойств, которые позволяют управлять презентацией. В данный момент объект содержит функции для перехода на следующий и предыдущий слайд, а также функции для перехода на слайд слева и справа. Для использования этих функций необходимо написать скрипт внутри тега на слайде, который вы хотите управлять.

Например, в следующем примере мы используем функции для перехода на следующий слайд:

<slide class="hello relative"> <script> Reveler.slider.next(); </script> <div class="w-screen h-screen flex flex-col"> <h1 class=" absolute bottom-10rem left-10rem leading-6 text-7rem font-extrabold " >Name of presentation</h1> </div> </slide>

Так же можно задать переход на другой через определённое время при помощи функции moveToTime()

// Типизация функци type SideOptions = "next"|"prev"|"left"|"right"; moveToTime: (side: SideOptions, time: number, id: number) => void, // Пример использования <slide> <script> Reveler.control.moveToTime('right', 3000, _id) </script> <div class="w-screen h-screen flex flex-col"> <h1 class="text-center text-7xl font-bold"> Move to the slide on the right in 3 seconds </h1> </div> </slide>

Также в глобальном объекте Reveler есть модуль анимации GSAP, который вы можете использовать для создания анимаций в слайдах. Для использования модуля необходимо импортировать его в свой скрипт.

<slide class="hello relative"> <script> const { gsap } = Reveler; const element = document.querySelector('.my-element'); gsap.to(element, { duration: 1, x: 100 }); </script> <div class="w-screen h-screen flex flex-col"> <div class="my-element">Hello!</div> </div> </slide>

В данном примере мы импортируем модуль GSAP из объекта Reveler и используем его для анимации элемента в слайде. Вы можете использовать модуль для создания различных анимаций, например, анимации появления или изменения размера элемента.

Кроме того, в глобальном объекте Reveler есть свойства, которые позволяют получать информацию о текущем слайде. Например, функция getRow() возвращает номер строки, в которой находится текущий слайд, а функция getSlide() возвращает номер слайда в этой строке.

<slide class="hello"> <script> const row = Reveler.info.getRow(); const slide = Reveler.info.getSlide(); console.log(`Вы находитесь на ${row} строке, ${slide} слайде`); </script> <div class="w-screen h-screen flex flex-col"> <h1 class="text-4xl font-bold">Hello!</h1> </div> </slide>

В данном примере мы используем функции getRow() и getSlide() для получения информации о текущем слайде и выводим ее в консоль.

В будущем в объект Reveler будут добавлены другие функции, которые вы сможете использовать. Например, функция для перемещения на слайд через определенный промежуток времени, функции для получения информации о текущем слайде и многое другое.

Таким образом, глобальный объект Reveler предоставляет удобный способ управления презентацией и создания анимаций. Его функции и свойства можно использовать для создания более интерактивных и увлекательных презентаций.

Начать дискуссию
\n

При открытии слайда в консоль выведится \"Hello world\"

\n ","lang":""}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Но этот скрипт будет запускатся при каждом открытии слайда, но это поведение мы можем поменять. Если вы добавите атребут global в тег <script>, который скажет скрипту запускатся только перед отрытием презентации.

"}},{"type":"code","cover":false,"hidden":false,"anchor":"","data":{"text":"\n \n

Скрипт выполнится до открытия презентации

\n
","lang":""}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Если же мы хотим чтобы скрипт выполнятся при открытии слайда, но только один раз, то есть при первом открытии нам нужно добавить атребут ones

"}},{"type":"code","cover":false,"hidden":false,"anchor":"","data":{"text":"\n \n

Скрипт выполнится при первом открытии слайда

\n
","lang":""}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

С помощью скриптов вы можете создавать динамические элементы и анимации. Например, вы можете создать анимированную загрузку, которая будет запускаться при переходе на слайд:

"}},{"type":"code","cover":false,"hidden":false,"anchor":"","data":{"text":"\n \n
\n
\n
\n
","lang":""}},{"type":"header","cover":false,"hidden":false,"anchor":"","data":{"style":"h2","text":"Создание динамических слайдов при помощи AlpineJS"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Ванильный JS это конечно классно, но использовать UI библиотеки это намного лучше. В Reveler можно использовать AlpineJS, но с небольшими ограничениями (нельзя пока что использовать Alpine.data() , Alpine. store() , Alpine. bind()) и с небольшими изменениями синтаксиса. Чтобы использовать AlpineJS в место написания атребута x-data=\"\" вы должны использовать тег <reactive> и писать всю логику в нем.

"}},{"type":"code","cover":false,"hidden":false,"anchor":"","data":{"text":"\n \n \n open: false,\n toggle() {\n this.open = !this.open;\n },\n \n

Name ofpresentation

\n \n
","lang":""}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

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

"}},{"type":"code","cover":false,"hidden":false,"anchor":"","data":{"text":"\n \n \n answer: '',\n \n

What is the capital of France?

\n \n \n
\n

Correct!

\n
\n
\n

Incorrect.

\n
\n \n
","lang":""}},{"type":"header","cover":false,"hidden":false,"anchor":"","data":{"style":"h2","text":"Использование глобальной переменной Reveler"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Глобальный объект Reveler имеет несколько свойств, которые позволяют управлять презентацией. В данный момент объект содержит функции для перехода на следующий и предыдущий слайд, а также функции для перехода на слайд слева и справа. Для использования этих функций необходимо написать скрипт внутри тега на слайде, который вы хотите управлять.

"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Например, в следующем примере мы используем функции для перехода на следующий слайд:

"}},{"type":"code","cover":false,"hidden":false,"anchor":"","data":{"text":"\n \n
\n

Name of presentation

\n
\n
","lang":""}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Так же можно задать переход на другой через определённое время при помощи функции moveToTime()

"}},{"type":"code","cover":false,"hidden":false,"anchor":"","data":{"text":"// Типизация функци\ntype SideOptions = \"next\"|\"prev\"|\"left\"|\"right\";\nmoveToTime: (side: SideOptions, time: number, id: number) => void,\n\n// Пример использования\n\n \n
\n

\n Move to the slide on the right in 3 seconds\n

\n
\n
","lang":""}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Также в глобальном объекте Reveler есть модуль анимации GSAP, который вы можете использовать для создания анимаций в слайдах. Для использования модуля необходимо импортировать его в свой скрипт.

"}},{"type":"code","cover":false,"hidden":false,"anchor":"","data":{"text":"\n \n
\n
Hello!
\n
\n
","lang":""}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

В данном примере мы импортируем модуль GSAP из объекта Reveler и используем его для анимации элемента в слайде. Вы можете использовать модуль для создания различных анимаций, например, анимации появления или изменения размера элемента.

"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Кроме того, в глобальном объекте Reveler есть свойства, которые позволяют получать информацию о текущем слайде. Например, функция getRow() возвращает номер строки, в которой находится текущий слайд, а функция getSlide() возвращает номер слайда в этой строке.

"}},{"type":"code","cover":false,"hidden":false,"anchor":"","data":{"text":"\n \n
\n

Hello!

\n
\n
","lang":""}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

В данном примере мы используем функции getRow() и getSlide() для получения информации о текущем слайде и выводим ее в консоль.

"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

В будущем в объект Reveler будут добавлены другие функции, которые вы сможете использовать. Например, функция для перемещения на слайд через определенный промежуток времени, функции для получения информации о текущем слайде и многое другое.

"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Таким образом, глобальный объект Reveler предоставляет удобный способ управления презентацией и создания анимаций. Его функции и свойства можно использовать для создания более интерактивных и увлекательных презентаций.

"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Узнать больше про глобальный объект

"}}],"summaryContent":null,"isExistSummaryContent":false,"warningFromEditor":null,"warningFromEditorTitle":null,"counters":{"comments":0,"favorites":0,"reposts":0,"views":55,"hits":42,"reads":null,"online":0},"dateFavorite":0,"hitsCount":42,"isCommentsEnabled":true,"isLikesEnabled":true,"isRemovedByUserRequest":false,"isFavorited":false,"isPinned":false,"repostId":null,"repostData":null,"subscribedToTreads":false,"isEditorial":false,"isAudioAvailable":false,"audioUrl":null,"isAudioAvailableToGenerate":false,"commentEditor":{"enabled":true,"who":null,"text":"","until":null,"reason":null,"type":"everybody"},"isBlur":false,"isPublished":true,"isDisabledAd":false,"withheld":[],"ogTitle":null,"ogDescription":null,"url":"https://vc.ru/id856347/632016-2dinamika-slaidov-v-reveler","author":{"id":856347,"name":"VIOOI","nickname":null,"description":"Я занимаюсь проектом Reveler о котором вы можете почитать здесь у меня и если есть какие нибудь предложения, пишите в тг @Vl00l","uri":"","avatar":{"type":"image","data":{"uuid":"edfea385-7ae5-5b75-bd0f-0c48474b9cfd","width":1500,"height":1500,"size":91703,"type":"jpg","color":"1b1b1b","hash":"174d4d330000","external_service":[]}},"cover":null,"achievements":[{"title":"Год на vc.ru","code":"registration_1_year","description":"Первый год с vc.ru. Получена 24 июля 2025.","previewUuid":"0d11c244-49de-50e7-894e-b9b27945d42b","formats":{"glb":"https://static.vc.ru/achievements/fish.glb","usdz":"https://static.vc.ru/achievements/fish.usdz"},"viewData":{"contentColor":"#C67AA3","textMaxWidth":0.634765625,"textX":0.5888671875,"textY":0.54296875,"logoX":0.5859375,"logoY":0.6669921875,"logoXNoText":0.6044921875,"logoYNoText":0.5439453125},"id":4582646,"userId":856347,"count":0,"shareImage":"https://api.vc.ru/achievements/share/4582646"},{"title":"3 года на vc.ru","code":"registration_3_years","description":"Провёл 3 года вместе с vc.ru. Получена 23 июля 2025.","previewUuid":"d9d72ac5-bcb5-55e0-8c72-b99251e5cdd9","formats":{"glb":"https://static.vc.ru/achievements/shark.glb","usdz":"https://static.vc.ru/achievements/shark.usdz"},"viewData":{"contentColor":"#8E6F09","textMaxWidth":0.66796875,"textX":0.5205078125,"textY":0.341796875,"logoX":0.5205078125,"logoY":0.4609375,"logoXNoText":0.5,"logoYNoText":0.3662109375},"id":958559,"userId":856347,"count":0,"shareImage":"https://api.vc.ru/achievements/share/958559"}],"lastModificationDate":1764986650,"isSubscribed":false,"isSubscribedToNewPosts":false,"isMuted":false,"isAvailableForMessenger":true,"badgeId":null,"isDonationsEnabled":false,"isPlusGiftEnabled":true,"isUnverifiedBlogForCompanyWithoutPro":false,"isRemovedByUserRequest":false,"isFrozen":false,"isDisabledAd":false,"isPlus":false,"isVerified":false,"isPro":false,"yandexMetricaId":null,"badge":null,"isOnline":false,"tgChannelShortname":null,"isUnsubscribable":true,"type":1,"subtype":"personal_blog"},"subsite":{"id":856347,"name":"VIOOI","nickname":null,"description":"Я занимаюсь проектом Reveler о котором вы можете почитать здесь у меня и если есть какие нибудь предложения, пишите в тг @Vl00l","uri":"","avatar":{"type":"image","data":{"uuid":"edfea385-7ae5-5b75-bd0f-0c48474b9cfd","width":1500,"height":1500,"size":91703,"type":"jpg","color":"1b1b1b","hash":"174d4d330000","external_service":[]}},"cover":null,"achievements":[{"title":"Год на vc.ru","code":"registration_1_year","description":"Первый год с vc.ru. Получена 24 июля 2025.","previewUuid":"0d11c244-49de-50e7-894e-b9b27945d42b","formats":{"glb":"https://static.vc.ru/achievements/fish.glb","usdz":"https://static.vc.ru/achievements/fish.usdz"},"viewData":{"contentColor":"#C67AA3","textMaxWidth":0.634765625,"textX":0.5888671875,"textY":0.54296875,"logoX":0.5859375,"logoY":0.6669921875,"logoXNoText":0.6044921875,"logoYNoText":0.5439453125},"id":4582646,"userId":856347,"count":0,"shareImage":"https://api.vc.ru/achievements/share/4582646"},{"title":"3 года на vc.ru","code":"registration_3_years","description":"Провёл 3 года вместе с vc.ru. Получена 23 июля 2025.","previewUuid":"d9d72ac5-bcb5-55e0-8c72-b99251e5cdd9","formats":{"glb":"https://static.vc.ru/achievements/shark.glb","usdz":"https://static.vc.ru/achievements/shark.usdz"},"viewData":{"contentColor":"#8E6F09","textMaxWidth":0.66796875,"textX":0.5205078125,"textY":0.341796875,"logoX":0.5205078125,"logoY":0.4609375,"logoXNoText":0.5,"logoYNoText":0.3662109375},"id":958559,"userId":856347,"count":0,"shareImage":"https://api.vc.ru/achievements/share/958559"}],"lastModificationDate":1764986650,"isSubscribed":false,"isSubscribedToNewPosts":false,"isMuted":false,"isAvailableForMessenger":true,"badgeId":null,"isDonationsEnabled":false,"isPlusGiftEnabled":true,"isUnverifiedBlogForCompanyWithoutPro":false,"isRemovedByUserRequest":false,"isFrozen":false,"isDisabledAd":false,"isPlus":false,"isVerified":false,"isPro":false,"yandexMetricaId":null,"badge":null,"isOnline":false,"tgChannelShortname":null,"isUnsubscribable":true,"type":1,"subtype":"personal_blog"},"reactions":{"counters":[],"reactionId":0},"isNews":false,"source":null,"clusters":[],"donations":{"amount":0,"isDonated":false},"commentsSeenCount":null,"keywords":[],"media":null,"customCover":null,"robotsTag":null,"categories":[],"isAnonymized":true}};