Esiste comunque per animare un'ellissi con animazioni CSS?


92

Sto cercando di avere un'ellissi animata e mi chiedevo se fosse possibile con le animazioni CSS ...

Quindi potrebbe essere come

Loading...
Loading..
Loading.
Loading...
Loading..

E fondamentalmente continua così. Qualche idea?

Modifica: in questo modo: http://playground.magicrising.de/demo/ellipsis.html


3
Le animazioni non sono trasformazioni non sono transizioni. Per favore, non confonderli tutti e tre.
— BoltClock

Vedere la mia risposta a una domanda simile: stackoverflow.com/a/24349758/282729
— feklee

Risposte:


88

Che ne dici di una versione leggermente modificata della risposta di @ xec : http://codepen.io/thetallweeks/pen/yybGra

HTML

Una singola classe aggiunta all'elemento:

<div class="loading">Loading</div>

CSS

Animazione che utilizza steps. Consulta i documenti MDN

.loading:after {
  overflow: hidden;
  display: inline-block;
  vertical-align: bottom;
  -webkit-animation: ellipsis steps(4,end) 900ms infinite;      
  animation: ellipsis steps(4,end) 900ms infinite;
  content: "\2026"; /* ascii code for the ellipsis character */
  width: 0px;
}

@keyframes ellipsis {
  to {
    width: 20px;    
  }
}

@-webkit-keyframes ellipsis {
  to {
    width: 20px;    
  }
}

La risposta di @ xec ha più un effetto di scorrimento sui punti, mentre ciò consente ai punti di apparire istantaneamente.


1
Voglio dire, hai risposto 3 anni dopo, ma probabilmente è meglio.
— Rey

3
@ xckpd7 sì, ma oggi ho cercato su Google e ho trovato questa risposta. Quindi non è solo per l'OP, è una risorsa per tutti!
— Matt Parrilla

1
@ MattParrilla Sono l'OP, e se hai notato che ho cambiato la risposta accetto questa prima di fare quel commento.
— Rey

10
Se lo stai usando su un testo centrato o allineato a destra, ti suggerirei di aggiungere un'iniziale margin-right(o un riempimento?) 20pxE animarlo 0pxse non vuoi che il tuo testo si sposti durante l'animazione.
— Kimball

1emal posto di 20pxpotrebbe funzionare meglio per il CSS in questa risposta
— Jeevan Takhar

56

Potresti provare a usare il animation-delay propertytempo e ogni carattere di ellissi. In questo caso ho inserito ogni carattere di puntini di sospensione in un in <span class>modo da poterli animare separatamente.

Ho fatto una demo , che non è perfetta, ma mostra almeno cosa intendo :)

Il codice del mio esempio:

HTML

Loading<span class="one">.</span><span class="two">.</span><span class="three">.</span>​

CSS

.one {
    opacity: 0;
    -webkit-animation: dot 1.3s infinite;
    -webkit-animation-delay: 0.0s;
    animation: dot 1.3s infinite;
    animation-delay: 0.0s;
}

.two {
    opacity: 0;
    -webkit-animation: dot 1.3s infinite;
    -webkit-animation-delay: 0.2s;
    animation: dot 1.3s infinite;
    animation-delay: 0.2s;
}

.three {
    opacity: 0;
    -webkit-animation: dot 1.3s infinite;
    -webkit-animation-delay: 0.3s;
    animation: dot 1.3s infinite;
    animation-delay: 0.3s;
}

@-webkit-keyframes dot {
    0% {
        opacity: 0;
    }
    50% {
        opacity: 0;
    }
    100% {
        opacity: 1;
    }
}

@keyframes dot {
    0% {
        opacity: 0;
    }
    50% {
        opacity: 0;
    }
    100% {
        opacity: 1;
    }
}

Mi piace questa idea e l'ho appena ampliata un po 'per mostrare "marching elipses": jsfiddle.net/toddwprice/cRLMw
— Todd Price

Non ha funzionato (?), Quindi ho aggiunto display: inline; e poi i punti. È così che doveva funzionare? jsfiddle.net/cRLMw/3
— Christofer Vilander

4
Scusa @Christofer - ho dimenticato di salvare il mio violino aggiornato. Eccolo di nuovo: jsfiddle.net/toddwprice/cRLMw/8 Inoltre, ecco un articolo che ho appena letto che ha alcune interessanti animazioni CSS: tympanus.net/Tutorials/LoadingAnimations/index4.html
— Todd Price

Utilizzando Firefox non posso trascinarlo se semplicemente clicco e trascino l'immagine in un colpo solo. Ma se clicco prima sull'immagine e poi clicco e trascino, non mi viene impedito di trascinare.
— Sam Rueby

