Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   загадка при анимации (https://javascript.ru/forum/dom-window/22814-zagadka-pri-animacii.html)

c124578 01.11.2011 17:59

загадка при анимации
 
если задаю стили для двигаемого объекта в прямо в HTML файле или через DOM, то двигается нормально и красиво, если для этого объекта есть непустая запись в отдельном CSS файле (пусть даже, не влияющия на позицию, например backgroud) - анимация прерывистая и некрасивая.

Использую простой JS, алгоритм любой, даже x = x+3, дает плохую картину.
setTimout(function() { анимация }, 15) без CSS файла делает примерно в 6 раз больше итераций, чем с CSS файлом.
Что за чудеса?

ksa 01.11.2011 20:00

Цитата:

Сообщение от c124578
Что за чудеса?

Пример будет?

c124578 01.11.2011 20:35

Так хорошо:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<link rel="stylesheet" href="st\\\\yle.css" type="text/css">
</head>

<style>
#image {
position:absolute;
background:url("images/1/1.jpg");
width:500px;
height:300px;
}
</style>

<body>

<div id="image"></div>

<script type="text/javascript">

var result = 0;

setTimeout(function() {

    result++;
    document.getElementById("image").style.left = result + "px";

    if (result < 101) 
        setTimeout(arguments.callee, 20);
}, 0);

</script>

</body>
</html>

а так плохо:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<link rel="stylesheet" href="style.css" type="text/css">
</head>

<style>
#image {
position:absolute;
background:url("images/1/1.jpg");
width:500px;
height:300px;
}
</style>

<body>

<div id="image"></div>

<script type="text/javascript">

var result = 0;

setTimeout(function() {

    result++;
    document.getElementById("image").style.left = result + "px";

    if (result < 101) 
        setTimeout(arguments.callee, 20);
}, 0);

</script>

</body>
</html>


style.css :
#image{
display:block;
}
Мистика!

ksa 01.11.2011 20:59

c124578, т.е. на всё влияет простое подключение цсс-файла с тем небольшим содержимым? Просто пробовать буду только завтра...

c124578 01.11.2011 21:03

именно так и есть, причем содержимое может быть абсолютно любое.

ksa 01.11.2011 21:08

Значит завтра будет что посмотреть... :D

antibot 01.11.2011 21:36

Ну для начала

document.getElementById("image").style.left = result + "px";

Вынеси из цикла...

var image=document.getElementById("image");

////

image.style.left = result;

А во вторых в обоих случает разница - 1-2 млс при 100 повторах...
В общем нет разницы...

Зато document.getElementById("image").style.left = result + "px";
замедляет очень сильно из за вызова 1 функции и 2 свойств каждый раз. Вот откуда и лишние итерации...

dmitriymar 01.11.2011 22:00

Теоретически:
стиль элемента и в таблице внешней и во внутренней -для чего?
1 по логике вещей-внутренняя переопределяет значение внешней при каждой итерации и затем меняется на динамическое-больше неоткуда браться.
2 скрипт запускается на выполнение до полной загрузки таблицы-отсюда выходит поведение в пункте 1.
вариант определить-запускать код по событию onload.как вариант -а браузер сколько потоков загрузки одновременно поддерживает?
а вообще при подключении внешней таблицы и запуске по onload в подобной задаче у меня было всё норм

trikadin 01.11.2011 22:32

c124578, а браузер-то, браузер какой?

Тут один товарищ на 15-й хром жаловался...

c124578 01.11.2011 22:35

ставил id="image" onmouseover="анимация", уже все загрузилось, что можно, то же самое получается.
Кто делал слайдер-меню, галереи, скажите был у вас такой вопрос; если нет - надо полагать, что-то конкретно на моей ЭВМ?
браузер FF 3.6

trikadin 01.11.2011 22:44

Опять же, доберусь до ff 3.6 - попробую. Сейчас не могу...

Гугление по теме результатов не дало?

ksa 02.11.2011 09:14

