Baymax w CSS

Użyjmy CSS, aby stworzyć bohatera o imieniu Baymax z filmu Big Hero 6.

W tym artykule będziemy animować obraz tła jak również efekt czasowy subtelnej animacji oraz wykonamy demo w CSS pojedynczego elementu HTML.

Tutaj możesz obejrzeć rezultat na pełnym ekranie.

Pojedynczy element

Wykorzystując pseudo-elementy, będziemy w stanie stworzyć fragmenty twarzy używając jeden element HTML.

<div class="baymax"></div>

Stylizacja

Aby skonfigurować scenę, dodamy subtelny gradient na ekran, aby wyglądała jak zakrzywiona biała głowa. Do tego użyjemy radialny gradient na body.

body {
  background: radial-gradient(circle at center, #fff, #fff 50%, #aaa);
  background-size: 100%;
  background-repeat: no-repeat;
  height: 100vh;
}

Następnie ustawimy twarz na środku strony. Usta to prosta czarna linia, którą stworzymy korzystając z ramki.

.baymax {
  border-bottom: 1.5em solid #000;
  position: absolute;
  top: 50%;
  left: 50%;
  width: 50%;
  transform: translate(-50%, -40%);
}

Pierwsza właściwość szerokość czarnej ramki na 1.5em. Następnie umieszczamy linię używając pozycjonowania absolutnego, przesuwając w dół o 50% i w prawo o 50%. Wartości 50% odnoszą się do rozmiaru elementu kontenera (body)

Pojawia się problem z elementem, który rozpoczyna się na środku i biegnie w prawo przez ekran. Nie jest na środku

Aby skorygować to, użyjemy transformacji, aby przesunąć element w lewo o 50% szerokości i w górę o 40% szerokości.

Na tym etapie usta są wyśrodkowane w ten sposób:

Dodawanie oczu

Użyjemy pseudo-elementów before i after, aby dodać oczy do twarzy. Nie będą wymagały żadnego dodatkowego kodu HTML i mogą być całkowicie obsługiwane za pomocą CSS.

.baymax::before {
  background: #000;
  border-radius: 50%;
  content: "";
  position: absolute;
  width: 12em;
  height: 12em;
  left: -9em;
  top: -6em;
  transform: skewX(-4deg);
}

.baymax::after {
  background: #000;
  border-radius: 50%;
  content: "";
  position: absolute;
  width: 12em;
  height: 12em;
  right: -9em;
  top: -6em;
  transform: skewX(4deg);
}

Każdy pseudo-element posiada czarne tło i ramkę radialną ustawioną na 50%, aby były okrągłe. Każdy jest umieszczony na końcach ust oraz posiada transformację skew, aby wyglądały na delikatnie pochylone Rezultat powinien wyglądać tak:

Niski poziom baterii

W filmie możemy zobaczyć zabawną scenę, gdzie bateria Baymaxa jest słaba. Zatacza się i jego powieki opadają. Możemy skorzystać z kombinacji gradientów tła i animacji, aby stworzyć ten efekt.

Najpierw chcemy nadać tłu dwa kolory. Czarny dla fragmentu, kiedy oko jest otwarte i biały dla powieki. Biały fragment musi być umieszczony poza oczami na początku, a następnie będziemy animować w dół wykonując opadanie powiek.

.baymax::before {
  background: linear-gradient(to bottom, #efefef, #efefef 50%, #000 50%, #000);
  background-position: 0 -100%;
  background-size: 200%;
  ...
}

.baymax::after {
  background: linear-gradient(to bottom, #efefef, #efefef 50%, #000 50%, #000);
  background-position: 0 -100%;
  background-size: 200%;
  ...
}

Dodajemy gradient liniowy tła, ustawiamy mu dwukrotność wysokości kontenera i umieszczamy go w ten sposób, że górna połowa znajduje się poza kontenerem.

Po umieszczeniu dwóch gradientów tła, możemy dodać animację keyframes, aby sterować ruchem powiek.

@keyframes blink {
  0%, 50% {
    background-position: 0 100%;
  }
  85%, 95% {
    background-position: 0 75%;
  }
  100% {
    background-position: 0 100%;
  }
}

Animacja keyframes jest sposobem na opisanie serii klatek używając wartości procentowych. Wartość procentowa odnosi się do czasu trwania animacji. Wartość 50% oznacza, że połowę czasu trwania animacji.

W ten sposób możemy ustawić tło, aby pozostało w górze przez połowę czasu, następnie od 50% do 85% przesunęło się w dół, by na końcu animacji wrócić do góry.

Kolejnym etapem jest przekazanie pseudo-elementom, aby używały klatek kluczowych animacji. Dodaj właściwość animation do istniejących stylów.

.baymax::before {
  animation: blink 6s infinite;
  ...
}

.baymax::after {
  animation: blink 6s 0.1s infinite;
  ...
}

Tutaj powiedzieliśmy przeglądarce, aby używała animacji blink na każdym elemencie. Animacja trwa 6 sekund i będzie się powtarzała w nieskończoność.

Dodatkowa właściwość znajduje się w drugim przykładzie. 0.1s po 6s mówi przeglądarce, aby opóźniła animację o 0.1 sekundy. W ten sposób drugie oko zamyka się nieco później niż pierwsze. To dodaje efekt zmęczenia i sprawia, że animacja wygląda bardziej naturalnie. Wynik końcowy powinien wyglądać tak:

Tutaj możesz obejrzeć rezultat na pełnym ekranie.

Przeglądarki

W kodzie pominąłem wszystkie typowe prefiksy -webkit i -moz. Właściwości transform i animation powinny posiadać prefiksy i zalecam wykorzystanie do tego Autoprefixera.

Wersja gif do udostępnienia

Poniżej znajduje się wersja gif, którą możesz z łatwością udostępnić w internecie.