recherche
Maisoninterface Webtutoriel CSSComment animer un SVG avec l'image de bordure

Créer des effets de bordure dynamique à l'aide de l'attribut border-image de CSS et de SVG animé

Cet article présentera comment combiner l'attribut border-image de CSS et de SVG animé pour créer un effet d'animation SVG dynamique entourant la frontière. Nous apprendrons comment les SVG animés à neuf grilles résidants à la main qui peuvent non seulement reproduire cet effet, mais aussi le personnaliser en fonction de vos besoins.

L'effet final est le suivant:

Comment animer un SVG avec l'image de bordure

Cette animation fait en fait partie d'un puzzle de prise de drapeau que je développe appelé "le crâne" pour explorer la structure interne de l'Arduino et de son microcontrôleur. J'ai cherché comment créer une bordure animée comme celle-ci, mais je n'ai trouvé aucun exemple utile. La plupart des contenus que j'ai trouvés sont liés à l'effet "Ant March", mais malheureusement, l'astuce stroke-dasharray ne fonctionne pas avec les crânes, et encore moins des formes plus complexes.

Par conséquent, dans un esprit d'apprentissage et de partage, je partagerai mon expérience avec vous ici!

Dois-je utiliser background ou border-image ?

Au début, je ne connaissais même pas l'existence de border-image . Dans ma première tentative, j'ai essayé d'utiliser ::before pseudo-élément et animer son attribut background-position . Les résultats sont les suivants:

Comme vous pouvez le voir, cette méthode fonctionne, mais pour terminer toute la frontière, au moins huit éléments différents (ou pseudo-éléments) sont nécessaires. Cela confondera le code HTML et n'est pas idéal.

J'ai posté une question dans le groupe Facebook du développeur CSS israélien et tout le monde a souligné border-image . Il correspond exactement à ce qu'il s'appelle: utilisez une image (ou un gradient CSS) comme bordure de l'élément.

Pour utiliser border-image vous devez fournir une image qui est utilisée de manière à neuf grilles (imaginez superposer une grille d'orteil tic sur l'image). Chacune de ces neuf zones représente une partie différente de la frontière: le haut, la droite, la gauche et le bas, les quatre coins et le milieu (la partie centrale sera ignorée).

Par exemple, si nous n'avons besoin que de crânes statiques, nous pouvons utiliser le motif SVG pour répéter les crânes neuf fois. Tout d'abord, nous utilisons le chemin du crâne pour définir un motif 24 × 24, puis utilisons ce motif comme un remplissage pour le rectangle 72 × 72:

<svg height="72" version="1.1" width="72" xmlns="http://www.w3.org/2000/svg"><defs><pattern height="24" patternunits="userSpaceOnUse" width="24"><path d="..." fill="red"></path></pattern></defs><rect fill="url(#skull-fill)" height="72" width="72"></rect></svg>

Ensuite, nous définissons une bordure et définissons border-image de l'élément cible: nous

 .skulls {
  Border: 24px solide transparent;
  Border-Image: URL ("https://skullctf.com/images/skull-9.svg") 24 tour;
}

De cette façon, nous obtenons une frontière composée de crânes:

Ajouter l'animation SVG

Maintenant, nous pouvons ajouter des animations à ces crânes! Cela fonctionne bien la plupart du temps.

L'idée est de créer différentes animations pour chaque zone de l'image de bordure. Par exemple, dans le coin supérieur gauche, nous avons un crâne se déplaçant de droite à gauche, tandis que l'autre crâne se déplaçant de haut en bas en même temps.

Nous animerons transform pour réaliser l'effet de mouvement. Nous utiliserons également SVG<use></use> Éléments pour éviter de longues répétitions répétées pour chaque crâne<path></path> définition:

<svg height="96" version="1.1" width="96" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
  @KeyFrames Left {to {transform: tradlate (-32px, 0)}}
  @KeyFrames Down {to {transform: tradlate (0, 32px)}}
 <defs><path d="..." fill="red"></path></defs><use href="#skull" style="animation: down .4s infinite linear" x="0" y="0"></use><use href="#skull" style="animation: left .4s infinite linear" x="32" y="0"></use></svg>

