16.11.2014, 13:58
|
Интересующийся
|
|
Регистрация: 08.11.2014
Сообщений: 27
|
|
Смена цвета div
Есть, допутсим три, дива. Нужно написать функцию которая будет менять их цвет через каждый интервалы времени. Эти интервалы, могут быть разными для разных дивов. Вот функция. Но, страница даже не грузится
function changeColor (a, id){
document.getElementById("id").style.backgroundColor = getRandomColor();
setTimeout(function() {changeColor(a, id)}, a);
}
Здесь а - это параметр, задающей рандомное количество милисекунд(другой метод). getRandomColor() - метод создающий случайный цвет. Подскажите, что не так.
|
|
16.11.2014, 14:14
|
Профессор
|
|
Регистрация: 09.11.2014
Сообщений: 610
|
|
document.getElementById("id").style/document.getElementById(id).style
|
|
16.11.2014, 14:35
|
Профессор
|
|
Регистрация: 09.11.2014
Сообщений: 610
|
|
<html>
<head>
<meta charset="windows-1251" />
</head>
<body>
<div id="foo">foo</foo>
<script>
r=function(){return Math.round(Math.random())}
getRandomColor=function(){return r()? "grey":"black"}
changeColor=function (a, id){
document.getElementById(id).style.background = getRandomColor()
setTimeout(function() {changeColor(a, id)}, a);
}
changeColor(1000, "foo")
</script>
</body>
</html>
Вообще, setInterval для таких вещей использовать логичней.
Последний раз редактировалось krutoy, 16.11.2014 в 14:39.
|
|
16.11.2014, 14:55
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,123
|
|
Сообщение от krutoy
|
setInterval для таких вещей использовать логичней
|
почему?
|
|
16.11.2014, 14:57
|
Интересующийся
|
|
Регистрация: 08.11.2014
Сообщений: 27
|
|
Да, я видел такой пример в интернете. Тут понятно. А вконтексте такой задачи
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title></title>
<body>
<script type="text/javascript">
var params = {
lines: [
{
background: getRandomColor(),
updateTime: randomNumber(1, 1000),
elements: [{
background: getRandomColor(),
width: 25
},
{
background: getRandomColor(),
width: 25
},
{
background: getRandomColor(),
width: 25
}]
},
{
background: getRandomColor(),
updateTime: randomNumber(1,800),
elements: [{
background: getRandomColor(),
width: 15
},
{
background: getRandomColor(),
width: 15
},
{
background: getRandomColor(),
width: 15
}]
},
{
background: getRandomColor(),
updateTime: randomNumber(1,1200),
elements: [{
background: getRandomColor(),
width: 15
},
{
background: getRandomColor(),
width: 15
},
{
background: getRandomColor(),
width: 15
}]
}]
};
/*global document: false*/
function getRandomColor() {
var letters = '0123456789ABCDEF'.split('');
var color = '#';
for (var i = 0; i < 6; i++ ) {
color += letters[Math.floor(Math.random() * 16)];
}
return color;
}
function randomNumber (a, b){
a = parseInt(a);
b = parseInt(b);
return Math.floor( Math.random()* (b - a + 1)) + a;
}
// document.getElementById(id).style.backgroundColor = getRandomColor();
// setInterval('changeColor(a, id)', a);
function changeColor1 (a, id){
document.getElementById(id).style.backgroundColor = getRandomColor();
setTimeout(function() {changeColor(a, id)}, a);
}
// function changeColor (id){
// document.getElementById(id).style.backgroundColor = getRandomColor();
// }
var a = 100/params.lines.length;
var array = new Array();
for (var i = 0; i < params.lines.length; i++ ){
var d = document.createElement('div');
d.id = 'i';
d.style.width = 100 + '%';
d.style.height = a + '%';
d.style.backgroundColor = params.lines[i].background;
array.push(i);
// changeColor1(params.lines[i].updateTime, i);
for (var j =0; j < params.lines[i].elements.length; j++){
var div1 = document.getElementById('i');
var div2 = document.createElement('div');
div2.style.backgroundColor = params.lines[i].elements[j].background;
div2.style.float = 'left';
div2.style.width = params.lines[i].elements[j].width + '%';
div2.style.height = a + '%';
div2.innerHTML;
document.body.appendChild(div2);
}
document.body.appendChild(d);
// setInterval(changeColor('i'),params.lines[i].updateTime);
}
for (var k = 0; k < array.length; k++){
changeColor(params.lines[k].updateTime, array[k]);
}
</script>
<link rel="stylesheet" type="text/css" href="CSS.css">
</body>
</head>
</html>
Нужно, чтобы нижние дивы полсе загрузки страницы меняли цвета. Пробовал и через setInterval - закомментированные. Но не выходит.
|
|
16.11.2014, 15:01
|
Профессор
|
|
Регистрация: 09.11.2014
Сообщений: 610
|
|
рони,
Потому что тут бесполезная рекурсия, имитирующая тупую итерацию
|
|
16.11.2014, 20:12
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,123
|
|
Vladimir93,
Вариант для современных браузеров ... меняет фон последних трёх div -- время из data - вопросы знатокам , почему не работает в хроме, почему не работает строка 44 без window.setTimeout и как заменить если можно window.setTimeout ... есть и ещё вопросы
<!DOCTYPE HTML>
<html>
<head>
<title>Untitled</title>
<meta charset="utf-8">
<style>
.animated {
transition: background-color 2s ease-out;
width: 150px;
height: 150px;
margin: 10px;
border: 1px solid black;
display: inline-block;
background-color: rgb(255, 255, 0);
}
</style>
</head>
<body>
<div class="animated" data-duration="5s"></div>
<div class="animated" data-duration="5s"></div>
<div class="animated" data-duration=".7s"></div>
<div class="animated" data-duration="8s"></div>
<script> function randomRGBComponent() {
return Math.round(Math.random() * 255);
}
function randomRGBColor() {
return 'rgb(' + randomRGBComponent() + ', ' + randomRGBComponent() + ', ' + randomRGBComponent() + ')';
}
function setBackgroundColor(elem, s) {
function go() {
var color = randomRGBColor()
elem.style.backgroundColor = color
}
elem.style.transitionDuration = s;
elem.addEventListener('transitionend', go, false);
go() //window.setTimeout(go, 0);
}
window.onload = function() {
[].forEach.call(document.querySelectorAll('.animated:nth-last-child(-n + 4)'), function(elem, i) {
setBackgroundColor(elem, elem.dataset.duration)
})
}
</script>
</body>
</html>
Последний раз редактировалось рони, 17.11.2014 в 23:52.
|
|
16.11.2014, 22:29
|
|
Профессор
|
|
Регистрация: 13.03.2013
Сообщений: 1,572
|
|
еще вариант
<!DOCTYPE HTML>
<html>
<head>
<title>Untitled</title>
<meta charset="utf-8">
<style>
div[id^=animated] {
transition: background-color 0.5s ease-out;
width: 150px;
height: 150px;
margin: 10px;
border: 1px solid black;
display: inline-block;
background-color: rgb(255, 255, 0);
}
</style>
</head>
<body>
<div id="animated1"></div>
<div id="animated2"></div>
<div id="animated3"></div>
<script>
function ColorDiv(params) {
if (!(this instanceof ColorDiv)) {
return new ColorDiv(params);
}
this.initialize.apply(this, arguments);
}
ColorDiv.prototype.initialize = function (params) {
setInterval(function () {
var letters = '0123456789ABCDEF';
var color = '#';
for (var i = 0; i < 6; i++) {
color += letters.charAt(Math.floor(Math.random() * 16));
}
params.element.style.backgroundColor = color;
}, params.interval);
}
ColorDiv({
element: document.getElementById('animated1'),
interval: 800
});
ColorDiv({
element: document.getElementById('animated2'),
interval: 1200
});
ColorDiv({
element: document.getElementById('animated3'),
interval: 2000
});
</script>
</body>
</html>
Последний раз редактировалось Vlasenko Fedor, 16.11.2014 в 22:41.
|
|
17.11.2014, 12:13
|
|
|
Регистрация: 10.07.2008
Сообщений: 3,873
|
|
Сообщение от krutoy
|
Потому что тут бесполезная рекурсия, имитирующая тупую итерацию
|
Здесь нет длинного рекурсивного стека вызовов, каждый setTimeout вызывает функцию в новом стеке.
|
|
17.11.2014, 15:22
|
Профессор
|
|
Регистрация: 09.11.2014
Сообщений: 610
|
|
Octane,
однако это не повод писать через жопу.
|
|
|
|