Цитата:

Сообщение от c124578 (Сообщение 134012)
Так хорошо:
...
а так плохо:
...

Посмотрел оба варианта в ИЕ8 - ничего "медленого" и "различного" в анимации не заметил.

ksa 02.11.2011 09:16

Цитата:

Сообщение от c124578
браузер FF 3.6

Хватит с меня и коллекции ИЕ*... :D Остальные браузеры у меня "последней модели"...

dmitriymar 02.11.2011 10:06

3.6 норм работает с внешней таблицей.
Цитата:

Сообщение от c124578
ставил id="image" onmouseover="анимация", уже все загрузилось, что можно, то же самое получается.

с чего такой вывод? то что скрипт заработал ещё не значит что всё загрузилось

trikadin 02.11.2011 15:28

ksa, таки нет) Я видел людей, которые отключали автоматическое обновление ff (sic!), и на моё недоумённое "Зачем?!" говорили "А я привык к этой версии, зачем мне обновляться?".

ksa 02.11.2011 15:31

Цитата:

Сообщение от trikadin
говорили "А я привык к этой версии, зачем мне обновляться?".

No comment...

c124578 02.11.2011 19:33

Только сел за компъютер. Проверил на опере 9.23 и ослах 7-8: действительно все нормально. Значит устал мой файрфокс, сейчас переставлю.
А 3.6 действительно потому, что попробовал №5 , кажется, не понравились изменения в верхней части, специально переставил на 3.6.
В общем ложная, получается, тревога, нет загадки с ЦСС, просто уже привык, что файрфокс правильней всех себя ведет, сразу написал сюда.

trikadin 02.11.2011 21:32

Цитата:

Сообщение от c124578
попробовал №5 , кажется, не понравились изменения в верхней части

ksa, яркий пример к моим словам)

c124578, эти изменения, во-первых, экономят экранное место, а во-вторых, при наличии мозгов желания, отключаются четырьмя кликами (два клика по верхним панелькам правой клавишей мыши, два раза снять/поставить галочки).

c124578 03.11.2011 22:41

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

trikadin 03.11.2011 23:22

Бли-ин... Правой клавишей мыши по верхней панели, "Настроить". И перетаскивайте эту кнопку куда душе угодно.

Из-за таких как вы, извините, до сих пор приходится писать сотни исправлений для браузера ie6.

Андрей38 15.11.2011 02:57

Привет всем!
Вопрос как через var регулировать скорость анимации?
var hight=45
var score=450
$('#что-нибудь').animate({'hight':hight},'+score+') так не работает, а как должно,кто знает?

Aetae 15.11.2011 11:38

Цитата:

Сообщение от trikadin (Сообщение 134329)
Бли-ин... Правой клавишей мыши по верхней панели, "Настроить". И перетаскивайте эту кнопку куда душе угодно.

Из-за таких как вы, извините, до сих пор приходится писать сотни исправлений для браузера ie6.

Люди не виноваты что такими их сделала природа. Таких большинство.
Виноваты тут разрабы браузера. Имхо, при автоматическом обновлении(а не установке новой версии отдельно), компановка интерфейса сама меняться не должна ни в коем случае. Должно быть соообщение о мегакрутых улучшениях интерфейса и кнопка "попробовать", с возможностью отката. Рядовой юзер не любит перемен.

trikadin 15.11.2011 15:42

Aetae, ну с этим да, согласен. Наверное, я слишком максималистски отношусь к людским недостаткам.

Aetae 15.11.2011 16:16

Я вообще ненавижу людей, но работать с ними и понимать их это мне не мешает.=\

trikadin 15.11.2011 16:20

Цитата:

Сообщение от Aetae
Я вообще ненавижу людей, но работать с ними и понимать их это мне не мешает.=\

"Я вообще довольно равнодушно отношусь к людям - с тех самых пор, как устал их ненавидеть" (с) Макс Фрай


Часовой пояс GMT +3, время: 23:45.