Должно: навевать работу изменения стиля псевдого состояния после завершения анимации CSS

Должны ли изменения стиля, указанные в псевдо-состоянии, такие как :hover работать после того, как анимация CSS завершила работу над элементом?

EDIT: возможно, более уместно, я должен спросить: почему применение "форвардов" в анимации предотвращает переопределение более определенного стиля?

РЕДАКТИРОВАТЬ 2: Оказывается, это на самом деле проблема с перекрестным браузером. Например. Chrome (я запускал версию 38.0.2125.111) ведет себя некорректно, но Firefox обрабатывает его по спецификациям.

Короче говоря: согласно спецификациям (как указано в chrona ниже) добавление !important к переопределению должно отображать стиль. Однако в настоящее время это правильно обрабатывает только Firefox.

Вот сокращение:

@keyframes go {
  0% {
    background: green;
  }
  100% {
    background: pink;
  }
}

@-webkit-keyframes go {
  0% {
    background: green;
  }
  100% {
    background: pink;
  }
}

.box {
  animation: go 3s forwards;
  -webkit-animation: go 3s forwards;
  
}

.box:hover {
    background: orange!important;
  cursor: pointer;
 }
<div class="box">Hover states don't work after animation</div>

Ответы

Ответ 1

  • а)

О том, почему это происходит, я не могу сказать точно. Но это, очевидно, связано с свойством animation-fill-mode, которое вы устанавливаете как forwards. Это, по определению, устанавливает визуальный стиль элемента как последний ключевой кадр анимации:

форварды
После окончания анимации (как определено его числом анимации-итерации) анимация будет применять значения свойств за время окончания анимации.

Определение MDN немного более понятно:

форварды
Цель будет сохранять вычисленные значения, установленные последним ключевым кадром, встречающимся во время выполнения. Последний ключевой кадр зависит от значения направления анимации и анимации-итерации-count:

Но я не знаю, почему он не позволяет состоянию :hover переопределять стили.

  • б)

Теперь, о том, как заставить его работать, вы можете удалить свойство forwards из анимации. В этом случае вам нужно будет отменить анимацию, поэтому исходное состояние элемента (когда анимация заканчивается и удаляет визуальный эффект) - это цвет, который вы хотите исправить:

@keyframes go {
  0% {
    background: pink;
  }
  100% {
    background: green;
  }
}

@-webkit-keyframes go {
  0% {
    background: pink;
  }
  100% {
    background: green;
  }
}

.box {
  animation: go 2s;
  -webkit-animation: go 2s;
  -webkit-animation-direction: reverse;
  animation-direction: reverse;
  background: pink;
}

.box:hover {
    background: orange;
  cursor: pointer;
 }
<div class="box">Hover states don't work after animation</div>

Ответ 2

Цитируется из Работа с CSS-анимациями

Анимация CSS влияет на значения вычисляемых свойств. Во время выполнения анимации вычисленное значение для свойства контролируется анимацией. Это переопределяет значение, указанное в обычной системе стилизации. Анимация отменяет все обычные правила, но переопределяется важными правилами.

и немного дальше вниз (Продолжительность анимации):

[...], а анимация, заполняющая вперед, сохранит значение, указанное на 100% ключевом кадре, даже если анимация была мгновенной. Кроме того, анимационные события все еще запущены.

Как вы анимируете background, по умолчанию он не может быть переопределен (за исключением важных правил). Если вы не хотите использовать !important, вы должны пойти ответ LcSalazar. (В настоящее время только Firefox реагирует, как описано в спецификациях [6 ноября 2014])

@keyframes go {
  0% {
    background: green;
  }
  100% {
    background: pink;
  }
}

@-webkit-keyframes go {
  0% {
    background: green;
  }
  100% {
    background: pink;
  }
}

.box {
  animation: go 3s forwards;
  -webkit-animation: go 3s forwards;
  
}

.box:hover {
    background: orange !important;
  cursor: pointer;
 }
<div class="box">Hover states don't work after animation</div>

Ответ 3

На самом деле я не совсем понимаю ваш вопрос, возможно, вам нужны такие эффекты? http://jsfiddle.net/abruzzi/5td8w6jx/

@keyframes go {
    0% {
        background: green;
    }
    100% {
        background: pink;
    }
}
@-webkit-keyframes go {
    0% {
        background: green;
    }
    100% {
        background: pink;
    }
}


.box {
    animation: go 3s forwards;
    -webkit-animation: go 3s forwards;
}
.box:hover {
    -webkit-animation: none;
    background: orange;
    cursor: pointer;
}

Однако, с этими кодами, когда вы просматриваете текст, анимация будет воспроизводиться.