Пульсуюче серце анімація CSS


83

Я працюю над анімованим серцем лише із CSS.

Я хочу, щоб він пульсував 2 рази, зробив невелику перерву, а потім повторив ще раз.

Що я маю зараз:

small ==> big ==> small ==> repeat animation

До чого я йду:

small ==> big ==> small ==> big ==> small ==> pause ==> repeat animation

Як я можу це зробити?

Мій код:

#button{
  width:450px;
  height:450px;
  position:relative;
  top:48px;
  margin:0 auto;
  text-align:center;
  }
#heart img{
  position:absolute;
  left:0;
  right:0;
  margin:0 auto;
  -webkit-transition: opacity 7s ease-in-out;
  -moz-transition: opacity 7s ease-in-out;
  -o-transition: opacity 7s ease-in-out;
  transition: opacity 7s ease-in-out;}

 @keyframes heartFadeInOut {
  0% {
    opacity:1;
  }
  14% {
    opacity:1;
  }
  28% {
    opacity:0;
  }
  42% {
    opacity:0;
  }
  70% {
    opacity:0;
  }
}

#heart img.top { 
  animation-name: heartFadeInOut; 
  animation-timing-function: ease-in-out;
  animation-iteration-count: infinite;
  animation-duration: 1s;
  animation-direction: alternate;

}
<div id="heart" >
  <img class="bottom" src="https://goo.gl/nN8Haf" width="100px">
  <img class="top" src="https://goo.gl/IIW1KE" width="100px">
</div>

Дивіться також цю Скрипку .


3
Чи є якась причина, чому ви використали jsfiddle замість фрагмента стека, інтегрованого у питанні? Наскільки я бачу, фрагмент стека чудово працює для вашого прикладу.
Бакуріу

Відповіді:


117

Ви можете включити паузу в анімацію. Подобається так:

@keyframes heartbeat
{
  0%
  {
    transform: scale( .75 );
  }
  20%
  {
    transform: scale( 1 );
  }
  40%
  {
    transform: scale( .75 );
  }
  60%
  {
    transform: scale( 1 );
  }
  80%
  {
    transform: scale( .75 );
  }
  100%
  {
    transform: scale( .75 );
  }
}

Робочий приклад: https://jsfiddle.net/t7f97kf4/

Редагувати:

Робочий приклад із чистою формою серця CSS: https://jsfiddle.net/qLfg2mrd/


10
@FernandoSouza Ви також можете зробити css heart без зображення - jsfiddle.net/qLfg2mrd
Анонім

1
@Anonymous Дякую за це. Я додав ваше посилання до своєї відповіді.
Рейн

Я роблю закладку на цю Скрипку! Чудовий спосіб зробити це.
Девід Уілкінсон

3
@DavidWilkinson Додайте і це в закладки :) - css-tricks.com/examples/ShapesOfCSS :)
Анонім

6
Ви маєте на увазі персонажа ♥? Це просто, просто зробіть &hearts;. Не потрібно всіх цих transformс.
Ісмаель Мігель

35

Пульсуйте 2 рази, зробіть невелику перерву, а потім повторіть ще раз

Спробуйте це. Займатися анімацією opacity- поганий вибір. transform: scale()зробить роботу.

