CSS дышит <button>остановить текст от дрожания - PullRequest
0 голосов
/ 08 января 2019

У меня круглая кнопка дыхания click me внизу, здесь я использую @keyframes, чтобы оживить дыхание кнопки - пока все хорошо!

Но, как вы можете сказать, текст click me дрожит во время анимации дыхания.

Есть ли способ избежать этого?

.centered {
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%) 
}

button.circle {
  --startSize: 65vh;
  --endSize: 85vh;
  width: var(--startSize);
  height: var(--startSize);
  background: teal;
  border-radius: 100%;
  animation-name: breathe;
  animation-play-state: running;
  animation-duration: 4.5s;
  animation-iteration-count: infinite;
  animation-direction: alternate;
    border: none;

}

@keyframes breathe {
  
  0% {
    width: var(--startSize); 
    height: var(--startSize);
  }
  
  25% {
    width: var(--startSize); 
    height: var(--startSize);
  }

  75% {
    width: var(--endSize);
    height: var(--endSize);
  }
  
  100% {
    width: var(--endSize);
    height: var(--endSize);
  }
}
<a href="https://www.w3schools.com"><button class="circle centered">Click me</button></a>

Ответы [ 2 ]

0 голосов
/ 08 января 2019

Возможно, лучший способ оживить это - использовать transform: scale(...) на псевдоэлементе ::after. Используя этот метод, мы получаем следующие преимущества:

  1. Анимация больше не влияет на поток документов 1 . При анимации предпочитают transform и opacity свойствам, таким как width или height. Последний будет влиять на элементы вокруг него (поток документов). Преобразования являются чисто визуальными - они не влияют на другие элементы с точки зрения размещения, что означает улучшенную производительность .
  2. Текст отделен от анимации, что означает отсутствие дрожания.

.centered {
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%) 
}

button.circle {
  width: 65vh;
  height: 65vh;
  border: 0;
  background-color: transparent;
}

button.circle::after {
  z-index: -1;
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
  content: '';
  display: block;
  background: teal;
  border-radius: 100%;
  animation: breathe 4.5s ease infinite alternate running;
}

@keyframes breathe {
  from { transform: scale(1); }
  to { transform: scale(1.4); }
}
<a href="https://www.w3schools.com"><button class="circle centered">Click me</button></a>

Примечание: Поддержка браузером для этого метода


1. Я понимаю, что кнопка центрирована и расположена absolute, что означает, что она не влияет на поток документов с самого начала. Тем не менее, этот метод анимации с помощью преобразований является более гибким для любого сценария.

0 голосов
/ 08 января 2019

Проблема со свойством transform, которое вы используете для центрирования кнопки. Я собрал JSFiddle, используя свойство grid для центрирования кнопки по горизонтали и вертикали, что останавливает дрожание текста.

body,
html {
  height: 100%;
  display: grid;
}

.circle-outer {
  margin: auto;
  text-align: center;
}

button.circle {
  --startSize: 65vh;
  --endSize: 85vh;
  width: var(--startSize);
  height: var(--startSize);
  background: teal;
  border-radius: 100%;
  animation-name: breathe;
  animation-play-state: running;
  animation-duration: 4.5s;
  animation-iteration-count: infinite;
  animation-direction: alternate;
  border: none;
}

@keyframes breathe {
  0% {
    width: var(--startSize);
    height: var(--startSize);
  }
  25% {
    width: var(--startSize);
    height: var(--startSize);
  }
  75% {
    width: var(--endSize);
    height: var(--endSize);
  }
  100% {
    width: var(--endSize);
    height: var(--endSize);
  }
}
<div class="circle-outer">
  <a href="https://www.w3schools.com"><button class="circle">Click me</button></a>
</div>

И рабочий пример:

https://jsfiddle.net/WebDevelopWolf/7ujm2L5v/11/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...