Подобрать цвет для анимации курсора и диапазона внутри

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

Вот минимальный пример:

@keyframes terminal-blink {
  0%, 100% {
      background-color: var(--background, #000);
      color: var(--color, #aaa);
      border-bottom: none;
      border-left: none;
      margin-left: 0;
  }
  50% {
      background-color: var(--color, #aaa);
      color: var(--background, #000);
      border-bottom: none;
      border-left: none;
      margin-left: 0;
  }
}

.cursor.blink {
    -webkit-animation: terminal-blink 1s infinite steps(1, start);
       -moz-animation: terminal-blink 1s infinite steps(1, start);
        -ms-animation: terminal-blink 1s infinite steps(1, start);
            animation: terminal-blink 1s infinite steps(1, start);
}
body {
   background: black;
   font-family: monospace;
}
.token.punctuation {
    color: #999;
}
.token.tag {
    color: red;
}
<div>
  <span class = "cursor blink">
     <span style = "font-weight:bold;" class = "token punctuation" data-text = "<">&lt;</span>
  </span>
</div>
<br/>
<div>
  <span class = "cursor blink">
     <span style = "font-weight:bold;" class = "" data-text = "x">x</span>
  </span>
</div>

<div>
  <span class = "cursor blink">
     <span style = "font-weight:bold;" class = "token tag" data-text = "x">x</span>
  </span>
</div>

Я попытался установить другую анимацию, которая перезапишет .token.punctuation, используя:

 @keyframes prism-cursor {
     0%, 100% {
         color: currentColor;
     }
     50% {
         color: #000;
     }
 }
 .cursor .token {
     animation: prism-cursor 1s infinite steps(1, start);
 }

но это не работает и не синхронизируется, похоже, что есть 3-х шаговая анимация.

Я хочу иметь color: var(--color), когда курсор виден (анимация на 50%), но цвет из .token, когда курсор невидим 0%, 100%. (.token.tag должен быть красным на черном фоне и черным на сером).

Вот пример фактического кода, который у меня есть https://codepen.io/jcubic/pen/MqyvEG

Возможно ли что-то подобное без модификации .token css или html?

Приемы 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 сценарий полностью изменился.
0
0
47
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

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

@keyframes terminal-blink {
  0%, 100% {
  background-color: var(--background, #000);
  color: var(--color, #aaa);
  border-bottom: none;
  border-left: none;
  margin-left: 0;
  }
  50% {
  background-color: var(--color, #aaa);
  color: var(--background, #000);
  border-bottom: none;
  border-left: none;
  margin-left: 0;
  }
}

@keyframes textHighlight {

  0%, 100% {
color: red;
  }
  50% {
color: blue;
  }
}

.cursor.blink {
-webkit-animation: terminal-blink 1s infinite steps(1, start);
   -moz-animation: terminal-blink 1s infinite steps(1, start);
    -ms-animation: terminal-blink 1s infinite steps(1, start);
        animation: terminal-blink 1s infinite steps(1, start);
}
.token {
-webkit-animation: textHighlight 1s infinite steps(1, start);
   -moz-animation: textHighlight 1s infinite steps(1, start);
    -ms-animation: textHighlight 1s infinite steps(1, start);
        animation: textHighlight 1s infinite steps(1, start);
}
body {
   background: black;
   font-family: monospace;
}
<div>
  <span class = "cursor blink">
     <span style = "font-weight:bold;" class = "token" data-text = "<">&lt;</span>
  </span>
</div>
<br/>
<div>
  <span class = "cursor blink">
     <span style = "font-weight:bold;" class = "token" data-text = "x">x</span>
  </span>
</div>

Это не сработает, потому что я хочу иметь цвет: var (- color), когда курсор виден (анимация на 50%), но цвет из .token, когда курсор невидим 0%, 100%.

jcubic 27.08.2018 11:08

Проблема в том, что у меня есть цвета в .token, и я хочу, чтобы они были в анимации, желательно без модификации класса .token.

jcubic 27.08.2018 11:35

Сначала я предлагаю рассмотреть что-нибудь еще, кроме steps. Как я объяснил в другом вопросе (Анимация переключения цвета границы CSS: неверный цвет "от"), это может привести к путанице в том, как это работает.

Учитывая это, вы можете легко применить вторую анимацию без проблем с синхронизацией:

@keyframes terminal-blink {
  0%,
  50% {
    background-color: var(--background, #000);
    color: var(--color, #aaa);
    border-bottom: none;
    border-left: none;
    margin-left: 0;
  }
  50.1%,
  100% {
    background-color: var(--color, #aaa);
    color: var(--background, #000);
    border-bottom: none;
    border-left: none;
    margin-left: 0;
  }
}

@keyframes prism-cursor {
  0%,
  50% {
    color: var(--c,white);
  }
  50.1%,
  100% {
    color: #000;
  }
}

.cursor.blink {
  animation: terminal-blink 1s infinite linear;
}

body {
  background: black;
  font-family: monospace;
}

.token.punctuation {
  --c:red;
  color: var(--c);
  animation: prism-cursor 1s infinite linear;
}
<div>
  <span class = "cursor blink">
     <span style = "font-weight:bold;" class = "token punctuation" data-text = "<">&lt;</span>
  </span>
</div>
<br>
<div>
  <span class = "cursor blink">
     <span style = "font-weight:bold;" class = "" data-text = "x">x</span>
  </span>
</div>

И вы можете сократить код до одной анимации, если переместите все классы на один уровень:

@keyframes terminal-blink {
  0%,
  50% {
    background-color: var(--background, #000);
    color: var(--c, #aaa);
    border-bottom: none;
    border-left: none;
    margin-left: 0;
  }
  50.1%,
  100% {
    background-color: var(--color, #aaa);
    color: var(--background, #000);
    border-bottom: none;
    border-left: none;
    margin-left: 0;
  }
}

.cursor.blink {
  animation: terminal-blink 1s infinite linear;
}

body {
  background: black;
  font-family: monospace;
}

.token {
  --c:red;
  color: var(--c);
}
.punctuation {
  --c:green;
  color: var(--c);
}
<div>
  <span class = "cursor blink token ">
     <span style = "font-weight:bold;" data-text = "<">&lt;</span>
  </span>
</div>
<br>
<div>
  <span class = "cursor blink punctuation">
     <span style = "font-weight:bold;" class = "" data-text = "x">x</span>
  </span>
</div>

@jcubic --c определен в классе :) поэтому он возьмет его оттуда;) и если ничего не определено, он будет белым ... проверьте мое обновление, я добавил еще один пример

Temani Afif 27.08.2018 11:17

Я не заметил полосу прокрутки, поэтому кажется, что без --c невозможно, я хотел использовать prismjs css без изменений.

jcubic 27.08.2018 11:19

@jcubic какие вещи нельзя обновить? Я не знаю как работает prismjs

Temani Afif 27.08.2018 11:23

.token и .punctuation пришли из prismjs, и я ввожу их в .cursor, я бы не хотел изменять класс курсора на основе вывода призмы, потому что мне нужно было бы проанализировать вывод призмы и изменить DOM для обновления. Вот пример того, что у меня есть codepen.io/jcubic/pen/MqyvEG

jcubic 27.08.2018 11:31

Я отмечаю ваше решение, так как оно почти решает мою проблему, единственная проблема в том, что мне нужно изменить классы .token.

jcubic 27.08.2018 11:37

@jcubic хорошо понял, обновлю, если найду обходной путь

Temani Afif 27.08.2018 11:39

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

jcubic 05.09.2018 09:26
Ответ принят как подходящий

Я получил этот код. Сначала я добавил еще один диапазон внутри того, у которого есть фон, и применил этот код:

.cmd span[data-text] span {
    background: inherit;
    color: inherit;
}
.cmd .cursor.blink > span[style* = "background"] span {
    animation: terminal-blink-span 1s infinite steps(1, start);
    position: absolute;
    top: 0;
}
.cmd .cursor.blink > span[style* = "background"] {
    postion: relative;
    min-width: 1ch;
    display: inline-block;
}
/*
 * I've created another css var here, because
 * I've added --color to span and I've needed to
 * have a way to select original color as backgound
 * for cursor animation
 */
.cmd {
    --original-color: var(--color, #aaa);
}
@keyframes terminal-blink-span {
    0%, 100% {
        background: inherit;
        color: inherit;
    }
    50% {
        background: var(--original-color, #aaa);
        color: var(--background, #000);
    }
}

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