.heart:before {
  display: block;
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  font-family: 'icons';
  font-size: 21px;
  text-indent: 0;
  font-variant: normal;
  line-height: 21px;
}
.heart {
  position: relative;
  width: 500px;
  overflow: inherit;
  margin: 50px auto;
  list-style: none;
  -webkit-animation: animateHeart 2.5s infinite;
  animation: animateHeart 2.5s infinite;
}
.heart:before,
.heart:after {
  position: absolute;
  content: '';
  top: 0;
  left: 50%;
  width: 120px;
    height: 200px;
    background: red;
    border-radius: 100px 100px 0 0;
  -webkit-transform: rotate(-45deg) translateZ(0);
  transform: rotate(-45deg) translateZ(0);
  -webkit-transform-origin: 0 100%;
  transform-origin: 0 100%;
}
.heart:after {
  left: 26%;
  -webkit-transform: rotate(45deg) translateZ(0);
  transform: rotate(45deg) translateZ(0);
  -webkit-transform-origin: 100% 100%;
  transform-origin: 100% 100%;
}
@-webkit-keyframes animateHeart {
  0% {
    -webkit-transform: scale(0.8);
  }
  5% {
    -webkit-transform: scale(0.9);
  }
  10% {
    -webkit-transform: scale(0.8);
  }
  15% {
    -webkit-transform: scale(1);
  }
  50% {
    -webkit-transform: scale(0.8);
  }
  100% {
    -webkit-transform: scale(0.8);
  }
}
@keyframes animateHeart {
  0% {
    transform: scale(0.8);
  }
  5% {
    transform: scale(0.9);
  }
  10% {
    transform: scale(0.8);
  }
  15% {
    transform: scale(1);
  }
  50% {
    transform: scale(0.8);
  }
  100% {
    transform: scale(0.8);
  }
}
span {
  font-family: 'Cantora One', sans-serif;
  font-size: 64px;
  position: absolute;
  top: 165px;
}
<div class="heart">
</div>


1
Мені потрібно використовувати зображення у фінальному проекті замість чистого CSS. Але, спасибі! Я можу використовувати час вашої анімації, який ідеально підходить!
Фернандо Соуза

не має значення. Ви також можете масштабувати зображення таким чином. Просто спробуйте :)
Джину Кур'ян

Чи можна таким чином чергувати зображення або змінювати фонове зображення?
Фернандо Соуза

@FernandoSouza yup. Спробуйте. Я допоможу вам, якщо у вас виникнуть проблеми.
Jinu Kurian

Я намагаюся, але спочатку змінив якусь структуру, оскільки на серці є текст, і він повинен залишатися незмінним.
Фернандо Соуза

22

Мені подобається відповідь кетана , але я хотів покращити анімацію серця, щоб зробити її більш реалістичною.

  • Серце не подвоюється в розмірах, коли воно б’ється. Зміна розміру на 10% мені здається кращою.
  • Мені подобається, що він стає і більшим, і меншим
  • Коли він взагалі перестає рухатися, це здається мені мертвим. Навіть коли воно не б'ється, його потрібно трохи розширити або скоротити
  • Я видалив код "альтернативних вказівок", щоб він кожного разу проходив однаково
  • Я явно маю початок серця в кінці і в нормальному масштабі (1), а анімацію маю в середині послідовності. Мені це здається зрозумілішим.

#heart img{
  position:absolute;
  left:0;
  right:0;
  margin:0 auto;
 }

 @keyframes heartFadeInOut {
  0% {transform: scale(1);}
  25% {transform: scale(.97);}
  35% {transform: scale(.9);}
  45% {transform: scale(1.1);}
  55% {transform: scale(.9);}
  65% {transform: scale(1.1);}
  75% {transform: scale(1.03);}
  100% {transform: scale(1);}
}

#heart img.bottom { 
  animation-name: heartFadeInOut; 
  animation-iteration-count: infinite;
  animation-duration: 2s;
}
<div id="heart" >
  <img class="bottom" src="https://i.stack.imgur.com/iBCpb.png" width="100px">
</div>


6

На основі різних коментарів та використання ♥ ми отримаємо наступне:

body {
  font-size: 40pt;
  color: red;
}
@keyframes heartbeat {
  0% {
    font-size: .75em;
  }
  20% {
    font-size: 1em;
  }
  40% {
    font-size: .75em;
  }
  60% {
    font-size: 1em;
  }
  80% {
    font-size: .75em;
  }
  100% {
    font-size: .75em;
  }
}
div {
  animation: heartbeat 1s infinite;
}
<div>
  &hearts;
</div>


6

