Estou tentando fazer uma animação de reticências e gostaria de saber se isso seria possível com animações CSS ...
Então pode ser como
Loading...
Loading..
Loading.
Loading...
Loading..
E basicamente continue assim. Alguma ideia?
Editar: assim: http://playground.magicrising.de/demo/ellipsis.html
css
css-animations
Rey
fonte
fonte
Respostas:
Que tal uma versão ligeiramente modificada da resposta de @xec : http://codepen.io/thetallweeks/pen/yybGra
HTML
Uma única classe adicionada ao elemento:
<div class="loading">Loading</div>
CSS
Animação que usa
steps
. Veja os documentos 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; } }
A resposta de @xec tem mais efeito de deslizamento nos pontos, enquanto isso permite que os pontos apareçam instantaneamente.
fonte
margin-right
(ou preenchimento?) De20px
e animá-lo0px
se não quiser que o texto seja alterado durante a animação.1em
no lugar de20px
pode funcionar melhor para o CSS nesta respostaVocê pode tentar usar o
animation-delay property
tempo e cada caractere de reticências. Neste caso, coloquei cada caractere de reticências em um<span class>
para poder animá-los separadamente.Fiz uma demonstração , que não é perfeita, mas mostra pelo menos o que quero dizer :)
O código do meu exemplo:
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; } }
fonte
Mesmo uma solução mais simples, funciona muito bem!
<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>
Acabei de editar o conteúdo com animação em vez de esconder alguns pontos ...
Demonstração aqui: https://jsfiddle.net/f6vhway2/1/
Edit: Obrigado a @BradCollins por apontar que
content
não é uma propriedade animável.https://www.w3.org/TR/css3-transitions/#animatable-css
Portanto, esta é uma solução apenas para WebKit / Blink / Electron. (Mas também funciona nas versões FF atuais)
fonte
content
. Para obter um ritmo de animação uniforme, você deve usarsteps(1)
e definir um quadro-chave extra. A função step determina o número de etapas entre os quadros principais e, como estamos especificando cada quadro, queremos apenas uma única etapa entre eles. codepen.io/anon/pen/VmEdXjcontent
propriedade. (Não sei sobre o Edge.)A resposta curta é "não realmente". No entanto, você pode brincar com a animação de largura e estouro oculto e talvez obter um efeito que seja "próximo o suficiente". (código abaixo adaptado apenas para firefox, adicione prefixos do fornecedor conforme necessário).
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; } }
demonstração: http://jsfiddle.net/MDzsR/1/
editar
Parece que o cromo tem problemas com a animação do pseudoelemento. Uma solução fácil é envolver a elipse em seu próprio elemento. Confira http://jsfiddle.net/MDzsR/4/
fonte
-webkit
de-moz
).Uma adição tardia, mas descobri uma maneira de fazer isso que oferece suporte a texto centralizado.
<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: '...'; } }
fonte
Você pode animar
clip
(ou melhor,clip-path
se não precisar do suporte do 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>
fonte
Bem, na verdade existe uma maneira pura de CSS de fazer isso.
Peguei o exemplo do CSS Tricks, mas fiz também para ser compatível com o Internet Explorer (testei no 10+).
Verifique a demonstração: 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; }
fonte
-webkit-keyframes
só se aplica ao webkit, e dentro de você tem código apenas do IE. Este código não faz nada além de desperdiçar espaço.Aqui está minha solução com css puro https://jsfiddle.net/pduc6jx5/1/ explicado: 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>
fonte