Почему у меня не работает анимация светофора?

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

div {
  background-color: rgb(0, 0, 0);
  border: 15px solid rgba(128, 119, 119, 0.877);
  padding: 100px;
  display: flex;
  justify-content: center;
  align-items: center;
  flex-direction: column-reverse;
  width: 400px;
  height: 500px;
}

@keyframes colorOne {
  25% {color: black;}
  50% {color: red;}
  75% {color: black;} 
  100% {color: red;}
}
    
#c1 {
  border: 99px solid white;
  border-radius: 50%;
  animation-name: colorOne;
  animation-duration: 5s;
}

@keyframes colorTwo {
  25% {color: black;}
  50% {color: yellow;}
  75% {color: black;}
  100% {color: yellow;}
}
    
#c2 {
  border: 99px solid white;
  border-radius: 50%;
  animation-name: colorTwo;
  animation-duration: 5s;
}
    
@keyframes colorThree {
  25% {color: black;}
  50% {color: green;}
  75% {color: black;}
  100% {color: green;}
}

#c3 {
  border: 99px solid white;
  border-radius: 50%;
  animation-name: colorThree;
  animation-duration: 5s;
}
<div>
  <p id = "c1"></p>
  <p id = "c2" ></p>
  <p id = "c3"></p>
</div>

Добро пожаловать! Пожалуйста, ИЗМЕНИТЕ свой вопрос, указав свой код, не публикуйте свой код в качестве ответа. Вам также необходимо будет включить свой HTML, поскольку CSS без HTML бесполезен для отладки. Пожалуйста, прочитайте как создать минимальный воспроизводимый пример и создайте работоспособный фрагмент

disinfor 26.02.2024 19:52
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Введение в 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. Это простой сайт, ничего вычурного. Основная цель -...
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Travel Booking Angular Template один из лучших Travel & Tour booking template in the world. 30+ валидированных HTML5 страниц, которые помогут...
0
1
68
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

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

Ваш CSS для каждого элемента p использует большую рамку, что означает, что белый цвет, который вы видите, является рамкой.
В объявлении ключевых кадров анимации color задается цвет текста.
Поэтому, если вы измените это на border-color; затем он начнет анимироваться.
Конечно, я не знаю всех масштабов проекта, но вам нужно будет включить задержку анимации, чтобы она выглядела как настоящий светофор, или рассмотреть другой способ управления таймингом.

Повторите приведенные ниже действия для каждой из трех анимаций:

@keyframes colorOne {
  0% {
    border-color: black;
  }
  50% {
    border-color: red;
  }
  75% {
    border-color: black;
  }
  100% {
    border-color: red;
  }
}

Есть ряд вещей, которые можно сравнить и противопоставить CSS в рабочем примере ниже и CSS в вашем вопросе выше.

  1. Вы имели в виду, что свет должен быть перевернут (flex-direction: column-reverse) или правильно (flex-direction: column)?

  2. Если вы хотите анимировать цвет фона элемента, то обычно мы присваиваем элементу width и height и используем свойство background-color.

  3. Как и выше, обычно элементы уровня блока имеют width и height. Но в вертикальной среде flexbox элемент будет иметь width и flex-basis. Если вы хотите, чтобы flex-basis (в данном случае эквивалент height) было 198px и вы хотите, чтобы он не увеличивался и не уменьшался, вы объявите:

    flex: 0 0 198px;
    
  4. Если вы хотите, чтобы последний кадр animation сохранялся, используйте animation-fill-mode: forwards.


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

div {
  background-color: rgb(0, 0, 0);
  border: 15px solid rgba(128, 119, 119, 0.877);
  padding: 100px;
  display: flex;
  justify-content: center;
  align-items: center;
  flex-direction: column;
  width: 400px;
  height: 500px;
}

@keyframes colorOne { 
  25% {background-color: black;}
  50% {background-color: red;}
  75% {background-color: black;}
  100% {background-color: red;}
}
    
#c1 {
  flex: 0 0 198px;
  width: 198px;
  background-color: white;
  border-radius: 50%;
  animation: colorOne 5s linear forwards;
}

@keyframes colorTwo {
  25% {background-color: black;}
  50% {background-color: yellow;}
  75% {background-color: black;}
  100% {background-color: yellow;}
}
    
#c2 {
  flex: 0 0 198px;
  width: 198px;
  background-color: white;
  border-radius: 50%;
  animation: colorTwo 5s linear forwards;
}
    
@keyframes colorThree {
  25% {background-color: black;}
  50% {background-color: green;}
  75% {background-color: black;}
  100% {background-color: green;}
}

#c3 {
  flex: 0 0 198px;
  width: 198px;
  background-color: white;
  border-radius: 50%;
  animation: colorThree 5s linear forwards;
}
<div>
  <p id = "c1"></p>
  <p id = "c2" ></p>
  <p id = "c3"></p>
</div>

Я вижу, что у вас есть отличный ответ, но могу ли я предложить сетку и позволить размеру содержимого сферы определять ширину/высоту с учетом некоторого отступа на контейнере и между сферами в качестве зазора. Обратите внимание, что я изменил абзац на элемент div, чтобы этот пробел работал здесь лучше/лучше.

Используя сетку, подобную той, которую я использовал для контейнера BODY и сферы, легко «суперцентрировать» содержимое элемента/сетки.

Присвойте шарам класс, чтобы сделать его более СУХИМ, а затем просто присвойте каждому «цвет» (для ясности я использовал класс, а не идентификаторы).

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

Попробуйте изменить размер сферы с 8em и посмотрите, как он изменится.

body,
* {
  font-size: 16px;
  box-sizing: border-box;
  margin: 0;
  padding: 0;
  --orb-red: #FF0000;
  --orb-yellow: #FFFF00;
  --orb-green: #008000;
  --orb-off: #000000;
}

body {
  display: grid;
  place-items: center;
}

.light-container {
  background-color: #000000;
  border: 1em solid rgba(128, 119, 119, 0.877);
  padding: 2em;
  display: grid;
  place-items: center;
  gap: 0.5em;
}

.light-orb {
  border-radius: 50%;
  animation-duration: 5s;
  width: 8em;
  height: 8em;
  margin: 1em;
  border: solid 0.25em #ffffff;
}

@keyframes colorOne {
  25% {
    background-color: var(--orb-off);
  }
  50% {
    background-color: var(--orb-red);
  }
  75% {
    background-color: var(--orb-off);
  }
  100% {
    background-color: var(--orb-red);
  }
}

@keyframes colorTwo {
  25% {
    background-color: var(--orb-off);
  }
  50% {
    background-color: var(--orb-yellow);
  }
  75% {
    background-color: var(--orb-off);
  }
  100% {
    background-color: var(--orb-yellow);
  }
}

@keyframes colorThree {
  25% {
    background-color: var(--orb-off);
  }
  50% {
    background-color: var(--orb-green);
  }
  75% {
    background-color: var(--orb-off);
  }
  100% {
    background-color: var(--orb-green);
  }
}

.top-light {
  animation-name: colorOne;
}

.middle-light {
  animation-name: colorTwo;
}

.bottom-light {
  animation-name: colorThree;
}
<div class = "light-container">
  <div class = "light-orb top-light" id = "c1"></div>
  <div class = "light-orb middle-light" id = "c2"></div>
  <div class = "light-orb bottom-light" id = "c3"></div>
</div>

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