Цвет меняется, но когда я убираю мышь, он все равно продолжает менять цвета.
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">Итак, я хочу что-то вроде того, когда мышь перемещается, цвет становится нормальным и меняет цвет только тогда, когда мышь находится сверху.
clearTimeout(); смысла нет. Вам нужно указать интервал который, который вы хотите очистить. developer.mozilla.org/en-US/docs/Web/API/…


![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вы можете добиться этого, используя анимацию 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>Но это не использует рандомизированную последовательность.
Существует несколько решений с разной степенью случайности:
Решение 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, и вам нужно будет сохранить идентификатор интервала и передать его. Вы также можете работать с тайм-аутами, но использовать их для этой цели неинтуитивно. Я избавился от дублирующихся функций и вместо них использовал параметризацию.
да, я все еще учусь, я понял ошибку, что не дал идентификатор, чтобы очистить интервал
@RaviSingh, это нормально и понятно. Если этот ответ решил вашу проблему, вы можете принять его как правильный ответ.
Я только что открыл это и был рад получить ответы, но я также решил это, и я тоже узнал из ваших ответов, спасибо, вот как я это сделал
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>
Вот один из способов: jsfiddle.net/khrismuc/m6fb3ask