169 votes

Imiter une balise de clignotement avec des animations CSS3

Je veux vraiment faire clignoter un morceau de texte dans le style old-school sans utiliser javascript ni text-decoration.

Pas de transitions, seulement *clignotant*, *clignotant*, *clignotant*!


C'est différent de cette questioncar je demande un clignotement sans transitions continues, tandis que l'auteur de l'autre question demande comment remplacer le clignotement par des transitions continues.

1 votes

La meilleure réponse que j'ai trouvée pour cela a malheureusement été supprimée par l'auteur original, @m93a, donc elle ne peut pas être encore notée. Je pense que la réponse devrait être restaurée et notée, car c'est la solution la plus simple qui produit le meilleur effet de clignotement, et cela fonctionne dans toutes les versions actuelles des principaux navigateurs. Vous pouvez également lire un court article de blog sur la même solution sur L'émulation de en utilisant l'animation CSS3 de WebKit.

0 votes

Ce que je ne comprends pas, c'est pourquoi chaque réponse ici semble avoir la règle @-webkit-keyframes après la règle non préfixée @keyframes, et certaines ont même la déclaration -webkit-animation après celle non préfixée.

0 votes

@BoltClock: C'est parce que les animations CSS3 sont relativement nouvelles et pas encore stables dans les navigateurs Webkit. Le prétendu "prefix" est là pour les développeurs qui veulent utiliser des animations même si elles ne sont pas stables et terminées.

281voto

Neil Points 24938

L'original de Netscape avait un cycle de devoir de 80%. Cela s'en approche assez, bien que le vrai n'affecte que le texte:

.blink {
  animation: blink-animation 1s steps(5, start) infinite;
  -webkit-animation: blink-animation 1s steps(5, start) infinite;
}
@keyframes blink-animation {
  to {
    visibility: hidden;
  }
}
@-webkit-keyframes blink-animation {
  to {
    visibility: hidden;
  }
}

Ceci est du texte clignotant.

Vous pouvez trouver plus d'informations sur les animations de trame clé ici.

2 votes

Oui, c'est beaucoup plus simple. Vous pouvez ajouter le préfixe webkit pour le faire fonctionner dans Chrome et Safari.

2 votes

Cela pourrait ne pas fonctionner sur Chrome / Safari sans les préfixes webkit.

2 votes

Ce que j'aime faire, c'est, au lieu de faire de blink une classe, faire de blink une balise (avec blink { animation: blink 1s steps(5, start) infinite; -webkit-animation: blink 1s steps(5, start) infinite; }). De cette façon, vous pouvez simplement utiliser la balise , au lieu de \=)

122voto

m93a Points 860

Laissez-moi vous montrer un petit truc.

Comme l'a dit Arkanciscan ici, vous pouvez utiliser des transitions CSS3. Mais sa solution semble différente de la balise originale.

Ce que vous devez vraiment faire est ceci :

@keyframes blink {
  50% {
    opacity: 0.0;
  }
}
.blink {
  animation: blink 1s step-start 0s infinite;
}

Clignoter

Démo JSfiddle

0 votes

@Forty-Two Désolé, j'ai oublié le préfixe -webkit-. Je pense que cela a fonctionné pour tous les navigateurs actuels sauf Chrome et Safari. Maintenant, après la mise à jour, cela devrait fonctionner pour Firefox, Chrome, Opera, Safari et MSIE10.

0 votes

Tel qu'écrit, cette réponse fonctionnera effectivement dans les versions actuelles de Firefox, Chrome, Safari et IE.

2 votes

N'a pas fonctionné à cause d'une faute de frappe : sur la partie webkit, le nom de l'animation, blink, était manquant. Corrigé.

51voto

Belyash Points 351

Essayez ce CSS

@keyframes blink {  
  0% { color: red; }
  100% { color: black; }
}
@-webkit-keyframes blink {
  0% { color: red; }
  100% { color: black; }
}
.blink {
  -webkit-animation: blink 1s linear infinite;
  -moz-animation: blink 1s linear infinite;
  animation: blink 1s linear infinite;
} 

Ceci est clignoter

​ Vous avez besoin de préfixes spécifiques au navigateur/fournisseur : http://jsfiddle.net/es6e6/1/.

1 votes

Il n'y a rien comme -ms-animation ou -o-animation et -moz-animation n'était présent que dans la version 15, ne l'utilisez pas maintenant. Regardez caniuse.com pour voir le support réel. Désolé mais je n'accepterai pas cette question :( PS : Vous pouvez utiliser 'éditer' sur les réponses des autres.

0 votes

C'est juste mon ancienne mauvaise habitude - ajouter des suffixes à toutes les nouvelles propriétés CSS3.. Réponse mise à jour.

0 votes

C'est non "blink" mais "blink-fadeOut".

35voto

S.B. Points 948

En réalité, il n'est pas nécessaire d'utiliser la visibility ou l'opacity - vous pouvez simplement utiliser la color, qui a l'avantage de limiter le "clignotement" au texte uniquement :

blink {
    display: inline;
    color: inherit;
    animation: blink 1s steps(1) infinite;
    -webkit-animation: blink 1s steps(1) infinite;
}
@keyframes blink { 50% { color: transparent; } }
@-webkit-keyframes blink { 50% { color: transparent; } }

Voici un peu de texte, ce texte clignotera, celui-ci ne clignotera pas.

Fiddle : http://jsfiddle.net/2r8JL/

5 votes

Formidable! C'est la seule solution qui permet le clignotement du texte uniquement. Toutes les autres solutions font clignoter également l'arrière-plan de l'élément. Pour tester, utilisez un avec du texte blanc sur fond bleu contre un avec un arrière-plan vert. Seule cette solution n'affichera pas de clignotement de l'arrière-plan du span bleu.

0 votes

Cette solution est la meilleure, car le texte ne clignote pas lorsqu'il est sélectionné. Bon pour l'accessibilité.

0 votes

Et un vote supplémentaire pour steps(1). Cela réduit beaucoup la charge CPU lorsqu'il y a plusieurs éléments qui clignotent sur la page. Aucune étape intermédiaire n'a besoin d'être calculée.

10voto

airtonix Points 1048

Je vais en enfer pour ça :

=keyframes($name)
  @-webkit-keyframes #{$name}
    @content
  @-moz-keyframes #{$name}
    @content
  @-ms-keyframes #{$name}
    @content
  @keyframes #{$name}
    @content

+keyframes(blink)
  25%
    zoom: 1
    opacity: 1

  65%
    opacity: 1 

  66%
    opacity: 0

  100%
    opacity: 0

body
  font-family: sans-serif
  font-size: 4em
  background: #222
  text-align: center

  .blink
    color: rgba(#fff, 0.9)
    +animation(blink 1s 0s reverse infinite)
    +transform(translateZ(0))

.table
  display: table
  height: 5em
  width: 100%
  vertical-align: middle

  .cell
    display: table-cell
    width: 100%
    height: 100%
    vertical-align: middle

http://codepen.io/anon/pen/kaGxC (sass avec bourbon)

1 votes

Votre codepen génère une erreur Mixin 'expérimental' indéfini., et il semble donc qu'il ne compilera pas et n'affichera pas l'animation de clignotement.

2 votes

C'est pourquoi il est allé en enfer pour cela.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X