2
Ho ottimizzato un po 'l'HTML e il CSS per utilizzare i tag <i> ... jsfiddle.net/DkcD4/77
— Adam Youngers

32

Anche una soluzione più semplice, funziona abbastanza bene!

<style>
    .loading:after {
      display: inline-block;
      animation: dotty steps(1,end) 1s infinite;
      content: '';
    }

    @keyframes dotty {
        0%   { content: ''; }
        25%  { content: '.'; }
        50%  { content: '..'; }
        75%  { content: '...'; }
        100% { content: ''; }
    }
</style>
<div class="loading">Loading</div>

Ho appena modificato il contenuto con l'animazione invece di nascondere alcuni punti ...

Demo qui: https://jsfiddle.net/f6vhway2/1/


Modifica: grazie a @BradCollins per aver sottolineato che contentnon è una proprietà animabile.

https://www.w3.org/TR/css3-transitions/#animatable-css

Quindi questa è una soluzione solo WebKit / Blink / Electron. (Ma funziona anche nelle attuali versioni FF)


Stavo guardando questo thread solo la scorsa settimana. Bella risposta semplice!
— r8n5n

1
+1 per l'animazione content. Per ottenere un ritmo di animazione uniforme è necessario utilizzare steps(1)e definire un fotogramma chiave aggiuntivo. La funzione step determina il numero di passaggi tra i fotogrammi chiave e poiché stiamo specificando ogni fotogramma, vogliamo solo un singolo passaggio tra di loro. codepen.io/anon/pen/VmEdXj
— Jeff Camera

Anche se amo l'eleganza di questa soluzione, va notato che IE11 e (al momento della stesura di questo articolo) Firefox non supportano l'animazione della contentproprietà. (Non so di Edge.)
— Brad Collins,

@BradCollins grazie per questo! Ho modificato la mia risposta!
— CodeBrauer

15

La risposta breve è "non proprio". Tuttavia, puoi giocare con la larghezza dell'animazione e l'overflow nascosti, e magari ottenere un effetto "abbastanza vicino". (codice di seguito personalizzato solo per Firefox, aggiungere i prefissi del fornitore secondo necessità).

html

<div class="loading">Loading</div>

css

.loading:after {
    overflow: hidden;
    display: inline-block;
    vertical-align: bottom;
    -moz-animation: ellipsis 2s infinite;
    content: "\2026"; /* ascii code for the ellipsis character */
}
@-moz-keyframes ellipsis {
    from {
        width: 2px;
    }
    to {
        width: 15px;
    }
}

demo: http://jsfiddle.net/MDzsR/1/

modificare

Sembra che Chrome abbia problemi con l'animazione dello pseudoelemento. Una soluzione semplice è avvolgere i puntini di sospensione nel proprio elemento. Dai un'occhiata a http://jsfiddle.net/MDzsR/4/


Non funziona in Chromium (sì, ho cambiato il prefisso del fornitore in -webkitda -moz).
— David dice di reintegrare Monica il

@DavidThomas hai ragione - ora è stato testato in Chrome e sembra che abbia problemi con lo pseudo elemento. Potresti avvolgere i puntini di sospensione nel proprio elemento e animarlo invece (funzionerebbe anche in Firefox) jsfiddle.net/MDzsR/4
— xec

1
Soluzione davvero carina e perfetta per un'app per Firefox OS che sto sviluppando. Modificato un po ': jsfiddle.net/feklee/x69uN
— feklee

Ecco una versione migliorata che funziona su Chrome e funziona correttamente con elementi non allineati a sinistra (non cambia la larghezza). Inoltre, mostra ogni punto consecutivamente, senza questo artefatto rivelatore scorrevole: jsfiddle.net/fze2qxsv
— Aayla Secura

@AaylaSecura La accettato risposta ha una soluzione più pulita utilizzando passaggi invece stackoverflow.com/a/28074607/833146
— XEC

3

Un'aggiunta tardiva, ma ho trovato un modo per farlo che supporti il ​​testo centrato.

<element>:after {
    content: '\00a0\00a0\00a0';
    animation: progress-ellipsis 5s infinite;
}

@keyframes progress-ellipsis {
    0% {
        content: '\00a0\00a0\00a0';
    }
    30% {
        content: '.\00a0\00a0';
    }
    60% {
        content: '..\00a0';
    }
    90% {
        content: '...';
    }
}

3

Puoi animare clip(o meglio clip-pathse non hai bisogno del supporto di IE)

div {
  position: relative;
  display: inline-block;
  font-size: 1.4rem;
}

div:after {
  position: absolute;
  margin-left: .1rem;
  content: ' ...';
  display: inline-block;
  animation: loading steps(4) 2s infinite;
  clip: rect(auto, 0px, auto, auto);
}

