console
<svg class="heart-loader" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 90 90" version="1.1">
<g class="heart-loader__group">
<path class="heart-loader__square" stroke-width="1" fill="none" d="M0,30 0,90 60,90 60,30z"/>
<path class="heart-loader__circle m--left" stroke-width="1" fill="none" d="M60,60 a30,30 0 0,1 -60,0 a30,30 0 0,1 60,0"/>
<path class="heart-loader__circle m--right" stroke-width="1" fill="none" d="M60,60 a30,30 0 0,1 -60,0 a30,30 0 0,1 60,0"/>
<path class="heart-loader__heartPath" stroke-width="2" d="M60,30 a30,30 0 0,1 0,60 L0,90 0,30 a30,30 0 0,1 60,0" />
</g>
</svg>
.heart-loader {
position: absolute;
display: block;
left: 50%;
top: 50%;
margin-top: 180px/-2;
width: 180px;
height: 180px;
overflow: visible;
}
.heart-loader__square {
stroke: #B8B8B8;
stroke-dasharray: 240, 240;
stroke-dashoffset: 240;
animation: square-anim 7s 1s infinite;
}
.heart-loader .heart-loader__circle {
stroke: #B8B8B8;
stroke-dasharray: 188.522, 188.522;
stroke-dashoffset: 188.522;
transform-origin: 60px 60px/2;
}
.heart-loader .heart-loader__group {
transform-origin: 0 90px;
animation: group-anim 7s 1s infinite;
}
.heart-loader__circle.m--left {
animation: left-circle-anim 7s 1s infinite;
}
.heart-loader__circle.m--right {
animation: right-circle-anim 7s 1s infinite;
}
.heart-loader .heart-loader__heartPath {
stroke: #E21737;
fill: transparent;
stroke-dasharray: 308.522, 308.522;
stroke-dashoffset: 308.522;
animation: heart-anim 7s 1s infinite;
}
@keyframes square-anim{
12% {
stroke-dashoffset: 0;
}
43% {
stroke-dashoffset: 0;
opacity: 1;
}
85% {
stroke-dashoffset: 0;
opacity: 0;
}
100% {
stroke-dashoffset: 0;
opacity: 0;
}
}
@keyframes left-circle-anim {
12% {
stroke-dashoffset: 188.522;
}
31% {
stroke-dashoffset: 0;
transform: translateY(0);
}
41% {
stroke-dashoffset: 0;
transform: translateY(-30px);
}
43% {
stroke-dashoffset: 0;
transform: translateY(-30px);
opacity: 1;
}
85% {
stroke-dashoffset: 0;
transform: translateY(-30px);
opacity: 0;
}
100% {
stroke-dashoffset: 0;
transform: translateY(-30px);
opacity: 0;
}
}
@keyframes right-circle-anim {
12% {
stroke-dashoffset: 188.522;
}
31% {
stroke-dashoffset: 0;
transform: translateY(0);
}
41% {
stroke-dashoffset: 0;
transform: translateX(30px);
}
43% {
stroke-dashoffset: 0;
transform: translateX(30px);
opacity: 1;
}
85% {
stroke-dashoffset: 0;
transform: translateX(30px);
opacity: 0;
}
100% {
stroke-dashoffset: 0;
transform: translateX(30px);
opacity: 0;
}
}
@keyframes group-anim {
43% {
transform: rotate(0);
}
54% {
transform: rotate(-45deg);
}
90% {
transform: rotate(-45deg);
opacity: 1;
}
97% {
transform: rotate(-45deg);
opacity: 0;
}
100% {
transform: rotate(-45deg);
opacity: 0;
}
}
@keyframes heart-anim {
55% {
stroke-dashoffset: 308.522;
fill: transparent;
}
70% {
stroke-dashoffset: 0;
fill: transparent;
}
87% {
stroke-dashoffset: 0;
fill: #E21737;
}
100% {
stroke-dashoffset: 0;
fill: #E21737;
}
}