Многоцветная текстовая анимация, но только при наведении

Цвет меняется, но когда я убираю мышь, он все равно продолжает менять цвета.

var color_text  = document.getElementById('nav');
var color_text1 = document.getElementById('nav1');
var color_text2 = document.getElementById('nav2');
var color_text3 = document.getElementById('nav3');

var color = new Array(4);
color[0] = "blue";
color[1] = "green";
color[2] = "yellow";
color[3] = "red";

function displaycolor() {
  x = Math.floor(Math.random() * color.length)
  color_text.style.color = color[x];
  setTimeout(displaycolor, 1000);
}

function displaycolor1() {
  x = Math.floor(Math.random() * color.length)
  color_text1.style.color = color[x];
  setTimeout(displaycolor1, 1000);
}

function displaycolor2() {
  x = Math.floor(Math.random() * color.length)
  color _text2.style.color = color[x];
  setTimeout(displaycolor2, 1000);
}

function displaycolor3() {
  x = Math.floor(Math.random() * color.length)
  color_text3.style.color = color[x];
  setTimeout(displaycolor3, 1000);
}

function rmvdis() {
  clearTimeout(); //when mouse leaves
}
<div class = "collapse navbar-collapse" id = "myNavbar">
  <ul class = "nav navbar-nav">
    <li><a id = "nav"  onmouseover = "displaycolor();"  onmouseout = "rmvdis();" href = "index.html">Home</a></li>
    <li><a id = "nav1" onmouseover = "displaycolor1();" onmouseout = "" href = "about.html">About</a></li>
    <li><a id = "nav2" onmouseover = "displaycolor2();" onmouseout = "" href = "#">Gallery</a></li>
    <li><a id = "nav3" onmouseover = "displaycolor3();" onmouseout = "" href = "#">Contact</a></li>
  </ul>
  <ul class = "nav navbar-nav navbar-right">

Итак, я хочу что-то вроде того, когда мышь перемещается, цвет становится нормальным и меняет цвет только тогда, когда мышь находится сверху.

Вот один из способов: jsfiddle.net/khrismuc/m6fb3ask

Chris G 25.04.2019 09:58
clearTimeout(); смысла нет. Вам нужно указать интервал который, который вы хотите очистить. developer.mozilla.org/en-US/docs/Web/API/…
04FS 25.04.2019 10:29
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
3
2
361
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Вы можете добиться этого, используя анимацию CSS3.

.text {
  font-size: 24px;
  font-weight: bold;
}
.text:hover {
  animation: animateColors 1s infinite;
}
@keyframes animateColors {
  0% { color: red; }
  50% { color: green; }
  100% { color: blue; }
}
<div class = "text">Dummy Text</div>

Но это не использует рандомизированную последовательность.

Chris G 25.04.2019 10:08

Существует несколько решений с разной степенью случайности:

Решение 1 (не случайное и только css):

Могу ли я предложить использовать CSS вместо JavaScript для производительности и простоты:

.nav>li>a {
  color: black;
  text-decoration: none;
}

.nav>li>a:hover {
  animation: color-shift 1s alternate infinite;
}

@keyframes color-shift {
  0% {
    color: blue;
  }
  33% {
    color: green;
  }
  66% {
    color: yellow;
  }
  100% {
    color: red;
  }
}
<ul class = "nav navbar-nav">
  <li><a id = "nav" href = "#">Home</a></li>
  <li><a id = "nav1" href = "#">About</a></li>
  <li><a id = "nav2" href = "#">Gallery</a></li>
  <li><a id = "nav3" href = "#">Contact</a></li>
</ul>

Очевидно, что animation-direction: alternate не обеспечивает случайности Math.random(), но выглядит примерно так же.


Решение 2 (более случайное и немного JavaScript):

Если первое решение вас не устраивает, вы можете использовать JavaScript для получения действительно случайной последовательности цветов при каждом наведении курсора (но сохраняйте ее неизменной на протяжении одного события наведения):

function newColors() {
  let colors = ["blue", "green", "yellow", "red"];
  let color_names = ["--color1", "--color2", "--color3", "--color4"];

  colors.forEach(function(color) {
    let random = Math.floor(Math.random() * color_names.length);
    document.documentElement.style.setProperty(color_names.splice(random, 1)[0], color);
  });
}
:root {
  --color1: blue;
  --color2: green;
  --color3: yellow;
  --color4: red;
}

.nav>li>a {
  color: black;
  text-decoration: none;
}

.nav>li>a:hover {
  animation: color-shift 1s alternate infinite;
}

@keyframes color-shift {
  0% {
    color: var(--color1);
  }
  33% {
    color: var(--color2);
  }
  66% {
    color: var(--color3);
  }
  100% {
    color: var(--color4);
  }
}
<ul class = "nav navbar-nav">
  <li><a id = "nav" onmouseover = "newColors()" href = "#">Home</a></li>
  <li><a id = "nav1" onmouseover = "newColors()" href = "#">About</a></li>
  <li><a id = "nav2" onmouseover = "newColors()" href = "#">Gallery</a></li>
  <li><a id = "nav3" onmouseover = "newColors()" href = "#">Contact</a></li>
</ul>

Решение 3 (действительно случайное и JavaScript):

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

const colors = ["blue", "green", "yellow", "red"];
let interval;

document.querySelectorAll(".nav > li > a").forEach(item => {
  item.addEventListener("mouseover", rainbow, false);
  item.addEventListener("mouseout", stop, false);
});

function rainbow() {
  this.style.color = colors[Math.floor(Math.random() * colors.length)];
  interval = setTimeout(() => rainbow.call(this), 250);
}

