Чи є спосіб анімувати еліпсис за допомогою анімації CSS?


93

Я намагаюся створити анімацію багатоточия, і мені було цікаво, чи можливо це з анімацією CSS ...

Тож це може бути як

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

І в основному просто так продовжувати. Будь-які ідеї?

Редагувати: так: http://playground.magicrising.de/demo/ellipsis.html


3
Анімація - це не перетворення, не переходи. Будь ласка, не змішуйте їх трьох.
BoltClock

Дивіться моя відповідь на аналогічне питання: stackoverflow.com/a/24349758/282729
feklee

Відповіді:


88

Як щодо трохи модифікованої версії відповіді @ xec : http://codepen.io/thetallweeks/pen/yybGra

HTML

Один елемент, доданий до елемента:

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

CSS

Анімація, яка використовує steps. Див. Документи 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;    
  }
}

Відповідь @ xec має більший ефект вставки на крапки, хоча це дозволяє крапкам з’являтися миттєво.


1
Я маю на увазі, що ти відповів на це як через 3 роки, але це, мабуть, краще.
Рей

3
@ xckpd7 так, але я погуглив це сьогодні і просто знайшов цю відповідь. ТАК не лише для ОП, це ресурс для всіх!
Метт Паррілла,

1
@MattParrilla Я ОП, і якщо ви помітили, я змінив відповідь, яку приймаю, на цю, перш ніж зробити цей коментар.
Рей

10
Якщо ви використовуєте це для тексту, який відцентрований або вирівняний праворуч, я б запропонував додати ініціал margin-right(або відступ?) 20pxТа анімувати його, 0pxякщо ви не хочете, щоб ваш текст зміщувався під час анімації.
Кімбол,

1emзамість цього 20pxможе відповісти краще для CSS
Jeevan Takhar

56

Ви можете спробувати використати animation-delay propertyі час кожного символу еліпсиса. У цьому випадку я помістив кожен символ еліпсису, <span class>щоб я міг анімувати їх окремо.

Я зробив демо-версію , яка не ідеальна, але вона показує принаймні те, що я маю на увазі :)

Код з мого прикладу:

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;
    }
}

Мені подобається ця ідея і я її трохи розширив, щоб показати "маршові еліпси": jsfiddle.net/toddwprice/cRLMw
Тодд Прайс

Це не спрацювало (?), Тому я додав display: inline; а потім крапки. Це так було призначено працювати? jsfiddle.net/cRLMw/3
Крістофер Віландер

4
Вибачте @Christofer - забув зберегти мою оновлену скрипку. Ось воно знову: jsfiddle.net/toddwprice/cRLMw/8 Крім того, ось щойно прочитана стаття з цікавими анімаціями CSS: tympanus.net/Tutorials/LoadingAnimations/index4.html
Тодд Прайс

За допомогою Firefox я не можу перетягнути його, якщо просто клацнути та перетягнути зображення одним пострілом. Але якщо я спочатку клацну на зображенні, а потім клацну і перетягну, перетягування мені не заважає.
Сем Рубі

2
Я трохи підправив
Адам

32

Навіть більш просте рішення працює досить добре!

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

Просто відредагував вміст з анімацією, замість того, щоб приховувати деякі крапки ...

Демо тут: https://jsfiddle.net/f6vhway2/1/


Редагувати: Дякую @BradCollins за те, що вказав, що contentце не анімаційна властивість.

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

Отже, це рішення лише для WebKit / Blink / Electron. (Але це працює і в поточних версіях FF)


Я дивився на цю тему лише минулого тижня. Приємна проста відповідь!
r8n5n

1
+1 за анімацію content. Щоб отримати рівномірний ритм анімації, слід використовувати steps(1)та визначити один додатковий ключовий кадр. Функція кроку диктує кількість кроків між ключовими кадрами, і оскільки ми вказуємо кожен кадр, нам просто потрібен один крок між ними. codepen.io/anon/pen/VmEdXj
Джефф Камера

Хоча я люблю елегантність цього рішення, слід зазначити, що IE11 та (на момент написання статті) Firefox не підтримують анімацію contentвластивості. (Не знаю про Edge.)
Бред Коллінз,

@BradCollins дякую за це! Я відредагував свою відповідь!
CodeBrauer

15

Коротка відповідь "не дуже". Тим не менш, ви можете пограти з прихованою анімацією ширини та переливу, і, можливо, отримати ефект "досить близько". (наведений нижче код призначений лише для Firefox, за потреби додайте префікси постачальників).

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;
    }
}

демонстрація: http://jsfiddle.net/MDzsR/1/

редагувати

Здається, у chrome є проблеми з анімацією псевдоелемента. Легким виправленням є обгортання еліпсису власним елементом. Перевірте http://jsfiddle.net/MDzsR/4/


Не працює в Chromium (так, я змінив префікс постачальника на -webkitз -moz).
Девід каже, відновити Моніку

@DavidThomas ти маєш рацію - протестовано зараз у chrome, і, схоже, у нього проблеми з псевдоелементом. Ви можете обернути еліпсис у своєму власному елементі та анімувати, що натомість (це буде працювати і у Firefox) jsfiddle.net/MDzsR/4
xec

1
Дійсно приємне рішення та ідеально підходить для програми Firefox OS, яку я розробляю. Трохи змінив
feklee

Ось покращена версія, яка працює в Chrome, а також правильно працює з елементами, не вирівняними за лівим краєм (не змінює ширину). Крім того, вона показує кожну крапку послідовно, без цього ковзного виявляючого артефакту: jsfiddle.net/fze2qxsv
Секура

@AaylaSecura Прийнятий відповідь має більш чисте рішення , використовуючи кроки замість stackoverflow.com/a/28074607/833146
XEC

3

Пізнє доповнення, але я знайшов спосіб зробити це, який підтримує текст по центру.

<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

Ви можете анімувати clip(або краще, clip-pathякщо вам не потрібна підтримка 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

Ну насправді для цього існує чисто CSS-спосіб.

Я отримав приклад із CSS Tricks, але зробив його також підтримуваним в Internet Explorer (я протестував його в 10+).

Перевірте демонстрацію: 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;
}

Ви додаєте власні фільтри лише для IE у ключові кадри, спеціальні для mozilla та webkit. Як це покращує вже прийняте рішення? У нього навіть однакова проблема (у кадрах 4 та 5 видно, відповідно, дві останні та самі останні точки, на відміну від того, що викладено у питанні, яке має 3 повторювані стани, а не 5)
xec

Питання полягає у створенні завантажувальних точок, і є лише близький приклад, не обов’язковий. Я додав префікси, тому IE може їх краще розпізнати та відобразити.
MRadev

3
-webkit-keyframesзастосовуватиметься лише до webkit, а всередині у вас є код лише для IE. Цей код не робить нічого, крім як витрачати місце.
xec

0

Ось моє рішення з чистим css https://jsfiddle.net/pduc6jx5/1/ пояснене: 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>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.