Выделите элемент, затем вернитесь к исходному цвету

#css #css-transitions #css-animations #background-color

#css #css-переходы #css-анимации #background-color

Вопрос:

У меня есть элементы с разными background-color именами. При нажатии на ссылку я хочу выделить элемент другим цветом (желтым), а затем вернуться к исходному цвету элемента. Я знаю, что есть currentColor для элемента color , но для background-color ничего подобного нет.

Как я могу плавно перейти от цвета выделения обратно к исходному цвету элемента background-color ? Прямо сейчас цвет выделения становится прозрачным, а затем резко возвращается к исходному цвету, когда анимация заканчивается.

 :target td {
  animation: highlight 1s;
}

@keyframes highlight {
  from {
    background-color: yellow;
  }
  to {
  /* How do I set this back to the element's original background-color? */
    background-color: transparent;
  }
}  
 <ul>
  <li>
    <a href="#link1">Link #1</a>
  </li>
  <li>
    <a href="#link2">Link #2</a>
  </li>
    <li>
    <a href="#link3">Link #3</a>
  </li>
</ul>

<table>
  <tr id="link1">
    <td>This is Link #1</td><td>// Fine.</td>
  </tr>
  <tr id="link2">
    <td bgcolor="orange">This is Link #2</td><td>// Ugly.</td>
  </tr>
    <tr id="link3">
    <td bgcolor="red">This is Link #3</td><td>// Ugly.</td>
  </tr>
</table>  

Комментарии:

1. Если бы когда-нибудь было время, когда «просто используйте jQuery» было допустимым … 🙂

2. Но, о! радость работы с нулевыми внешними библиотеками!

Ответ №1:

Просто не включайте to для анимации. Это работает, потому что, если конечное (или начальное) состояние не определено, браузер будет использовать существующие стили элемента (ПОВТОРНО: допустимые списки ключевых кадров в MDN)

 div {
  margin: 200px 0;
}

:target td {
  animation: highlight 1s;
}

@keyframes highlight {
  from {
    background-color: yellow;
  }
}  
 <ul>
  <li>
    <a href="#link1">Link #1</a>
  </li>
  <li>
    <a href="#link2">Link #2</a>
  </li>
    <li>
    <a href="#link3">Link #3</a>
  </li>
</ul>

<table>
  <tr id="link1">
    <td>This is Link #1</td><td>// Fine.</td>
  </tr>
  <tr id="link2">
    <td bgcolor="orange">This is Link #2</td><td>// Ugly.</td>
  </tr>
    <tr id="link3">
    <td bgcolor="red">This is Link #3</td><td>// Ugly.</td>
  </tr>
</table>  

Ответ №2:

Другой вариант — использовать background-color: initial на 50% анимации — смотрите демонстрацию ниже:

 div {
  margin: 200px 0;
}

:target td {
  animation: highlight 2s;
}

@keyframes highlight {
  0% {
    background-color: yellow;
  }
  50% {
    background-color: initial;
  }
}  
 <ul>
  <li>
    <a href="#link1">Link #1</a>
  </li>
  <li>
    <a href="#link2">Link #2</a>
  </li>
    <li>
    <a href="#link3">Link #3</a>
  </li>
</ul>

<table>
  <tr id="link1">
    <td>This is Link #1</td><td>// Fine.</td>
  </tr>
  <tr id="link2">
    <td bgcolor="orange">This is Link #2</td><td>// Ugly.</td>
  </tr>
    <tr id="link3">
    <td bgcolor="red">This is Link #3</td><td>// Ugly.</td>
  </tr>
</table>  

Комментарии:

1. О, мне нравится эта идея. Похоже, что это не работает в IE 11.

Ответ №3:

если вы просто удалите to из ключевых кадров, он примет назначенный цвет фона.

чтобы понять это, прочитайте этот раздел mdn doc https://developer.mozilla.org/en-US/docs/Web/CSS/@keyframes#Valid_keyframe_lists

 div {
  margin: 200px 0;
}

:target td {
  animation: highlight 2s;
}

@keyframes highlight {
  from {
    background-color: yellow;
  }
}  
 <ul>
  <li>
    <a href="#link1">Link #1</a>
  </li>
  <li>
    <a href="#link2">Link #2</a>
  </li>
    <li>
    <a href="#link3">Link #3</a>
  </li>
</ul>

<table>
  <tr id="link1">
    <td>This is Link #1</td><td>// Fine.</td>
  </tr>
  <tr id="link2">
    <td bgcolor="orange">This is Link #2</td><td>// Ugly.</td>
  </tr>
    <tr id="link3">
    <td bgcolor="red">This is Link #3</td><td>// Ugly.</td>
  </tr>
</table>