Предотвращение мерцания при наведении CSS-преобразования

При наведении вертикально вращающегося якоря, если мышь не находится рядом с центром изображения, анимированное преобразование мерцает, используя следующий код:

@keyframes spin {0% {transform: rotateX(0deg);} 100% {transform: rotateX(360deg);}}
a:focus, a:hover {animation: spin 0.9s 1 linear;}

Как предотвратить мерцание без изменения HTML?

https://jsfiddle.net/jabcreations/ahcx0wfv/

Попробуйте дать padding-top на ul a и проверьте.

Satrughna 03.02.2019 05:16
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Введение в CSS
Введение в CSS
CSS является неотъемлемой частью трех основных составляющих front-end веб-разработки.
Как выровнять Div по центру?
Как выровнять Div по центру?
Чтобы выровнять элемент <div>по горизонтали и вертикали с помощью CSS, можно использовать комбинацию свойств и значений CSS. Вот несколько методов,...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
CSS: FlexBox
CSS: FlexBox
Ранее разработчики использовали макеты с помощью Position и Float. После появления flexbox сценарий полностью изменился.
1
1
395
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Чтобы :hover не выводился из a и не мерцал, вы можете переместить :hover из a в его родителя:

@keyframes spin {
  100% {
    transform: rotateX(360deg);
  }
}

ul {
  display: flex;
  flex-direction: column;
  align-items: flex-start;
}

li:hover {
  cursor: pointer;
}

a:focus,
li:hover a {
  animation: spin 0.9s 1 linear;
}

ul a {
  color: #000;
  display: inline-block;
  height: 50px;
}

ul a:focus,
ul li:hover a {
  background-image: radial-gradient(ellipse at center, #777 0%, #222 100%);
  color: #fff;
}
<ul>
  <li><a href = "admin/">Admin</a></li>
  <li><a href = "appointments/">Appointments</a></li>
  <li><a href = "blog/">Blog</a></li>
  <li><a href = "calendar/">Calendar</a></li>
  <li><a href = "contact/">Contact</a></li>
  <li><a href = "events/">Events</a></li>
  <li><a href = "forms/">Forms</a></li>
  <li><a href = "forums/">Forums</a></li>
  <li><a href = "guestbook/">Guestbook</a></li>
  <li><a href = "mail/">Mail</a></li>
  <li><a href = "members/">Members</a></li>
  <li><a href = "newsletter/">Newsletter</a></li>
  <li><a href = "notifications/">Notifications</a></li>
  <li><a href = "search/">Search</a></li>
</ul>

Работало, хотя это будет работать только с двумя элементами; меню будут работать, хотя в примере они не будут привязаны к абзацам. Есть и другие анимации CSS, которые можно сделать, и вопрос сводится к согласованности. Я опубликовал HTML с элементами li, поэтому технически вы не меняли HTML, поэтому я принял его как ответ. Единственный способ улучшить это — сделать это с якорем внутри абзаца, в то время как все еще не будет мерцать или добавлять другой элемент. Большое тебе спасибо!

John 03.02.2019 07:18

Идея без изменения html состоит в том, чтобы переместить анимацию в псевдоэлемент, и вы избежите потери наведения, поскольку основной элемент не будет вращаться:

Вы также можете упростить свою логику, используя переход вместо анимации:

p a {
  color: #000;
  display: inline-block;
  height: 50px;
  z-index:0;
  position:relative;
  color:transparent;
}
p a:before {
  content:attr(data-text);
  position:absolute;
  z-index:-1;
  top:0;
  left:0;
  right:0;
  bottom:0;
  color:#000;
  transition:transform 0.9s linear;
}
p a:focus::before,
p a:hover::before {
  transform: rotateX(360deg);
  background: radial-gradient(ellipse at center, #777 0%, #222 100%);
  color: #fff;
}
<p>some content here <a href = "admin/" data-text = "Admin">Admin</a> and more here</p>

Другие вопросы по теме