Hoạt ảnh CSS Pulsing Heart


83

Tôi đang làm việc trên một trái tim hoạt hình chỉ với CSS.

Tôi muốn nó bắt mạch 2 lần, nghỉ một chút rồi lặp lại lần nữa.

Những gì tôi có bây giờ:

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

Tôi sẽ làm gì:

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

Tôi làm nó như thế nào?

Mã của tôi :

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

Xem thêm Fiddle này .


3
Có lý do nào đó khiến bạn sử dụng jsfiddle thay vì Stack Snippet được tích hợp trong câu hỏi không? Theo như tôi có thể thấy Stack Snippet hoạt động tốt cho ví dụ của bạn.
Bakuriu

Câu trả lời:


117

Bạn có thể kết hợp tạm dừng vào hoạt ảnh. Như vậy:

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

Ví dụ làm việc: https://jsfiddle.net/t7f97kf4/

Biên tập:

Ví dụ làm việc với hình trái tim CSS thuần túy: https://jsfiddle.net/qLfg2mrd/


10
@FernandoSouza Bạn cũng có thể tạo trái tim css mà không cần hình ảnh - jsfiddle.net/qLfg2mrd
Anonymous

1
@Anonymous Cảm ơn bạn vì điều này. Tôi đã thêm liên kết của bạn vào câu trả lời của tôi.
Rein

Tôi đang đánh dấu Fiddle đó! Cách làm tuyệt vời.
David Wilkinson

3
@DavidWilkinson Đánh dấu trang này luôn :) - css-tricks.com/examples/ShapesOfCSS :)
Ẩn danh

6
Ý bạn là, ký tự ♥? Điều đó thật dễ dàng, chỉ cần làm &hearts;. Không cần tất cả những thứ transformđó.
Ismael Miguel

35

Nhịp 2 lần, nghỉ một chút rồi lặp lại lần nữa

Thử đi. Đi với hoạt hình opacitylà một lựa chọn không tồi. transform: scale()sẽ thực hiện công việc.

.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
Tôi cần sử dụng hình ảnh thay vì CSS thuần túy, trong dự án cuối cùng. Nhưng cảm ơn! Tôi có thể sử dụng thời gian của hoạt ảnh của bạn, điều này thật hoàn hảo!
Fernando Souza

không tạo ra sự khác biệt. bạn cũng có thể chia tỷ lệ hình ảnh theo cách này. Hãy thử :)
Jinu Kurian

Tôi có thể thay thế hình ảnh hoặc thay đổi hình nền theo cách này không?
Fernando Souza

@FernandoSouza vâng. Hãy thử đi. Tôi sẽ giúp bạn nếu bạn gặp bất kỳ vấn đề nào.
Jinu Kurian

Tôi đang cố gắng, nhưng trước tiên hãy thay đổi một số cấu trúc vì có văn bản trên trái tim và nó phải giữ nguyên kích thước.
Fernando Souza

22

Tôi thích câu trả lời của ketan , nhưng tôi muốn cải thiện hoạt ảnh trái tim để làm cho nó thực tế hơn.

  • Một trái tim không tăng gấp đôi kích thước khi nó đập. Thay đổi 10% về kích thước có vẻ tốt hơn đối với tôi.
  • Tôi thích nó lớn hơn và nhỏ hơn
  • Khi nó ngừng di chuyển hoàn toàn, nó trông như chết đối với tôi. Ngay cả khi nó không bị đánh bại, nó cần phải mở rộng hoặc co lại một chút
  • Tôi đã xóa mã "chỉ đường thay thế" để nó chạy theo cùng một cách mọi lúc
  • Tôi rõ ràng có kết thúc bắt đầu trái tim và ở tỷ lệ bình thường (1) và có hoạt ảnh ở giữa chuỗi. Nó có vẻ rõ ràng hơn theo cách đó đối với tôi.

#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

Dựa trên các nhận xét khác nhau và sử dụng ♥, chúng tôi sẽ nhận được điều này:

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>

Đầu ra

để biết thêm: Hoạt hình nhịp đập trái tim


4

Tôi nghĩ đây là những gì bạn muốn cho hoạt ảnh của mình. Không cần hình ảnh hàng đầu. Chỉ cần sử dụng dưới cùng.

#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
Tim của bạn bị loạn nhịp nhẹ trên Chrome?

@LegoStormtroopr Vì vậy, không chỉ tôi. Tại sao lại bị rôm sảy? Tại sao?
Jaca

2
Tôi không chắc, đó có thể là xoang loạn nhịp tim, nhưng bạn muốn kiểm tra với chuyên gia CSS để được chẩn đoán tốt hơn.

1

Tôi cần cái này cho một dự án mà tôi đang làm. Tôi đã cố gắng làm cho nó trông thực tế nhất có thể, và đây là những gì tôi đã nghĩ ra.

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.