Перенести анимацию c css на svg

 .arrow_b {
      position: absolute;
      top: 50%;
      right: 10%;
      transform: translateY(-50%);
      font-size: 14px;
      width: 150px;
      height: 150px;
      display: flex;
      align-items: center;
      justify-content: center;
      border-radius: 50%;
      background: #000000b3;
      box-shadow: 0 0 3px 0 rgb(0 0 0);
      animation: opacity 1s linear 1 normal forwards;
      opacity: 0; 
    }
    
    @keyframes opacity {to {opacity: 1}}
    
    .arrow_b[data-side=left] {
      left: 10%;
      right:unset;
      text-align: right;
    }
    
    .arrow_b.fl[data-side=left] {
      right: unset;
      left: 0;
      width: 45%;
      height: 100%;
      justify-content: end;
      padding: 20px;
      border-radius: 0 100% 100% 0;
      background: #6262626e;
    }
    
    .tooltip {padding-top: 8px;color: #ddd}
    
    .arrow span {
      border: 10px solid transparent;
      border-top: 7px solid transparent;
      border-bottom: 7px solid transparent;
      display: inline-block;
      animation-duration: 1.2s;
      animation-iteration-count: infinite
    }
    
    [data-side=left] .arrow span {border-right: 11px solid #ddd}
    [data-side=left] .arrow span:nth-child(3) {animation-name: arrow-1}
    [data-side=left] .arrow span:nth-child(2) {animation-name: arrow-2}
    [data-side=left] .arrow span:nth-child(1) {border-left: 0px; animation-name: arrow-3}
    
    @keyframes arrow-1 {
      0% {opacity: 0}
      17% {opacity: .9}
      33% {opacity: .6}
      50% {opacity: .3}
      67% {opacity: .3}
      83% {opacity: .3}
      to {opacity: 0}
    }
    
    @keyframes arrow-2 {
      0% {opacity: 0}
      17% {opacity: .3}
      33% {opacity: .9}
      50% {opacity: .6}
      67% {opacity: .3}
      83% {opacity: .3}
      to {opacity: 0}
    }
    
    @keyframes arrow-3 {
      0% {opacity: 0}
      17% {opacity: .3}
      33% {opacity: .3}
      50% {opacity: .9}
      67% {opacity: .6}
      83% {opacity: .3}
      to {opacity: 0}
    }
    

  
  <div class="arrow_b" data-side="left">
        <div>
            <div class="arrow">
                <span></span><span></span><span></span>
            </div>
            <div class="tooltip">Текст</div>
        </div>
    </div>

Данную анимацию возможно перенести в svg? C размерами viewBox="0 0 36 36"


Ответы (1 шт):

Автор решения: Alexandr_TT

Анимация CSS реализует изменение opacity треугольников от одного значения до максимума и обратно до начального значения, создавая эффект плавного изменения цвета.

В SVG анимации этот же самый эффект можно воспроизвести анимацией opacity при изменении параметров values="0.3;1;0.3"

Анимация второго треугольника начинается после окончания анимации первого треугольника Это записывается в атрибуте: begin="an1.end", где an1 ID первой анимации

Анимация третьего треугольника begin="an2.end" после окончания анимации 2 треугольника.

Чтобы зациклить анимации пишем условие begin="0s;an3.end"
что означает - первый запуск первой анимации -0s
второй запуск первой анимации начнется после окончания 3 анимации

.container {
width:30vw;
height:30vh;
}
circle {
 -webkit-filter: drop-shadow( 1px 1.5px 1px rgba(0, 0, 0, .5));
  filter: drop-shadow( 1px 1.5px 1px rgba(0, 0, 0, .5));
}
<div class="container">
<svg  xmlns="http://www.w3.org/2000/svg"  xmlns:xlink="http://www.w3.org/1999/xlink"
          viewBox="0 0 36 36" > 
  <circle cx="18" cy="18" r="15" fill="#4C4C4C" /> 
  <text x="50%" text-anchor="middle" y="24" font-size="4px" fill="white">Текст </text>
 <g id="gr1">
  <path transform="translate(22 13)" opacity="0.3" d="M0,1.75 3.5,0 3.5,3.5z" fill="white"  >
      <animate id="an1" attributeName="opacity" begin="0s;an3.end" dur="0.4s" values="0.3;1;0.3"   />
  </path>  
<path transform="translate(16 13)" opacity="0.3" d="M0,1.75 3.5,0 3.5,3.5z" fill="white"  >
     <animate id="an2" attributeName="opacity" begin="an1.end" dur="0.4s" values="0.3;1;0.3"  />
  </path>      
      
 <path transform="translate(10 13)" opacity="0.3" d="M0,1.75 3.5,0 3.5,3.5z" fill="white"  >
    <animate id="an3" attributeName="opacity" begin="an2.end" dur="0.4s" values="0.3;1;0.3" />
  </path> 
</g>  
 
</svg>       
</div>

В примере вопроса после анимации треугольников есть ещё одна анимация моргания (изменения opacity) одновременно всех треугольников и затем снова цикл изменения непрозрачности треугольников.

Для этого обернем все треугольники в групповой тег и для этой группы создадим анимацию изменения непрозрачности:

<animate id="an4" xlink:href="#gr1" attributeName="opacity" begin="an3.end+0.1s" 
 dur="1s" values="0;1" repeatCount="1"  /> 

А условие повторного запуска первой анимации первого треугольника после окончания групповой анимации будет: begin="0s;an4.end"

.container {
width:30vw;
height:30vh;
}
circle {
 -webkit-filter: drop-shadow( 1px 1.5px 1px rgba(0, 0, 0, .5));
  filter: drop-shadow( 1px 1.5px 1px rgba(0, 0, 0, .5));
}
<div class="container">
<svg  xmlns="http://www.w3.org/2000/svg"  xmlns:xlink="http://www.w3.org/1999/xlink"
          viewBox="0 0 36 36" > 
  <circle cx="18" cy="18" r="15" fill="#4C4C4C" /> 
  <text x="50%" text-anchor="middle" y="24" font-size="4px" fill="white">Текст </text>
 <g id="gr1">
  <path transform="translate(22 13)" opacity="0.3" d="M0,1.75 3.5,0 3.5,3.5z" fill="white"  >
      <animate id="an1" attributeName="opacity" begin="0s;an4.end" dur="0.3s" values="0.3;1;0.3"   />
  </path>  
<path transform="translate(16 13)" opacity="0.3" d="M0,1.75 3.5,0 3.5,3.5z" fill="white"  >
     <animate id="an2" attributeName="opacity" begin="an1.end" dur="0.3s" values="0.3;1;0.3"  />
  </path>      
      
 <path transform="translate(10 13)" opacity="0.3" d="M0,1.75 3.5,0 3.5,3.5z" fill="white"  >
    <animate id="an3" attributeName="opacity" begin="an2.end" dur="0.3s" values="0.3;1;0.3" />
  </path> 
</g>  
  <animate id="an4" xlink:href="#gr1" attributeName="opacity" begin="an3.end+0.1s" dur="0.5s" values="0;1" repeatCount="1"  /> 
   
</svg>       
</div>

→ Ссылка