Opera очень странным образом обрабатывает метод jQuery animate
Вопрос
У меня есть выпадающее меню.Его высота анимируется с помощью jQuery от 5 до 130 пикселей и наоборот.
Меню работало нормально, в то время как это был отдельный элемент (когда я его разрабатывал), но когда другие элементы появились, опера удивляла:
альтернативный текст http://img12.imageshack.us/img12/9366/menusy.png
Я отметил первое состояние как 1, а второе как 2.Третье состояние должно быть таким же, как первое, но, как вы можете видеть, у него есть «хвост».
УПД:исходный код
HTML:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<script type="text/javascript" src="js/jquery.js">
</script>
<script type="text/javascript" src="js/script.js">
</script>
<script type="text/javascript">
$(function(){
init();
});
</script>
<link rel="stylesheet" href="css/styles.css"/>
</head>
<body>
<div id="side" class="side_outer">
<div class="cn tr"> </div>
<div class="cn tl"> </div>
<div class="auth">
<span class="auth_entr">Click me</span>
<div class="auth_fields">
</div>
<div id="auth_separator"> </div>
</div>
<div class="side_inner">
<div class="cn tr"> </div>
<div class="cn tl"> </div>
<div class="side_content">
Some content
</div>
<div class="cn br"> </div>
<div class="cn bl"> </div>
</div>
<div class="cn br"> </div>
<div class="cn bl"> </div>
</div>
<div id="header"> Header</div>
<div id="central"> Center</div>
</body>
</html>
CSS:
#header {
background: red;
height: 100px;
margin: 30px 330px 20px 20px;
}
#central {
background: green;
height: 150px;
margin: 20px 330px 20px 20px;
}
#side {
margin-right: 3%;
margin-left: 10px;
margin-top: 30px;
min-width: 200px;
float: right;
}
.side_outer {
padding: 0 10px;
background: #f2f2cc;
width: 22%;
border-bottom-style: dashed;
border-bottom-width: 2px;
border-bottom-color: black;
}
.side_inner {
position:relative;
overflow:hidden;
padding: 0 10px;
background: #accbfa;
}
.side_outer .cn {
position: relative;
width: 20px;
height: 20px;
}
.side_outer .cn.tr, .side_outer .cn.br {
float: right;
left: 10px;
}
.side_outer .cn.tl, .side_outer .cn.bl {
left: -10px;
}
.auth {
overflow: hidden;
}
.auth_entr {
position: relative;
top: 5px;
margin-left: 17px;
padding: 0 5px;
color: #1e5ebe;
cursor: pointer;
}
.auth_fields {
overflow: hidden;
height: 5px;
margin-top: 5px;
}
#auth_separator {
height: 6px;
font-size: 2px;
}
.side_content {
height: 100px;
padding: 5px 15px;
}
яваскрипт:
var auth_state = 1;
function init () {
$('span.auth_entr').click (function (){
auth_state = (auth_state + 1) % 2;
if (auth_state == 1) {
$('div.auth_fields').animate({height: '5px'}, 1000);
} else {
$('div.auth_fields').animate({height: '132px'}, 1000);
}
});
}
На самом деле я решил проблему с помощью уличной магии (я добавил толстую белую рамку внизу меню, и теперь «сказка» прозрачна).Но мне интересно, в чем проблема и есть ли нормальное решение?
P.S.Другие элементы на самом деле представляют собой пустые элементы div с фиксированными размерами и фоном.Моя версия Opera — 9.5 (знаю, что она старая, но среди моей аудитории она все еще популярна).
П.П.С.Я только что протестировал его в Opera 9.6, и произошла та же ошибка.
Решение
Я протестировал ваш код в IE 7, 8 и FF3, и он работает нормально.Однако, как вы уже отметили, при запуске анимации в Opera действительно есть ошибка.Я тестировал его в Opera 9.64 и получил те же результаты, что и вы.
Я искал в Google и на форумах Opera и не смог найти упоминаний об этой конкретной ошибке.Самое близкое, что я смог найти, было вот это: jquery-гладкая прокрутка-ошибки.
Возможно, вам придется создать заявку, чтобы сообщить об этой ошибке в Opera.
Другие советы
Вы можете поставить пустой div после <div class="cn bl">
, и установите его высоту, скажем, 50 пикселей (или любое другое достаточное значение), а нижнее поле — на то же, но отрицательное значение (то есть -50 пикселей).