Imiter une balise clignotante avec des animations CSS3

149

Je veux vraiment faire clignoter un morceau de texte dans le style old-school sans utiliser de javascript ou de décoration de texte.

Pas de transitions, seulement * clignotement *, * clignotement *, * clignotement *!


EDIT : C'est différent de cette question parce que je demande un clignotement sans transitions continues, alors que OP des autres questions demande comment remplacer le clignotement par des transitions continues

m93a
la source
1
La meilleure réponse que j'ai trouvée à ce sujet a malheureusement été supprimée par l'affiche originale, @ m93a, elle ne peut donc pas encore être votée pour le moment. Je pense que la réponse devrait être non supprimée et votée, car c'est la solution la plus simple qui produit le meilleur effet de clignotement, et elle fonctionne dans toutes les versions actuelles des principaux navigateurs . Vous pouvez également lire un court article de blog sur la même solution à Emulation <blink> à l'aide de l'animation WebKit CSS3 .
Ce que je ne comprends pas, c'est pourquoi chaque réponse ici semble avoir la @-webkit-keyframesrègle après la @keyframesrègle sans préfixe , et certaines ont même la -webkit-animationdéclaration après la règle sans préfixe.
BoltClock
@BoltClock: C'est parce que les animations CSS3 sont relativement nouvelles et pas encore stables dans les navigateurs Webkit. Le soi-disant «préfixe» est ici pour les développeurs qui souhaitent utiliser des animations même si elles sont instables et non terminées.
m93a
@ m93a: Je le sais, mais je demande pourquoi ils sont placés après la règle sans préfixe et non avant (apparemment, je n'ai pas inclus cette formulation dans mon commentaire d'origine, c'est mon erreur).
BoltClock

Réponses:

242

Le Netscape original <blink>avait un cycle de service de 80%. Cela est assez proche, bien que le réel <blink>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;
  }
}
This is <span class="blink">blinking</span> text.

Vous pouvez trouver plus d'informations sur les animations d'images clés ici .

Neil
la source
2
Ouais, c'est beaucoup plus simple. Vous pouvez ajouter un préfixe Webkit pour le faire fonctionner dans Chrome et Safari.
m93a
2
Cela peut ne pas fonctionner sur Chrome / Safari sans les préfixes de kit Web.
David Pelaez
2
Ce que j'aime faire, c'est, au lieu de faire clignoter une classe, faire clignoter 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 <blink>balise, au lieu de <span class="blink">=)
416E64726577
Remarque: Il ne s'agit que de "l'imitation <blink>" demandée par l'OP. Non utilisable avec ie colorproperty en tant qu'animation-clignotement "on-off".
Martin Schneider le
97

Laissez-moi vous montrer un petit truc.

Comme l'a dit Arkanciscan , vous pouvez utiliser des transitions CSS3. Mais sa solution est différente de la balise d'origine.

Voici ce que vous devez vraiment faire:

@keyframes blink {
  50% {
    opacity: 0.0;
  }
}
@-webkit-keyframes blink {
  50% {
    opacity: 0.0;
  }
}
.blink {
  animation: blink 1s step-start 0s infinite;
  -webkit-animation: blink 1s step-start 0s infinite;
}
<span class="blink">Blink</span>

Démo JSfiddle

m93a
la source
@ Forty-Two Désolé, j'ai oublié le préfixe -webkit- . Cela a fonctionné, je pense, pour tous les navigateurs, sauf Chrome et Safari. Maintenant, après la mise à jour, cela devrait fonctionner pour Firefox, Chrome, Opera, Safari et MSIE10.
m93a
Comme écrit, cette réponse fonctionnera en effet dans les versions actuelles de Firefox, Chrome, Safari et IE .
2
N'a pas fonctionné à cause d'une faute de frappe: sur la partie Webkit, le nom de l'animation,, blinkétait manquant. Fixé.
Andrea Ligios
1
Fonctionne bien, merci, voici mon implémentation basée sur votre solution: jsfiddle.net/gnx4mqc4
Hamid Behnam
1
@ m93a: Les 0% 100% { opacity: 1.0; }sections semblent superflues, puisqu'elles sont par défaut, non?
jamadagni
48

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;
} 
This is <span class="blink">blink</span>

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

Belyash
la source
1
Il n'y a rien de tel que -ms-animation ou -o-animation et -moz-animation n'était 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 'modifier' sur les réponses des autres.
m93a
C'est juste ma vieille mauvaise habitude - ajouter des suffixes à toutes les nouvelles propriétés CSS3 .. Réponse mise à jour.
Belyash
ce n'est pas "blink" mais "blink-fadeOut".
Martin Schneider
30

En fait, il n'y a pas besoin de visibilityou opacity- vous pouvez simplement utiliser color, ce qui a l'avantage de ne laisser "clignoter" que le texte:

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; } }
Here is some text, <blink>this text will blink</blink>, this will not.

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

SB
la source
4
Merveilleux! C'est la seule solution qui fournit un clignotement textuel uniquement. Toutes les autres solutions font également clignoter l'arrière-plan de l'élément. Pour tester, utilisez un <span>avec du texte blanc sur bleu sur un <body>avec un arrière-plan vert. Uniquement dans cette solution, l'arrière-plan bleu ne clignotera pas.
jamadagni
10

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)

Airtonix
la source
1
Votre codepen génère une Undefined mixin 'experimental'.erreur, et il semble donc qu'il ne compilera pas et n'affichera pas l'animation de clignotement.
6

Une autre variation

.blink {
    -webkit-animation: blink 1s step-end infinite;
            animation: blink 1s step-end infinite;
}
@-webkit-keyframes blink { 50% { visibility: hidden; }}
        @keyframes blink { 50% { visibility: hidden; }}
This is <span class="blink">blink</span>

Sasha Sofin
la source
2

Cela fonctionne dans mon cas, le texte clignotant à 1 seconde d'intervalle.

.blink_me {
  color:#e91e63;
  font-size:140%;
  font-weight:bold;
  padding:0 20px 0  0;
  animation: blinker 1s linear infinite;
}

@keyframes blinker {
  50% { opacity: 0.4; }
}
Ajay Kumar
la source
-3

si vous voulez un effet lumineux, utilisez ceci

@keyframes blink {
  50% {
    opacity: 0.0;
  }
}
@-webkit-keyframes blink {
  50% {
    opacity: 0.0;
  }
}

atom-text-editor::shadow  .bracket-matcher .region {
    border:none;
    background-color: rgba(195,195,255,0.1);
    border-bottom: 1px solid rgb(155,155,255);
    box-shadow: 0px 0px 9px 4px rgba(155,155,255,0.1);
    border-radius: 3px;
    animation: blink 2s steps(115, start) infinite;
    -webkit-animation: blink 2s steps(115, start) infinite;
}
minaretsbayonet
la source
-5

Veuillez trouver ci-dessous la solution pour votre code.

@keyframes blink {
  50% {
    color: transparent;
  }
}

.loader__dot {
  animation: 1s blink infinite;
}

.loader__dot:nth-child(2) {
  animation-delay: 250ms;
}

.loader__dot:nth-child(3) {
  animation-delay: 500ms;
}
Loading <span class="loader__dot">.</span><span class="loader__dot">.</span><span class="loader__dot">.</span>

Vishal Kiri
la source