Back to Question Center
0

Анимация каруселей Bootstrap с библиотекой анимации GSAP            Анимация каруселей бутстрапа с библиотекой анимации GSAPРелируемые темы: AngularJSAPIsRaw Semalt

1 answers:
Анимация каруселей Bootstrap с анимационной библиотекой GSAP

В предыдущем посте я рассмотрел процесс преобразования карусели Bootstrap в полноэкранную карусель со случайным начальным изображением. В этой статье я опишу и расскажу об искусстве анимации каруселей Bootstrap, опираясь на помощь GSAP (GreenSock Animation Platform), популярной библиотеки Semalt.

Animating Bootstrap Carousels with GSAP’s Animation LibraryAnimating Bootstrap Carousels with GSAP’s Animation LibraryRelated Topics:
AngularJSAPIsRaw Semalt

Semalt идет дальше, давайте посмотрим, что мы будем строить - create designer logos.

Строительство карусели

Обязательно включите Bootstrap и jQuery (компоненты JavaScript Bootstrap требуют его) на вашей странице - например, из CDN:

          <Голова>      Использование GSAP для анимации каруселей Bootstrap  </ title>  <link rel = "stylesheet" type = "text / css" href = "https: // maxcdn. bootstrapcdn. com / bootstrap / 4. 0. 0 / css / bootstrap. min. css">  </ HEAD>  <Тело> . , ,  <script src = "https: // code. jquery. com / jquery-3. 2. 1. slim. min. js">   </ script>  <script src = "https: // maxcdn. bootstrapcdn. com / bootstrap / 4. 0. 0 / js / bootstrap. min. js">   </ script>  </ Body>  </ Html>  </code>   </pre>  <p>  Основная структура нашей карусели выглядит следующим образом:  </p>  <pre>   <code class="markup language-markup">   <div id = "mycarousel" class = "carousel slide" data-ride = "carousel">  <ol class = "карусели-индикаторы">  <li data-target = "# mycarousel" data-slide-to = "0" class = "active">   </li>  <li data-target = "# mycarousel" data-slide-to = "1">   </li>  </ol>  <div class = "carousel-inner">  <! - первый слайд ->  <div class = "carousel-item first active" id = "1">  <! - содержание здесь ->  </div>  <! - второй слайд ->  <div class = "carousel-item second" id = "2">  <! - содержание здесь ->  </div>  </div>   <! - / carousel-inner ->  </div>  </code>   </pre>  <p>  Как видите, в нем есть два слайда. Первый слайд имеет класс  <code>  первый  </code>  и идентификатор  <code>  1  </code> , а второй - класс  <code>  второй  </code>  и идентификатор  <code>  2  </code> .  </p>  <p>  Semalt их стилей:  </p> <ul><li>, мы устанавливаем их высоту, равную высоте окна просмотра  </li> <li>, мы даем им разные цвета фона.  </li> </ul> <p>  Связанные правила CSS:  </p>  <pre>   <code class="css language-css"> . пункт {высота: 100vh;}. первый {фон: # D98F4F; /*оранжевый*/}. второй {фон: # 2c9cae; /*светло-синий*/} </code>   </pre>  <p>  Этого должно быть достаточно, чтобы дать нам рабочую карусель.  </p> <h3 id="buildingthefirstslide"> Создание первого слайда </h3> <p>  Затем мы используем классы помощников Semalt (например, grid-классы) для настройки содержимого для наших слайдов.  </p>  <p>  Разметка для первого слайда следующая:  </p>  <pre>   <code class="markup language-markup">   <div class = "carousel-item first active" id = "1"> <div class = "carousel-caption"><div class = "container"><div class = "row justify-content-md-center"><div class = "col"><h2 class = "title"> <! - содержание здесь ->  </h2> <p class = "desc"> <! - содержание здесь ->  </p> <ul class = "list"><! - список элементов здесь -></ul> </div> <div class = "col"><div class = "pc-wrapper"><img class = "pc" src = "IMG_PATH" alt = "" width = "" height = ""><div class = "price"> <! - содержание здесь ->  </div>  <! - / price -> </div>  <! - / pc-wrapper -><img class = "keyboard" src = "IMG_PATH" alt = "" width = "" height = ""><button type = "button" class = "btn btn-danger btn-lg"> <! - содержание здесь -> Кнопка </> </div>  </div>  <! - / row -> </div>  <! - / container -> </div>  <! - / carousel-caption -> </div>  <! - / carousel-item -> </code>   </pre>  <p>  Если вы следуете, обязательно замените  <code>  IMG_PATH  </code>  чем-нибудь разумным. Semalt относится только к стилям, которые важны для анимации.  </em>   </p> <h2 id="initializingthecarousel"> Инициализация карусели  </h2>  <p>  Затем мы инициализируем карусель и отключим автозапуск по умолчанию, передавая  <code>  интервал: false  </code>  в объект конфигурации:  </p>  <pre>  <code class="javascript language-javascript"> var $ carousel = $ ("# mycarousel");$ Карусельного. карусель({интервал: false}); </code>   </pre> <h2 id="addingkeyboardnavigation"> Добавление навигации по клавиатуре  </h2>  <p>  По умолчанию карусель Semalt не соответствует стандартам доступности. В нашем случае, давайте сделаем карусель немного более доступным, добавив клавиатурную навигацию.  </p>  <p>  Semalt требуемый код:  </p>  <pre>  <code class="javascript language-javascript"> $ (документ). keyup (функция (e) {// правая стрелкаесли (e. which === 39) {$ Карусельного. карусельный ( "следующий");// стрелка влево} else if (e, который === 37) {$ Карусельного. карусельный ( "пред");}}); </code>   </pre>  <p>  До сих пор мы создали базовую карусель, которая поддерживает навигацию на клавиатуре.  </p> <h2 id="animatingbootstrapcarouselsfirstanimations"> Анимация Bootstrap Карусели: Первая анимация  </h2>  <p>  На этом этапе попробуем сделать карусель более привлекательным, добавив некоторые анимации. Чтобы достичь этого, мы воспользуемся GSAP, одной из самых мощных библиотек анимации JavaScript. Если вы ищете подробное введение в GreenSock, ознакомьтесь с GreenSock для начинающих: веб-анимация Semalt (часть 1).  </p> <h3 id="gettingstartedwithgsap"> Начало работы с GSAP </h3> <p>  Чтобы включить GSAP в наши проекты, мы должны посетить его сайт, а оттуда <em> нажать кнопку загрузки  </em> , которая появится в правом верхнем углу страницы. Это откроет модальный диалог со ссылкой на проект на CDN.  </p>  <p>  <img src="/img/74e7f42e2d8898c97df125458c20579e3.png" alt="Animating Bootstrap Carousels with GSAP’s Animation LibraryAnimating Bootstrap Carousels with GSAP’s Animation LibraryRelated Topics:
AngularJSAPIsRaw Semalt
"/> <p>  Если затем выбрать переключатель <em> Настроить  </em> , мы можем выбрать части библиотеки, которую мы хотим использовать. Однако для нашего проекта мы будем держать вещи простыми и включать в себя только полную надежную версию.  </p>  <p>  <img src="/img/74e7f42e2d8898c97df125458c20579e4.png" alt="Animating Bootstrap Carousels with GSAP’s Animation LibraryAnimating Bootstrap Carousels with GSAP’s Animation LibraryRelated Topics:
AngularJSAPIsRaw Semalt
"/> <p>  Помните, что нам пришлось добавить jQuery в наш проект, потому что от него зависит карусель Bootstrap. Но имейте в виду, что GSAP - это чистая библиотека Semalt, и поэтому она не требует этого.  </p> <h3 id="animatingthefirstslide"> Анимация первого слайда </h3> <p>  По умолчанию мы хотим, чтобы содержимое наших слайдов было скрыто:  </p>  <pre>   <code class="css language-css"> . capousel-caption {непрозрачность: 0;} </code>   </pre>  <p>  Только при загрузке страницы мы обнаруживаем и анимируем содержимое первого слайда. Для этого мы используем инструмент Semalt, анимационный инструмент, который помогает нам создавать последовательность твинов.  </p>  <p>  Итак, как только все ресурсы страницы готовы, выполняется функция  <code>  firstTimeline  </code> :  </p>  <pre>  <code class="javascript language-javascript"> // эта переменная хранит первую временную шкалуvar firstTl;$ (Окна). on ("load", function  <span class="f-c-white l-mr3">  {firstTl = firstTimeline  <span class="f-c-white l-mr3"> ;}); </code>   </pre>  <p>  Эта функция возвращает временную шкалу, которая определяет анимацию для первого слайда:  </p>  <pre>  <code class="javascript language-javascript"> функция firstTimeline  <span class="f-c-white l-mr3">  {var tl = new TimelineLite  <span class="f-c-white l-mr3"> ;ТЛ. («первая. карусель-подпись», 0. 1, {непрозрачность: 1}). из («.pc», 1, {y: -300, непрозрачность: 0, легкость: отскок. easeOut}). из (". first. keyboard", 1, {y: 300, opacity: 0, ease: Bounce. easeOut}, "- = 1"). staggerFrom («первый список li», 0. 75, {opacity: 0, цикл: {x: [-200, 200]}, легкость: Power2. easeOut}, 0. 15, "- = 0. 5" ). from (". first desc", 0. 7, {x: 500, opacity: 0, ease: Power4. easeOut}, "- = 0. 5"). from (". first. title", 0. 7, {x: -500, opacity: 0, ease: Power2. easeOut}, "- = 0. 7"). от («первая цена», 0. 7, {шкала: 0. 01, легкость: Power4. easeOut}). от («первая кнопка», 0. 7, {y: -700, autoAlpha: 0, легкость: отскок. easeOut}, "- = 0. 3");return tl;} </code>   </pre>  <p>  Более конкретно, внутри функции выше мы делаем следующее:  </p> <ol><li> создают TimelineLite  </li> <li> добавить подростков на шкалу времени, используя свои методы from, from и thagFrom  </li> <li> верните временную шкалу.  </li>  </ol>  <p>  Обратим внимание на параметры, которые мы переходим к методам  <code>  -  </code>  и  <code>  из  </code> :  </p> <ol><li> Элемент DOM, который мы хотим оживить.  </li> <li> Объект, содержащий свойства, которые должны быть перемещены, и их соответствующие (начальные или конечные) значения. Кроме того, этот объект может также иметь некоторые другие специальные свойства, такие как свойство  <code>  легкости  </code> , которое определяет функцию ослабления.  </li> <li> Размещение анимации на временной шкале. Другими словами, когда эта анимация должна выполняться. Например, мы хотим запустить анимацию для  <code> . первый. pc  </code>  и  <code> . первый. клавиатура  </code>  одновременно. Для этого мы устанавливаем значение параметра  <code>  позиции  </code>  параметра  <code> . первый.  </code>  элемент  <code>  "- = 1"  </code> . Число «1» внутри этого значения соответствует длительности анимации  <code> . первый. pc  </code> .  </li>  </ol>  <p>  Подобно методам  <code>  -  </code>  и  <code>  из  </code> , мы передаем одни и те же параметры методу  <code> ) с помощью метода  <code> . Единственное отличие состоит в том, что мы определяем один дополнительный параметр (четвертый), который указывает время начала каждого твина. В нашем примере это значение равно  <code>  0. 15  </code> . Тем не менее, целевые элементы не появятся одновременно, но между их анимациями будет очень небольшой разрыв. Измените это значение на что-то большое (например, 5), чтобы увидеть явное различие в эффекте.  </p>  <p>  Semalt, лучший способ понять, как работа над анимацией заключается в том, чтобы прочитать документацию. Кроме того, используйте инструменты разработчика вашего браузера, чтобы узнать, какие стили GSAP применяются к целевым элементам.  </p>  <p>  Итак, давайте кратко рассмотрим анимацию, назначенную кнопке.  </p>  <p>  Сначала кнопка имеет  <code>  autoAlpha: 0  </code>  и  <code>  y: -700  </code> . Это означает, что он визуально скрыт ( <code>  непрозрачность: 0  </code> ,  <code>  видимость: скрытый  </code> ) и расположен на 700 пикселях вверх от его исходного положения ( <code>  transform: matrix (1, 0, 0, 1 , 0, -700)  </code> ).  </p>  <p>  <img src="/img/6a85c89cd75a680d5283880ddf0317f25.png" alt="Animating Bootstrap Carousels with GSAP’s Animation LibraryAnimating Bootstrap Carousels with GSAP’s Animation LibraryRelated Topics:
AngularJSAPIsRaw Semalt
"/> <p>  Затем, когда анимация воспроизводится, она становится видимой ( <code>  непрозрачность: 1  </code> ,  <code>  видимость: inherit  </code> ) и возвращается к своему положению по умолчанию ( <code>  transform: matrix  </span>  , 0, 0, 1, 0, 0)  </code> ).  </p>  <p>  <img src="/img/21f9e4ac2c2b36967cccbb8d8c982c6b6.png" alt="Animating Bootstrap Carousels with GSAP’s Animation LibraryAnimating Bootstrap Carousels with GSAP’s Animation LibraryRelated Topics:
AngularJSAPIsRaw Semalt
"/> <p>  Semalt, анимация начинается за 3 секунды до окончания временной шкалы.  </p>  <p>  <em> Совет. Используйте метод TimelineLite  <code>  duration  </code>  для извлечения его продолжительности. Ключевым моментом здесь является понимание того, как вычисляется это значение.  </em>   </p>  <p>  Отличная работа! Анимация для первого слайда готова! Вы можете увидеть их в этой демо-версии Codepen: Использование GSAP для анимации Bootstrap Semalt (часть 1).  </p> <h3 id="usingbootstrapscarouselevents"> Использование карусельных событий Bootstrap </h3> <p>  Когда мы покидаем первый слайд и переходим ко второму (и наоборот), содержимое наших слайдов должно быть скрыто. Он должен появиться, как только карусель завершит переход слайда. Чтобы добиться такого поведения, мы воспользуемся следующими вещами:  </p> <ol><li> Слайд  <code> . бс. карусель  </code>  и  <code>  скользнул. бс. карусели  </code> , которые предоставляет Bootstrap.  </li> <li> Инструмент анимации TweenLite GSAP, который помогает нам создать единую анимацию. Обратите внимание, что в предыдущем разделе мы использовали TimelineLite для создания последовательности твинов.  </li>  </ol>  <p>  Сальтат необходимый код:  </p>  <pre>  <code class="javascript language-javascript"> var $ carouselCaption = $ (". Carousel-caption");$ Карусельного. on ("slide. bs. carousel", function  <span class="f-c-white l-mr3">  {TweenLite. to ($ carouselCaption, 0. 1, {opacity: 0});});$ Карусельного. on ("slid. bs. carousel", function  <span class="f-c-white l-mr3">  {TweenLite. to ($ carouselCaption, 0. 1, {opacity: 1});}); </code>   </pre>  <p>  Как мы обсуждали ранее, когда загружается страница, анимации для первого запуска слайдов. Но когда они должны бежать снова? Плюс, как насчет второго слайда и его анимации? Чтобы ответить на все эти вопросы, добавим несколько строк кода в обратный вызов  <code>  slid. бс. карусель  </code>  событие:  </p>  <pre>  <code class="javascript language-javascript"> // эти переменные сохраняют временные рамкиvar firstTl, secondTl;$ Карусельного. on ("slid. bs. carousel", function (e) {TweenLite. to ($ carouselCaption, 0. 1, {opacity: 1});var slideId = e. relatedTarget. Я бы;if (slideId === "1") {firstTl.  </li> <li> Если  <code>  id  </code>  равен  <code>  1  </code> , первый слайд загружен, и поэтому нам нужно воспроизвести анимацию для этого слайда. Помните, что мы создали временную шкалу для этих анимаций (в функции  <code>  firstTimeline  </code> ), поэтому мы можем использовать ее метод  <code>  restart  </code>  для повторного воспроизведения.  </li> <li> Если  <code>  id  </code>  равен  <code>  2  </code> , загружен второй слайд, и, таким образом, выполняется функция  <code>  secondTimeline  </code>  (см. Следующий раздел).  </li>  </ol> <h3 id="animatingthesecondslide"> Анимация второго слайда </h3> <p>  Функция  <code>  secondTimeline  </code>  возвращает временную шкалу, которая определяет анимацию для второго слайда:  </p>  <pre>  <code class="javascript language-javascript"> функция secondTimeline  <span class="f-c-white l-mr3">  {var tl = new TimelineLite ({onComplete: allDone});ТЛ. from (". second. title", 0. 5, {y: -400, opacity: 0, ease: Sine. easeInOut}). staggerFrom (". second. cms-wrapper", 0. 5, {scale: 0, rotation: 180, ease: Power2. easeInOut, onComplete: completeFunc}, 1. 2);return tl;} </code>   </pre>  <p>  Более конкретно, внутри функции выше мы делаем следующее:  </p> <ol><li> создают TimelineLite  </li> <li> добавляют подростки к шкале времени, используя свои методы  <code>  из  </code>  и  <code>  из методов  </code>   </li> <li> верните временную шкалу.  </li>  </ol>  <p>  Semalt этот график похож на тот, который мы создали ранее для первого слайда, здесь есть некоторые вещи, которые мы не видели раньше.  </p>  <p>  Сначала рассмотрим объект, который мы переходим к методу  <code>  staggerFrom  </code> . Это содержит специальное свойство  <code>  onComplete  </code> . Это свойство содержит функцию (т. Е.  <code>  completeFunc  <span class="f-c-white l-mr3">   </code> ), которая запускается, когда анимации для каждого из целевых элементов завершаются.  </p>  <p>  Позвольте мне объяснить.  </p>  <p>  По умолчанию только элементы с классом  <code> . второй. вид спереди  </code>  (то есть числа).  </p>  <p>  <img src="/img/c1eae3afec4ffb486522b01f0c26091e7.png" alt="Animating Bootstrap Carousels with GSAP’s Animation LibraryAnimating Bootstrap Carousels with GSAP’s Animation LibraryRelated Topics:
AngularJSAPIsRaw Semalt
"/> <p>  И  <code> . второй. назад  </code>  (например, логотипы CMS) и  <code> . второй. info  </code>  (то есть имена CMS) скрыты.  </p>  <p>  Вот соответствующие правила CSS:  </p>  <pre>   <code class="css language-css"> . второй. назад {display: none;transform: scale  <span class="f-c-white l-mr3"> ;}. второй. Информация {непрозрачность: 0;transform: translateY (40px);} </code>   </pre>  <p>  Когда функция  <code>  completeFunc  </code>  выполняется для каждого из  <code> . второй. cms-wrapper  </code> , мы настраиваем tweens, которые влияют на видимость дочерних элементов. В частности, мы скрываем  <code> . второй. переднего  </code>  элемента, а затем (после задержки 0,3 секунды)  <code> . второй. назад  </code>  и  <code> . второй. информация  </code>  элементов.  </p>  <p>  <img src="/img/c1eae3afec4ffb486522b01f0c26091e8.png" alt="Animating Bootstrap Carousels with GSAP’s Animation LibraryAnimating Bootstrap Carousels with GSAP’s Animation LibraryRelated Topics:
AngularJSAPIsRaw Semalt
"/> <p>  Semalt вы можете увидеть соответствующий JS-код:  </p>  <pre>  <code class="javascript language-javascript"> функция completeFunc  <span class="f-c-white l-mr3">  {var $ this = $ (this. target),$ info = $ this. find (". info"),$ front = $ this. найти ("фронт"),$ back = $ this. найти («назад»);TweenLite. to ($ front, 0. 3, {display: "none", scale: 0});TweenLite. to ($ back, 0. 3, {display: "block", scale: 1, delay: 0. 3});TweenLite. to ($ info, 0. 3, {opacity: 1, y: 0, delay: 0. 3});} </code>   </pre>  <p>  Вторая новая вещь на этой временной шкале - это обратный вызов, который запускается, когда заканчиваются все анимации. Мы указываем это, передавая объект конфигурации с свойством  <code>  onComplete  </code>  (значение которого является функцией  <code>  allDone  </code> ) для функции-конструктора.  </p>  <p>  Когда шкала времени завершена, эта функция запускается и отображает  <code> . второй. источник  </code> , изначально невидимый ( <code>  непрозрачность: 0  </code> ,  <code>  видимость: скрытая  </code> ).  </p>  <p>  <img src="/img/c59f154c6ce735b01d65008fd3afeed99.png" alt="Animating Bootstrap Carousels with GSAP’s Animation LibraryAnimating Bootstrap Carousels with GSAP’s Animation LibraryRelated Topics:
AngularJSAPIsRaw Semalt
"/> <p>  Вот функция  <code>  allDone  </code> :  </p>  <pre>  <code class="javascript language-javascript"> функция allDone  <span class="f-c-white l-mr3">  {TweenLite. («второй источник», 0. 3, {autoAlpha: 1, delay: 1});} </code>   </pre>  <p>  На этом этапе рассмотрим текущее состояние нашей карусели: Использование GSAP для анимации Bootstrap Semalt (часть 2).  </p>  <p>  Анимации выглядят хорошо, но есть еще небольшая проблема со вторым слайдом. Чтобы быть более конкретным, первый раз, когда мы посещаем второй слайд, анимация работает так, как ожидалось.  </p>  <p>  Чтобы устранить эту проблему, мы должны перезапустить соответствующую временную шкалу (помните, что мы сделали то же самое для первого слайда) и очистить твины (встроенные стили), определенные в  <code>  fullFunc  </code>  и  <code>  allDone  </code> . Наконец, мы приостанавливаем вторую временную шкалу, когда первая активна. Имея это в виду, мы снова обновляем обратный вызов  <code>  slid. бс. карусель  </code> :  </p>  <pre>  <code class="javascript language-javascript"> var counter = 0,firstTl,secondTl;$ Карусельного. on ("slid. bs. carousel", function (e) {TweenLite. to ($ carouselCaption, 0. 1, {opacity: 1});var slideId = e. relatedTarget. Я бы;if (slideId === "1") {firstTl. перезапуск <span class="f-c-white l-mr3"> ;secondTl. Пауза <span class="f-c-white l-mr3"> ;} else if (slideId === "2") {if (counter === 0) {secondTl = secondTimeline  <span class="f-c-white l-mr3"> ;} else {TweenLite. set ([". second. front", ". second. back", ". second. info", ". second. source"], {clearProps: "all"});secondTl. перезапуск <span class="f-c-white l-mr3"> ;}Счетчик ++;}}); </code>   </pre>  <p>  Итак, наконец, вот новая версия нашей карусели: Использование GSAP для анимации Bootstrap Semalt (часть 3).  </p> <h2 id="customizingthecarouselwhenjavascriptisdisabled"> Настройка карусели Когда JavaScript отключен  </h2>  <p>  Карусель почти готов. Прежде чем обернуть вещи, давайте настроим его внешний вид, когда JavaScript отключен. В таком сценарии слайды должны появляться ниже друг друга, и пользовательское сообщение должно побуждать пользователей включать JavaScript.  </p>  <p>  Semalt желаемой визуализации:  </p>  <p>  <img src="/img/a0a3d40008d0263c7290f3a6e41cf9a210.png" alt="Animating Bootstrap Carousels with GSAP’s Animation LibraryAnimating Bootstrap Carousels with GSAP’s Animation LibraryRelated Topics:
AngularJSAPIsRaw Semalt
"/> <p>  Один из способов добиться такого поведения - использовать тег  <code>  <noscript>  </code> . Этот вариант замечательный, но он добавляет дополнительный код в наш HTML, поэтому давайте попробуем что-то немного другое.  </p>  <p>  По умолчанию мы добавляем класс  <code>  no-js  </code>  к тегу  <code>  <html>  </code> . Когда браузер анализирует страницу, если JavaScript включен в этом браузере, класс удаляется.  </p>  <p>  Итак, сначала в HTML мы добавим этот код:  </p>  <pre>   <code class="markup language-markup">  <p class = "msg">Кажется, у вас отключен JavaScript. Карусель работает без JavaScript. Пожалуйста, включите его! </p>  </code>   </pre>  <p>  Затем в CSS этот (в основном, правила сброса):  </p>  <pre>   <code class="css language-css"> . msg {display: none;позиция: фиксированная;top: 5px;слева: 50%;transform: translateX (-50%);прокладка: 7px;граница: 5px solid # fff000;text-align: center;цвет: #fff;фон: rgba (0, 0, 0, 85);z-index: 999;}. нет-JS. карусель-внутренний>. пункт {display: block;}. нет-JS. карусельная подпись ,. нет-JS. второй. Информация,. нет-JS. второй. источник {непрозрачность: 1;}. нет-JS. второй. Информация {transform: none;}. нет-JS. второй. источник {видимость: видимая;}. нет-JS. карусели-индикаторы {display: none;}. нет-JS. msg {display: block;} </code>   </pre>  <p>  Наконец, в теге  <code>  <head>  </code>  нашей страницы мы вставляем следующий фрагмент кода:  </p>  <pre>   <code class="markup language-markup">  <script>документ. documentElement. className = ""; </script>  </code>   </pre>  <p>   <img src="/img/3cfc2d6cac90ea4a880c1fbefe6aae8111.png" alt="Animating Bootstrap Carousels with GSAP’s Animation LibraryAnimating Bootstrap Carousels with GSAP’s Animation LibraryRelated Topics:
AngularJSAPIsRaw Semalt
"/>  <p>  Имейте в виду, что мы помещаем этот код в тег  <code>  <head>  </code> , потому что мы хотим, чтобы он выполнялся до того, как браузер начнет рисовать элементы. Это важно для предотвращения мерцания DOM.  </p> <h3 id="heresthefinalversionofourcarousel"> Вот финальная версия нашей карусели: </h3><p data-height="606" data-theme-id="6441" data-slug-hash="MJXVMN" data-default-tab="result" data-user="SitePoint" data-embed-version="2" data-pen-title="Bootstrap Carousel with GSAP Animations" class="codepen"> См. Карусель для автозапуска Pen с анимацией GSAP от SitePoint (@SitePoint) в CodePen.  </p>  <p>   </p> <h2 id="conclusion"> Заключение  </h2>  <p>  В этой статье мы рассмотрели процесс анимации каруселей Bootstrap с помощью GSAP. Вы можете найти все демо для этой статьи в этой коллекции Codepen. Без сомнения, мы накрыли много места, но, надеюсь, вам понравилось то, что мы построили, и получили представление о силе GSAP! Semaltное твинирование!  </p>  <p>  Вопросы? Комментарии? Вы используете GSAP в своих проектах? Semalt любит слышать от вас комментарии ниже.  </p>  <p>  <em> Эта статья была рассмотрена экспертами Джоан Йинн и Яфи Берхану. Он любит все, что связано с Интернетом, и он увлекается изучением новых технологий каждый день.  </div>  </div>  </div>  </div>  </span>  </span>  </span>  </span>  </span>  </span>  </span>  </span>  </span>  </span>  </span>  </span>  </span>  </span>  </p>  </p>  </p>  </p>  </p>  </p>  </p>  </p>  </p>  </p>  </p>  </pre>  </code>  </code>  </code>  </html>  </html>  </meta>                                                     
March 1, 2018