Обновление: я оставил следующий код javascript, чтобы показать, как проблема развивалась с течением времени, но теперь оказалось, что это НЕ актуально, поскольку javascript не является проблемой. Пожалуйста, взгляните на код html/css ниже.
Для обзорной страницы с большим меню я реализовал следующую функцию (большую часть которого я украл отсюда):
function isScrolledIntoView(elem)
{
var docViewTop = $(window).scrollTop();
var docViewBottom = docViewTop + $(window).height();
var elemTop = $(elem).offset().top;
var elemBottom = elemTop + $(elem).height();
alert(elemBottom);
return ((elemBottom >= docViewTop) && (elemTop <= docViewBottom));
}
$(document).ready(function(){
var overview = $('#overview');
var active = $('#active-item');
if (!isScrolledIntoView(active))
{
$('#overview li.active-parent').each(function(index, value){
if (!isScrolledIntoView(active)) overview.scrollTo(value);
});
}
if (!isScrolledIntoView(active)) overview.scrollTo(active);
});
Идея состоит в том, что после загрузки каждой страницы меню, содержащее его, прокручивается до позиции, где виден текущий активный элемент. Предпочтительно, прокручивая до его первого родителя (элементы меню находятся в дереве), в противном случае до самого элемента.
Теперь это прекрасно работает в Firefox и Chrome (и никто из разработчиков Apple не жаловался мне), но Opera делает действительно странную вещь: прокручивается вниз до нужного элемента, затем очень короткая пауза перед прокруткой до конца снова
У кого-нибудь есть идеи
- Что происходит, и
- Как я могу это остановить?
Спасибо,
Обновление: я тестирую версию 10.63 на Linux (Fedora)
Обновление: похоже, я искал совершенно не в том направлении. Проблема связана с CSS и может быть воспроизведена с помощью следующего кода:
<html>
<head>
<title>Opera scroll test</title>
<style>
.main:after
{
content: 'abc';
}
:focus
{
padding: 0px;
}
#overview
{
display: block;
float: left;
width: 219px;
height: 500px;
overflow: auto;
}
</style>
</head>
<body>
<div id="main" class="main">
<div id="overview">
<ul>
<?
for($i = 1; $i < 100; $i++)
echo '<li>'.$i.'</li>';
?>
</ul>
</div>
<div>
<p>123</p>
</div>
</div>
</body>
</html>
Теперь, если вы прокрутите панель навигации вниз и переместите указатель мыши вправо (над панелью содержимого), прокрутка панели навигации будет сброшена.
Извините, что потратил время на охоту за javascript :(
Если есть гуру css, которые знают, как это исправить, или кто может просто объяснить, что происходит, я был бы очень признателен.
Обновление: протестировал приведенный выше код в Windows на Opera 10.63. Такое же странное поведение происходит.
Обновление: сообщил об этом в Opera как об ошибке. Интересно, что будет...