@keyframes loading {
  to {
    clip: rect(auto, 20px, auto, auto);
  }
}
<div>Loading</div>


1

In realtà c'è un modo puro CSS per farlo.

Ho preso l'esempio da CSS Tricks, ma l'ho realizzato anche per essere supportato in Internet Explorer (l'ho testato in 10+).

Controlla la demo: http://jsfiddle.net/Roobyx/AT6v6/2/

HTML:

<h4 id="searching-ellipsis"> Searching
    <span>.</span>
    <span>.</span>
    <span>.</span>
</h4>

CSS:

@-webkit-keyframes opacity {
  0% {
    filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=100);
    opacity: 1;
  }
  100% {
    filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=0);
    opacity: 0;
  }
}

@-moz-keyframes opacity {
  0% {
    filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=100);
    opacity: 1;
  }

  100% {
    filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=0);
    opacity: 0;
  }
}

@-webkit-keyframes opacity {
  0% {
    filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=100);
    opacity: 1;
  }
  100% {
    filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=0);
    opacity: 0;
  }
}

@-moz-keyframes opacity {
  0% {
    filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=100);
    opacity: 1;
  }
  100% {
    filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=0);
    opacity: 0;
  }
}

@-o-keyframes opacity {
  0% {
    filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=100);
    opacity: 1;
  }
  100% {
    filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=0);
    opacity: 0;
  }
}

@keyframes opacity {
  0% {
    filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=100);
    opacity: 1;
  }
  100% {
    filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=0);
    opacity: 0;
  }
}
#searching-ellipsis span {
  -webkit-animation-name: opacity;
  -webkit-animation-duration: 1s;
  -webkit-animation-iteration-count: infinite;
  -moz-animation-name: opacity;
  -moz-animation-duration: 1s;
  -moz-animation-iteration-count: infinite;
  -ms-animation-name: opacity;
  -ms-animation-duration: 1s;
  -ms-animation-iteration-count: infinite;
}
#searching-ellipsis span:nth-child(2) {
  -webkit-animation-delay: 100ms;
  -moz-animation-delay: 100ms;
  -ms-animation-delay: 100ms;
  -o-animation-delay: 100ms;
  animation-delay: 100ms;
}
#searching-ellipsis span:nth-child(3) {
  -webkit-animation-delay: 300ms;
  -moz-animation-delay: 300ms;
  -ms-animation-delay: 300ms;
  -o-animation-delay: 300ms;
  animation-delay: 300ms;
}

Stai aggiungendo filtri proprietari solo per IE a fotogrammi chiave specifici per mozilla e webkit. In che modo questo è un miglioramento rispetto alla soluzione già accettata? Ha anche lo stesso problema (nei fotogrammi 4 e 5 sono visibili solo i due ultimi e l'ultimo punto, rispettivamente, a differenza di quanto delineato nella domanda, che ha 3 stati ripetuti, non 5)
— xec

La domanda riguarda la creazione di punti di caricamento e c'è solo un esempio vicino, non obbligatorio. Quello che ho aggiunto sono i prefissi, quindi IE può riconoscerlo meglio e visualizzarlo.
— MRadev

3
-webkit-keyframessi applica solo al webkit e al suo interno è presente il codice solo IE. Questo codice non fa altro che sprecare spazio.
— xec

0

Ecco la mia soluzione con puro css https://jsfiddle.net/pduc6jx5/1/ spiegata: https://medium.com/@lastseeds/create-text-ellipsis-animation-with-pure-css-7f61acee69cc

scss



.dot1 {
 animation: visibility 3s linear infinite;
}

@keyframes visibility {
 0% {
 opacity: 1;
 }
 65% {
 opacity: 1;
 }
 66% {
 opacity: 0;
 }
 100% {
 opacity: 0;
 }
}

.dot2 {
 animation: visibility2 3s linear infinite;
}

@keyframes visibility2 {
 0% {
  opacity: 0;
 }
 21% {
  opacity: 0;
 }
 22% {
  opacity: 1;
 }
 65% {
  opacity: 1;
 }
 66% {
  opacity: 0;
 }
 100% {
  opacity: 0;
 }
}

.dot3 {
 animation: visibility3 3s linear infinite;
}

@keyframes visibility3 {
 0% {
  opacity: 0;
 }
 43% {
  opacity: 0;
 }
 44% {
  opacity: 1;
 }
 65% {
  opacity: 1;
 }
 66% {
  opacity: 0;
 }
 100% {
  opacity: 0;
 }
}

html

Loading <span class="dot dot1">.</span><span class="dot dot2">.</span><span class="dot dot3">.</span>
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.