function stop() {
  clearInterval(interval);
  this.style.color = "black";
}
.nav>li>a {
  color: black;
  text-decoration: none;
}
<ul class = "nav navbar-nav">
  <li><a id = "nav" href = "#">Home</a></li>
  <li><a id = "nav1" href = "#">About</a></li>
  <li><a id = "nav2" href = "#">Gallery</a></li>
  <li><a id = "nav3" href = "#">Contact</a></li>
</ul>

Решение 4 (действительно случайное, но без повторения и JavaScript):

То же, что и решение 3, но без повторяющихся цветов:

const colors = ["blue", "green", "yellow", "red"];
let last = -1;
let interval;

document.querySelectorAll(".nav > li > a").forEach(item => {
  item.addEventListener("mouseover", rainbow, false);
  item.addEventListener("mouseout", stop, false);
});

function rainbow() {
  let i = Math.floor(Math.random() * colors.length);
  this.style.color = colors[i !== last ? i : i + 1];
  interval = setTimeout(() => rainbow.call(this), 250);
  last = i;
}

function stop() {
  clearInterval(interval);
  this.style.color = "black";
}
.nav>li>a {
  color: black;
  text-decoration: none;
}
<ul class = "nav navbar-nav">
  <li><a id = "nav" href = "#">Home</a></li>
  <li><a id = "nav1" href = "#">About</a></li>
  <li><a id = "nav2" href = "#">Gallery</a></li>
  <li><a id = "nav3" href = "#">Contact</a></li>
</ul>
Ответ принят как подходящий

Я рефакторил ваш код:

HTML

<div class = "collapse navbar-collapse" id = "myNavbar">
  <ul class = "nav navbar-nav">
    <li><a id = "nav"  onmouseover = "displaycolor(0);"  onmouseout = "rmvdis(0);" href = "index.html">Home</a></li>
    <li><a id = "nav1" onmouseover = "displaycolor(1);" onmouseout = "rmvdis(1);" href = "about.html">About</a></li>
    <li><a id = "nav2" onmouseover = "displaycolor(2);" onmouseout = "rmvdis(2);" href = "#">Gallery</a></li>
    <li><a id = "nav3" onmouseover = "displaycolor(3);" onmouseout = "rmvdis(3);" href = "#">Contact</a></li>
  </ul>
  <ul class = "nav navbar-nav navbar-right">
  </ul>
</div>

Javascript

var color_text  = document.getElementById('nav');
var color_text1 = document.getElementById('nav1');
var color_text2 = document.getElementById('nav2');
var color_text3 = document.getElementById('nav3');

var color = new Array(4);
color[0] = "blue";
color[1] = "green";
color[2] = "yellow";
color[3] = "red";

var color_texts = [color_text, color_text1, color_text2, color_text3];

var intervalID;

function randomize() {
  return Math.floor(Math.random() * color.length);
}

function displaycolor(index) {
  if (intervalID) return;
  color_texts[index].style.color = color[randomize()];
  intervalID = setInterval(function() {
    color_texts[index].style.color = color[randomize()]
  }, 1000);
}

function rmvdis() {
  clearInterval(intervalID); //when mouse leaves
  intervalID = undefined;
}

Объяснение: вам понадобится setInterval, и вам нужно будет сохранить идентификатор интервала и передать его. Вы также можете работать с тайм-аутами, но использовать их для этой цели неинтуитивно. Я избавился от дублирующихся функций и вместо них использовал параметризацию.

да, я все еще учусь, я понял ошибку, что не дал идентификатор, чтобы очистить интервал

Ravi Singh 28.04.2019 09:28

@RaviSingh, это нормально и понятно. Если этот ответ решил вашу проблему, вы можете принять его как правильный ответ.

Lajos Arpad 28.04.2019 16:01

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

var repeater;
var repeater1;
var repeater2;
var repeater3;

var color_text = document.getElementById('nav');
var color_text1 = document.getElementById('nav1');
var color_text2 = document.getElementById('nav2');
var color_text3 = document.getElementById('nav3');

var color = new Array(4);

color[0] = "blue";
color[1] = "green";
color[2] = "yellow";
color[3] = "red";

function displaycolor() {
  x = Math.floor(Math.random() * color.length)
  color_text.style.color = color[x];
}

function displaycolor1() {
  x = Math.floor(Math.random() * color.length)
  color_text1.style.color = color[x];
}

function displaycolor2() {
  x = Math.floor(Math.random() * color.length)
  color_text2.style.color = color[x];
}

function displaycolor3() {
  x = Math.floor(Math.random() * color.length)
  color_text3.style.color = color[x];
}
<div class = "collapse navbar-collapse" id = "myNavbar">
  <ul class = "nav navbar-nav">
    <li><a id = "nav" onmouseover = "repeater=setInterval(displaycolor,100);" onmouseout = "color_text.style.color='gray';clearInterval(repeater);" href = "index.html">Home</a></li>
    <li><a id = "nav1" onmouseover = "repeater1=setInterval(displaycolor1,100);" onmouseout = "color_text1.style.color='gray';clearInterval(repeater1);" href = "about.html">About</a></li>
    <li><a id = "nav2" onmouseover = "repeater2=setInterval(displaycolor2,100);" onmouseout = "color_text2.style.color='gray';clearInterval(repeater2);" href = "port/gallery.html">Gallery</a></li>
    <li><a id = "nav3" onmouseover = "repeater3=setInterval(displaycolor3,100);" onmouseout = "color_text3.style.color='gray';clearInterval(repeater3);" href = "#">Contact</a></li>
  </ul>

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