La syntaxe d'animation SVG ici peut sembler familière, car ce n'est pas une sorte de syntaxe spécifique à SVG, comme SMIL, mais utilise des animations CSS. Très cool, non?

L'effet final est le suivant:

Si nous ajoutons une grille, nous pouvons voir que cette animation couvre également une partie des bords supérieurs et gauche:

Après avoir ajouté les trois bords restants, il semble plus impressionnant, couvrant ainsi complètement huit zones de l'image de la bordure:

<svg height="96" version="1.1" width="96" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
  @KeyFrames Left {to {transform: tradlate (-32px, 0)}}
  @KeyFrames Down {to {transform: tradlate (0, 32px)}}
  @KeyFrames Right {to {transform: tradlate (32px, 0)}}
  @keyframes up {to {transform: tradlate (0, -32px)}}
 <defs><path d="..." fill="red"></path></defs><use href="#skull" style="animation: down .4s infinite linear" x="0" y="0"></use><use href="#skull" style="animation: left .4s infinite linear" x="32" y="0"></use><use href="#skull" style="animation: left .4s infinite linear" x="64" y="0"></use><use href="#skull" style="animation: up .4s infinite linear" x="64" y="32"></use><use href="#skull" style="animation: down .4s infinite linear" x="0" y="32"></use><use href="#skull" style="animation: right .4s infinite linear" x="0" y="64"></use><use href="#skull" style="animation: right .4s infinite linear" x="32" y="64"></use><use href="#skull" style="animation: up .4s infinite linear" x="64" y="64"></use></svg>

Cela nous fournit une boucle complète:

Allons tout ensemble et nous utilisons le SVG d'animation que nous venons de créer comme border-image pour obtenir le résultat souhaité:

Je peux jouer ça toute la journée ...

Quand je l'ai fait fonctionner, j'ai commencé à ajuster les propriétés d'animation. C'est l'un des avantages de l'utilisation de SVG au lieu du GIF: changer la nature de l'animation est aussi simple que de modifier une propriété CSS dans le fichier source SVG, vous pouvez voir les résultats immédiatement, sans parler des tailles de fichiers plus petites (en particulier lorsque vous traitez avec les gradients), la prise en charge des couleurs et la mise à l'échelle claire.

Tout d'abord, j'essaie de voir à quoi cela ressemblerait si je change la fonction de synchronisation d'animation pour ease :

Nous pouvons également faire disparaître le crâne entre le rouge et le vert:

Nous pouvons même faire changer la direction du crâne lorsqu'il se déplace autour du tableau de score élevé:

Vous pouvez accéder à l'onglet JavaScript où vous pouvez ajuster le code source SVG et l'essayer vous-même.

Éléphant dans la pièce (ahem, firefox)

Quand je l'ai fait travailler, j'étais tellement heureuse. Cependant, il y a certaines choses auxquelles vous devriez faire attention. Le premier et le plus important est que pour une raison quelconque, Firefox ne rend pas des animations sur les bords des frontières, seulement des animations dans les coins:

Fait intéressant, si je change le SVG en un GIF avec la même animation, cela fonctionne parfaitement. Cependant, les animations de bord sur Chrome Stop! ? ‍️

Quoi qu'il en soit, cela semble être une erreur de navigateur, car Firefox anime les bords si nous modifions border-image-repeat pour stretch , mais le résultat est un peu bizarre (bien qu'il puisse s'adapter au sujet de la page):

La modification border-image-repeat à space semble également fonctionner, mais seulement si la largeur de l'élément n'est pas un multiple entier de la taille du crâne (dans ce cas 32 pixels), ce qui signifie qu'il y aura quelques lacunes dans l'animation.

J'ai également constaté que lorsque la taille du conteneur n'est pas un multiple de la taille du patch (dans ce cas 32 pixels), il y a des problèmes visuels comme de minuscules lignes noires sur le crâne. Je soupçonne que cela a quelque chose à voir avec un problème d'arrondi à point flottant. Il a également tendance à se casser lors du zoom.

Pas parfait, mais absolument fini! Si vous voulez voir la version finale, vous pouvez visiter la page de score élevé de "The Skull". J'espère que vous verrez votre nom bientôt!

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Qu'est-ce que CSS Grid?Qu'est-ce que CSS Grid?Apr 30, 2025 pm 03:21 PM

