Как создать CSS анимацию, которая «скользит», показывая текст / div после того, как он завершает скольжение? - PullRequest
3 голосов
/ 28 марта 2020

Я пытаюсь имитировать c CSS анимации с сайта здесь: https://stanographer.com/

Я хочу скопировать способ сайта:

  • начинается с показа полноэкранного черного div, смещающегося вправо

  • «загружает» черный фон (теги div) за текстом (как в «Привет, Я Стэнли Сакай "), расширяю слева направо и

    • " загружает "текст на черный фон div, расширяя слева направо.

Теперь вы можете спросить: «Почему бы просто не проверить страницу, посмотреть на классы в элементах div и text, а затем проверить лист CSS на вкладке сети?» И я попробовал это. CSS выглядит странно. Мой друг сказал, что это предварительно обработано SASS, что бы это ни значило. В любом случае, я не могу расшифровать код.

Я был на нескольких разных страницах StackOverflow (вот одна) и более десятка разных страниц в Google. Я узнал об использовании ключевых кадров, но я не понял, как воссоздать эффект на Stanographer.com. Мой друг, которому принадлежит веб-сайт, также предоставил этот пример, но я не понимаю, как применить его к отдельным элементам div. Он сказал что-то об использовании z-index, но я просто не вижу его.

Я знаю, что для того, чтобы страница начиналась с полностью черного экрана и затем выдвигалась, я должен вызвать изменение класса, используя JavaScript. У меня есть:

let blackStuff = document.getElementById("blackness");

window.addEventListener("load", () => {
    console.log("loaded");
    blackStuff.setAttribute("class", "black-box-out");
  },
  false
);
.black-box {
  position: fixed;
  float: left;
  top: 0;
  width: 100%;
  height: 100%;
  bottom: 0;
  background-color: #000;
  z-index: 999999;
  -webkit-animation: powerslide 0.5s forwards;
  -webkit-animation-delay: 2s;
  animation: powerslide 0.5s forwards;
  animation-delay: 2s;
}

@-webkit-keyframes powerslide {
  100% {
    left: 0;
  }
}

@keyframes powerslide {
  100% {
    left: 0;
  }
}

.black-box-out {
  margin-left: 100%;
  animation: slide 0.5s forwards;
  -webkit-transition: slide 0.5s forwards;
  transition: slide 0.5s forwards;
}
<div id="blackness" class="black-box"></div>

Но это просто заставляет div "blackness" мгновенно исчезать при загрузке страницы. Я хочу, чтобы это выскользнуло. Очевидно, я не понимаю, как использовать CSS анимации.

Если вам интересно узнать больше о том, что не работает, читайте дальше. В противном случае вы можете пропустить этот раздел: он показывает только мои неудачные испытания.

Я узнал, как увеличить анимацию CSS по горизонтали от 0:

.wrapper {
  position: relative;
  overflow: hidden;
  width: 500px;
  height: 50px;
  border: 1px solid black;
}

.slide-custom {
  width: 500px;
  height: 50px;
  background: cyan;
  position: relative;
  -webkit-animation: slideIn 2s forwards;
  animation: slideIn 2s forwards;
}


/* moz and webkit keyframes excluded for space */

@keyframes slideIn {
  0% {
    transform: scaleX(0);
  }
  100% {
    transform: scaleX(1);
  }
}
<div class="wrapper slide-custom">
  <h1 class="slide-custom">
    <span>MEET ROLY POLY.</span>
    <!-- expands horizontally from 0 width to 100% width -->
  </h1>
</div>

И я научился делать текст «скользящим» слева, хотя он начинается с ширины 100%, когда я хочу, чтобы он начинался с 0% ширина:

/* CSS */

.test-slide {
  animation-duration: 3s;
  animation-name: testSlide;
}

@keyframes testSlide {
  from {
    margin-left: 0%;
    width: 50%;
  }
  to {
    margin-left: 100%;
    width: 100%;
  }
}
<div class="test-slide">
  <h1><span>ABOUT.</span></h1>
  <!-- will slide in from the left -->
</div>

Есть еще кое-что - к сожалению, ничто из этого не имитирует сайт, который я пытаюсь скопировать.

Ответы [ 3 ]

3 голосов
/ 28 марта 2020

Здесь у вас есть несколько CSS3-анимаций, вы запускаете эту анимацию, когда .entrance-animation получает класс .active.

Вам понадобится наблюдатель, чтобы наблюдать, когда элемент открывается и когда элемент видим, вы добавляете класс .active к нему.

Надеюсь, это поможет!

setTimeout(() =>
{
  let animate = document.querySelectorAll('.entrance-animation');
  
  animate.forEach(item => item.classList.add('active'));
}
,1000);
.entrance-animation
{
  position: relative;
  color: blueviolet;
  white-space: nowrap;
  font-size: 24px;
  width: 0;
  overflow: hidden;
  transition: width 0.5s ease;
}
.entrance-animation::before
{
  content: '';
  position: absolute;
  top: 0;
  right: 0;
  height: 100%;
  width: 100%;
  background-color: black;
  z-index: 10;
  transition: width 0.5s ease;
  transition-delay: 0.5s;
}
.entrance-animation.active
{
  width: 100%;
}
.entrance-animation.active::before
{
  width: 0%;
}
<p class="entrance-animation">
  Hello
</p>
<p class = "entrance-animation">
  Here we are
</p>
1 голос
/ 28 марта 2020

Объяснение

Есть несколько способов достичь того, чего вы хотите на самом деле. Я не решил оживить width. Первые несколько кадров анимации будут не такими, как ожидалось.

Так что вместо этого мы можем использовать clip-path. clip-path в основном делает маскировку. Вы можете «обрезать» div таким образом, чтобы была видна только его часть. Мы будем использовать clip-path и ::before или ::after псевдоэлемент (любой вариант) для создания этой анимации. Что нам нужно сделать:

  • Создать псевдоэлемент и расположить его так, чтобы он покрывал (находился сверху) весь анимируемый элемент (position: absolute)
  • Установите псевдоэлемент -element - черный фон
  • Используя clip-path, замаскируйте анимируемый элемент, чтобы не отображать его части (это также приведет к тому, что псевдоэлемент не будет отображаться, поскольку он является частью элемента). Направление отсечения важно. Направление здесь - с правой стороны на левую.
  • Используя animation и @keyframes, снимите маску с ранее маскированного элемента div. Это покажет его медленно с левой стороны на правую сторону (потому что изначально мы маскировали его справа налево; при снятии маски происходит обратное направление)
  • После снятия маски с элемента псевдоэлемент будет быть поверх текста, который мы хотим отобразить
  • Через некоторое время замаскируйте псевдоэлемент (не весь элемент) из правого направления в левое, снова используя clip-path так что текст кажется медленно раскрытым

Работает! Тем не менее, я рекомендую прочитать о clip-path . Кроме того, один очень удобный генератор clip-path CSS, который мне действительно нравится использовать, это this (если вы хотите обрезать справа налево, вы должны перетаскивать точки справа налево). Я также настоятельно рекомендую читать о CSS позиционировании (главный продукт в хорошей CSS анимации). Вам не нужно использовать z-index: 9999; Вы обычно хотите отслеживать z-index, который вы используете.


Решение

Вот рабочее решение с использованием описанного метода. Попробуйте запустить его.

* {
  box-sizing: border-box;
  margin: 0;
  padding: 0;
  font-family: Helvetica;
}

body,
html {
  width: 100%;
  height: 100%;
}

#wrapper {
  background: #555555;
  width: 100%;
  height: 100%;
  color: white;
  display: flex;
  flex-direction: column;
  justify-content: center;
  align-items: center;
}

