Imitando una etiqueta de parpadeo con animaciones CSS3

149

Realmente quiero hacer que un texto parpadee al estilo de la vieja escuela sin usar javascript o decoración de texto.

¡Sin transiciones, solo * parpadeo *, * parpadeo *, * parpadeo *!


EDITAR : Esto es diferente de esa pregunta porque pido parpadeo sin transiciones continuas, mientras que OP de las otras preguntas pregunta cómo reemplazar el parpadeo con transiciones continuas

m93a
fuente
1
Desafortunadamente, la mejor respuesta que he encontrado para esto fue eliminada por el póster original, @ m93a, por lo que aún no se puede votar. Creo que la respuesta debería ser eliminada y votada, ya que es la solución más simple que produce el mejor efecto de parpadeo, y funciona en todas las versiones actuales de los principales navegadores . También puede leer una breve publicación de blog sobre la misma solución en Emular <blink> usando la animación WebKit CSS3 .
Lo que no entiendo es por qué cada respuesta aquí parece tener la @-webkit-keyframesregla después de la @keyframesregla no prefijada , y algunas incluso tienen la -webkit-animationdeclaración después de la no prefijada.
BoltClock
@BoltClock: es porque las animaciones CSS3 son relativamente nuevas y aún no estables en los navegadores Webkit. El llamado "prefijo" está aquí para los desarrolladores que desean usar animaciones incluso si son inestables y no están terminadas.
m93a
@ m93a: Lo sé, pero pregunto por qué se colocan después de la regla sin prefijar y no antes (aparentemente no incluí esa frase en mi comentario original, mi error).
BoltClock

Respuestas:

242

El Netscape original <blink>tenía un ciclo de trabajo del 80%. Esto se acerca bastante, aunque lo real <blink>solo afecta al texto:

.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.

Puede encontrar más información sobre las animaciones de fotogramas clave aquí .

Neil
fuente
2
Sí, es mucho más simple. Puede agregar el prefijo webkit para que funcione en Chrome y Safari.
m93a
2
Esto podría no funcionar en Chrome / safari sin los prefijos de webkit.
David Peláez
2
Lo que disfruto haciendo es, en lugar de hacer que blink sea una clase, hacer que blink sea una etiqueta (con blink { animation: blink 1s steps(5, start) infinite; -webkit-animation: blink 1s steps(5, start) infinite; }). De esa manera, puede usar la <blink>etiqueta, en lugar de <span class="blink">=)
416E64726577
Nota: Esta es solo la "imitación <blink>" solicitada por el OP. No se puede usar con, por ejemplo, la colorpropiedad como animación de "encendido-apagado".
Martin Schneider
97

Déjame mostrarte un pequeño truco.

Como dijo Arkanciscan , puedes usar transiciones CSS3. Pero su solución se ve diferente de la etiqueta original.

Lo que realmente necesitas hacer es esto:

@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>

JSfiddle Demo

m93a
fuente
@ Cuarenta y dos Lo siento, olvidé el prefijo -webkit- . Funcionó, creo, para todos los navegadores reales, excepto Chrome y Safari. Ahora, después de la actualización, debería funcionar para Firefox, Chrome, Opera, Safari y MSIE10.
m93a
Tal como está escrito, esta respuesta funcionará en las versiones actuales de Firefox, Chrome, Safari e IE .
2
No funcionó debido a un error tipográfico: en la parte del kit web blink, faltaba el nombre de la animación . Fijo.
Andrea Ligios
1
Funciona bien, gracias, aquí está mi implementación basada en su solución: jsfiddle.net/gnx4mqc4
Hamid Behnam
1
@ m93a: Las 0% 100% { opacity: 1.0; }secciones parecen ser superfluas, ya que son predeterminadas, ¿no?
jamadagni
48

Prueba este 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>

Necesita prefijos específicos del navegador / proveedor: http://jsfiddle.net/es6e6/1/ .

Belyash
fuente
1
No hay nada como -ms-animation u -o-animation y -moz-animation solo en la versión 15, no lo uses ahora. Mira caniuse.com para ver el soporte real. Lo siento, pero no aceptaré esta pregunta :( PD: puede usar 'editar' en las respuestas de otros.
m93a
Es solo mi viejo mal hábito: agregar sufijos a todas las nuevas propiedades CSS3. Respuesta actualizada.
Belyash
esto no es "parpadeo" sino "parpadeo-desvanecimiento".
Martin Schneider
30

En realidad, no es necesario visibilityo opacitysimplemente puede usarlo color, lo que tiene la ventaja de mantener cualquier "parpadeo" solo en el texto:

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.

Violín: http://jsfiddle.net/2r8JL/

SB
fuente
44
¡Maravilloso! Esta es la única solución que proporciona un parpadeo de solo texto. Todas las demás soluciones parpadean también en el fondo del elemento. Para probar, use un texto <span>con blanco sobre azul contra un <body>con fondo verde. Solo en esta solución, el fondo azul no parpadeará.
jamadagni
10

Voy al infierno por esto:

=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 with bourbon)

airtonix
fuente
1
Su codepen genera un Undefined mixin 'experimental'.error y, por lo tanto, parece que no se compilará y mostrará la animación de parpadeo.
6

Otra variante

.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
fuente
2

Está funcionando en mi caso, parpadeando el texto a intervalos de 1 s.

.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
fuente
-3

si quieres un efecto de brillo usa esto

@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
fuente
-5

Encuentre a continuación la solución para su código.

@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
fuente