CSS Grid est un outil puissant pour créer des dispositions Web complexes et réactives. Il simplifie la conception, améliore l'accessibilité et offre plus de contrôle que les méthodes plus anciennes.

Qu'est-ce que CSS Flexbox?Qu'est-ce que CSS Flexbox?Apr 30, 2025 pm 03:20 PM

L'article traite de CSS Flexbox, une méthode de mise en page pour l'alignement et la distribution efficaces de l'espace dans les conceptions réactives. Il explique l'utilisation de Flexbox, la compare à la grille CSS et détaille la prise en charge du navigateur.

Comment pouvons-nous rendre notre site Web réactif à l'aide de CSS?Comment pouvons-nous rendre notre site Web réactif à l'aide de CSS?Apr 30, 2025 pm 03:19 PM

L'article traite des techniques de création de sites Web réactifs à l'aide de CSS, y compris des balises de méta de la fenêtre, des grilles flexibles, des médias fluides, des requêtes multimédias et des unités relatives. Il couvre également l'utilisation de la grille CSS et de Flexbox ensemble et recommande le cadre CSS

Que fait la propriété CSS Box-Sizizing?Que fait la propriété CSS Box-Sizizing?Apr 30, 2025 pm 03:18 PM

L'article traite de la propriété CSS-Box-Sizing, qui contrôle comment les dimensions des éléments sont calculées. Il explique des valeurs telles que la boîte de contenu, la boîte de bordure et la boîte de padding, et leur impact sur la conception de la disposition et l'alignement de la forme.

Comment pouvons-nous animer à l'aide de CSS?Comment pouvons-nous animer à l'aide de CSS?Apr 30, 2025 pm 03:17 PM

L'article discute de la création d'animations à l'aide de CSS, de propriétés clés et de combinaison avec JavaScript. Le principal problème est la compatibilité du navigateur.

Pouvons-nous ajouter des transformations 3D à notre projet en utilisant CSS?Pouvons-nous ajouter des transformations 3D à notre projet en utilisant CSS?Apr 30, 2025 pm 03:16 PM

L'article discute de l'utilisation de CSS pour les transformations 3D, les propriétés clés, la compatibilité du navigateur et les considérations de performances pour les projets Web. (Compte de caractère: 159)

Comment pouvons-nous ajouter des gradients dans CSS?Comment pouvons-nous ajouter des gradients dans CSS?Apr 30, 2025 pm 03:15 PM

L'article discute de l'utilisation des gradients CSS (linéaire, radial, répétant) pour améliorer les visuels du site Web, l'ajout de profondeur, de concentration et d'esthétique moderne.

Que sont les pseudo-éléments dans CSS?Que sont les pseudo-éléments dans CSS?Apr 30, 2025 pm 03:14 PM

L'article traite des pseudo-éléments dans CSS, de leur utilisation dans l'amélioration du style HTML et des différences par rapport aux pseudo-classes. Fournit des exemples pratiques.

See all articles

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

Video Face Swap

Video Face Swap

Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Outils chauds

SublimeText3 Linux nouvelle version

SublimeText3 Linux nouvelle version

Dernière version de SublimeText3 Linux

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

PhpStorm version Mac

PhpStorm version Mac

Le dernier (2018.2.1) outil de développement intégré PHP professionnel

mPDF

mPDF

mPDF est une bibliothèque PHP qui peut générer des fichiers PDF à partir de HTML encodé en UTF-8. L'auteur original, Ian Back, a écrit mPDF pour générer des fichiers PDF « à la volée » depuis son site Web et gérer différentes langues. Il est plus lent et produit des fichiers plus volumineux lors de l'utilisation de polices Unicode que les scripts originaux comme HTML2FPDF, mais prend en charge les styles CSS, etc. et présente de nombreuses améliorations. Prend en charge presque toutes les langues, y compris RTL (arabe et hébreu) ​​et CJK (chinois, japonais et coréen). Prend en charge les éléments imbriqués au niveau du bloc (tels que P, DIV),

Télécharger la version Mac de l'éditeur Atom

Télécharger la version Mac de l'éditeur Atom

L'éditeur open source le plus populaire