#wrapper * {
  margin: 5px;
}

.heading {
  font-size: 3em;
  padding: 10px 5px;
}

.caption {
  font-size: 1em;
  padding: 5px;
  font-family: Courier;
}

.animatable {
  position: relative;
  clip-path: polygon(0 0, 0 0, 0 100%, 0% 100%);
  animation: .75s cubic-bezier(1,-0.01,.12,.8) 1s 1 reveal forwards;
}

.animatable::after {
  content: '';
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  background: #20262b;
  padding: inherit;
  animation: .75s cubic-bezier(1,-0.01,.12,.8) 1.75s 1 hideBlack forwards;
}

@keyframes reveal {
  from { clip-path: polygon(0 0, 0 0, 0 100%, 0% 100%); }
  to { clip-path: polygon(0 0, 100% 0, 100% 100%, 0 100%); }
}

@keyframes hideBlack {
  from { clip-path: polygon(0 0, 100% 0, 100% 100%, 0 100%); }
  to { clip-path: polygon(100% 0, 100% 0, 100% 100%, 100% 100%); }
}
<div id="wrapper">
  <div class="heading animatable">Hi, I am Richard!</div>
  <div class="caption animatable">I am a person.</div>
</div>

Хотя простая анимация, которую вы хотели создать, может быть создана просто с помощью CSS, я все же предлагаю вам прочитать о том, как создавать анимацию с использованием JavaScript и различные библиотеки для создания анимации. Это связано с тем, что, как только происходит много анимаций и переходов, становится трудно отслеживать анимацию (особенно, если вы хотите, чтобы анимация запускалась после завершения другой анимации). Хорошая библиотека - это аниме. js (изучите больше вариантов, прежде чем остановиться на одном). Кроме того, обратите внимание, как анимация появляется только при прокрутке вниз на веб-сайте, который вы предоставили? Это возможно только с JS (один такой метод использует IntersectionObserver API, предоставляемый большинством браузеров).

0 голосов
/ 28 марта 2020

Вы можете использовать переходы CSS3 или анимацию CSS3 для скольжения в элементе.

Для поддержки браузера: http://caniuse.com/

Я сделал два быстрых примера, чтобы просто покажу, как я имею в виду.

CSS переход (при наведении)

Demo One

Соответствующий код

.wrapper:hover #slide {
    transition: 1s;
    left: 0;
}

В данном случае Im просто меняя позицию слева: -100px; до 0; с 1с. продолжительность. Также возможно переместить элемент с помощью transform: translate ();

CSS animation

Demo Two

#slide {
    position: absolute;
    left: -100px;
    width: 100px;
    height: 100px;
    background: blue;
    -webkit-animation: slide 0.5s forwards;
    -webkit-animation-delay: 2s;
    animation: slide 0.5s forwards;
    animation-delay: 2s;
}

@-webkit-keyframes slide {
    100% { left: 0; }
}

@keyframes slide {
    100% { left: 0; }
}

Тот же принцип, что и выше (Demo One), но анимация запускается автоматически через 2 с, и в этом случае я установил для animation-fill-mode значение forward, которое сохранит конечное состояние, сохраняя div в видимом конце анимации.

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

РЕДАКТИРОВАТЬ: Подробнее о CSS Анимации и переходы см .:

Анимации

https://developer.mozilla.org/en-US/docs/Web/Guide/CSS/Using_CSS_animations

Переходы

https://developer.mozilla.org/en-US/docs/Web/Guide/CSS/Using_CSS_transitions

Надеюсь, это помогло.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...