Różne sposoby animowania obramowania w CSS
Ustawianie obramowania
Obramowanie elementu można ustawić na kilka sposobów: border
, outline
i box-shadow
. Zgodnie z opisem w artykule The 3 CSS Methods for Using Element Borders Stephanie Eckles, każde z tych rozwiązań ma swoje zalety i wady, zwłaszcza jeśli chodzi o animowanie granic. Główną przyczyną nieużywania odpowiedniego elementu border
CSS jest tworzenie animacji.
Ostatnio zwrócił moją uwagę na artykuł Fantastyczna animacja obramowania CSS, w której autor Coco badał więcej opcji. Wstrzyknięcie wygenerowanej treści za pomocą elementów ::before
i ::after
powoduje utworzenie sztucznego obramowania, które jest następnie animowane.
Najbardziej wyróżniają się powiązane z nim animowane wizualizacje wykorzystane w artykule. Dzięki nim można dokładnie wyjaśnić, co się robi, aby uzyskać pożądany efekt.
Wygenerowaną treść stanowi zarówno warstwa biała, jak i kolorowe linie. Rozjaśniając białą warstwę do przodu i z niej staje się jasne, w jaki sposób się łączą i jak działa animacja.
Zachowywanie modelu pudełka
Wadą wykorzystania wygenerowanych treści do imitowania obramowania jest uszkodzenie modelu ramki. Treści mogą teraz zasłonić sztuczną ramkę, bo pod spodem jest namalowana „obramowanie”. Aby zniwelować, musisz zastosować żądane border-width
jako padding
.
Aby uzyskać prawdziwe obramowanie, a tym samym zachować działanie modelu ramki, możesz użyć wielu teł, które rozciąga się następnie na cały obszar.
Podstawy
Zacznijmy od utworzenia ramki przerywanej i dodania wielu tła.
/* Size of the border */
--border-size: 0.5rem;
/* Create a dotted border */
border: var(--border-size) dotted lime;
/* Create two background layers:
1. A white semi-transparent
2. A layer with the colored boxes
*/
background-image:
linear-gradient(to right, rgb(255 255 255 / 0.5), rgb(255 255 255 / 0.5)),
conic-gradient(
from 45deg,
#d53e33 0deg 90deg,
#fbb300 90deg 180deg,
#377af5 180deg 270deg,
#399953 270deg 360deg
)
;
Wybieram rozmiar tła za pomocą background-origin
Jak widać, z tłem coś zabawnego dzieje się – są pomalowane w obramowanie, ale tekst conic-gradient
wydaje się być niewłaściwy. To jest faktycznie zamierzone działanie: domyślnie obrazy tła nie są wyświetlane w obramowaniu, ponieważ ich źródłem jest padding-box
elementu. Aby utworzyć obramowanie, ustawione obrazy tła powtarzają się w samym obramowaniu, co daje dziwny efekt wizualny.
Aby rozwiązać ten problem, musisz rozciągnąć tło, tak aby zajmowało rozmiar obramowania. Możesz to zrobić ręcznie, rozciągając i zmieniając położenie tła, ale najlepiej jest użyć właściwości background-origin
, aby ustawić rozmiar tła względem elementu border-box
.
/* Manually add or offset the size of the border where needed */ background-position: calc(var(--border-size) * -1) calc(var(--border-size) * -1); background-size: calc(var(--border-size) * 2 + 100%) calc(var(--border-size) * 2 + 100%);
background-origin: border-box;
Teraz wszystko wygląda lepiej:
Zmniejszanie białej warstwy tła za pomocą funkcji background-clip
Tło zajmuje teraz całą przestrzeń, dlatego trzeba ponownie zmniejszyć półprzezroczystą warstwa. Zamiast znów przeglądać background-size
, możesz to zrobić na łatwiejszy sposób: użyj background-clip
i ustaw jego wartość padding-box
. Dzięki temu tło nie będzie już rysowane poniżej obszaru obramowania.
background-clip:
padding-box, /* Clip white semi-transparent to the padding-box */
border-box /* Clip colored boxes to the border-box (default) */
;
Na koniec zmień obramowanie na: transparent
, aby uzyskać pełny efekt.
border: 0.3rem dotted transparent;
Animacja
Aby przywrócić animację obramowania, możesz zmienić kąt początkowy elementu conic-gradient
.
--angle: 0deg;
conic-gradient(
from var(--angle),
#d53e33 0deg 90deg,
#fbb300 90deg 180deg,
#377af5 180deg 270deg,
#399953 270deg 360deg
);
Dzięki @property jest to niezwykle proste w przeglądarkach, które ją obsługują:
@property --angle {
syntax: "<angle>";
initial-value: 0deg;
inherits: false;
}
@keyframes rotate {
to {
--angle: 360deg;
}
}
Łącznie daje to następujący kod:
Dodatkowa treść: border-image
Omówionym wcześniej sposobem rysowania obramowania w postaci gradientu jest użycie arkusza CSS border-image
.
Pozwalają na użycie prostszego kodu, który eliminuje konieczność zajmowania się pokrywającymi się tłami. Animację można zastosować w taki sam sposób jak poprzednio.
/* Create a border */
border: 0.5rem solid transparent;
/* Paint an image in the border */
border-image:
conic-gradient(
from var(--angle),
#d53e33 0deg 90deg,
#fbb300 90deg 180deg,
#377af5 180deg 270deg,
#399953 270deg 360deg
) 1
;
Możesz jednak zauważyć kilka rzeczy, które przestaną działać w ramach tego podejścia:
border-image
nie nabiega poborder-radius
; zawsze pozostanie prostokątny.- Gdy ustawiasz wypełnienie w polu
border-image-slice
, elementborder-image
nie jest malowany poniżej zestawubackground
, lecz na górze. Może to być kłopotliwe, jeśli tło ma być półprzezroczyste.
Zamykam
Istnieje wiele możliwości animowania obramowań w CSS. W zależności od konkretnego przypadku użycia możesz wybrać jedną lub drugą z nich.