body{
  margin: 0;
  padding: 0;
  background: #1f1f1f;
}

body:before
{
  position: absolute;
  content: '';
  left: 50%;
  width: 50%;
  height: 100%;
  background: rgba(0,0,0,.2);

}

.center
{
  position: absolute;
  top:50%;
  left: 50%;
  background: #1f1f1f;
  transform: translate(-50%,-50%);
  padding: 100px;
  border: 5px solid white;
  border-radius: 100%;
  box-shadow:20px 20px 45px rgba(0,0,0,.4);
  z-index: 1;
  overflow: hidden;
}
.heart
{
  position: relative;
  width: 100px;
  height: 100px;
  background:#ff0036;
  transform: rotate(45deg) translate(10px,10px);
  animation: ani 1s linear infinite;
}
.heart:before
{
  content: '';
  width: 100%;
  height: 100%;
  background: #ff0036;
  position: absolute;
  top:-50%;
  left:0;
  border-radius: 50%;
}
.heart:after
{
  content:'';
  width: 100%;
  height: 100%;
  background: #ff0036;
  position: absolute;
  bottom:0;
  right:50%;
  border-radius: 50%;
}
.center:before
{
  content: '';
  position: absolute;
  top:0;
  left:-50%;
  width: 100%;
  height: 100%;
  background: rgba(0,0,0,.3);
}

@keyframes ani{
  0%{
    transform: rotate(45deg) translate(10px,10px) scale(1);
  }
  25%{
    transform: rotate(45deg) translate(10px,10px) scale(1);
  }
  30%{
    transform: rotate(45deg) translate(10px,10px) scale(1.4);
  }
  50%{
    transform: rotate(45deg) translate(10px,10px) scale(1.2);
  }
  70%{
    transform: rotate(45deg) translate(10px,10px) scale(1.4);
  }
  90%{
    transform: rotate(45deg) translate(10px,10px) scale(1);
  }
  100%{
    transform: rotate(45deg) translate(10px,10px) scale(1);
  }
}
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>HeartBeat Animation</title>
    <link rel="stylesheet" href="Style.css" type="text/css">
  </head>
  <body>
    <div class="center">
      <div class="heart">
        
      </div>
    </div>
  </body>
</html>

Вихідні дані

більше: Анімація серцебиття


4

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

#button{
  width:450px;
  height:450px;
  position:relative;
  top:48px;
  margin:0 auto;
  text-align:center;
  }
#heart img{
  position:absolute;
  left:0;
  right:0;
  margin:0 auto;
 }

 @keyframes heartFadeInOut {
  0%
  {    transform: scale( .5 );  }
  20%
  {    transform: scale( 1 );  }
  40%
  {    transform: scale( .5 );  }
  60%
  {    transform: scale( 1 );  }
  80%
  {    transform: scale( .5 );  }
  100%
  {    transform: scale( .5 );  }
}

#heart img.bottom { 
  animation-name: heartFadeInOut; 
  animation-iteration-count: infinite;
  animation-duration: 1.5s;
  animation-direction: alternate;

}
<div id="heart" >
  <img class="bottom" src="https://goo.gl/nN8Haf" width="100px">
</div>


9
Ваше серце має м’яку аритмію на Chrome?

@LegoStormtroopr Тож це не тільки я. Чому саме хром? Чому?
Jaca

2
Я не впевнений, це може бути синус серцевого симфізу, але ви хотіли б проконсультуватися з експертом CSS для кращого діагнозу.

1

Мені це було потрібно для проекту, над яким я працював. Я намагався зробити так, щоб це виглядало якомога реалістичніше, і ось що я придумав.

@keyframes heartbeat {
    0% {
        transform: scale( .95 );
    }

    20% {
        transform: scale( .97 );
    }

    30% {
        transform: scale( .95 );
    }

    40% {
        transform: scale( 1 );
    }

    100% {
        transform: scale( .95 );
    }
}

animation: heartbeat 1s infinite;

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.