Как избавиться от уродливого asp: Мерцание меню?
Я использую элемент управления asp:Menu
на странице ASP.NET 4.0 Webforms с режимом рендеринга без таблицы:
<asp:Menu ID="MenuBase" runat="server" DataSourceID="SiteMapDataSourceMenu"
Orientation="Horizontal" CssClass="contentmenu" RenderingMode="List"
IncludeStyleBlock="false">
</asp:Menu>
В меню есть горизонтальная основная строка с 5 или 6 пунктами меню, а некоторые из них открывают вертикальные всплывающие меню, когда пользователь на них нависает.
Часто, когда происходит обратная передача, и страница снова отображается, меню "мерцает" на мгновение (скажем, полсекунды), что означает: все пункты меню, включая элементы во всплывающих меню, отображаются в одном или нескольких строки один за другим, прежде чем они вернутся в нормальное состояние.
В этот короткий момент "развернутого" отображения всех пунктов меню меню выглядит КАК ЕСЛИ Javascript был отключен в браузере. (Кажется, что создание всплывающих меню достигается с помощью некоторого Javascript в элементе управления asp:.)
Это поведение довольно уродливое, особенно с большим меню (рендеринг на короткий промежуток времени более чем на 2 или 3 строки). Весь контент страницы перемещается вниз, прежде чем он вернется к нормальному отображению.
Знаете ли вы какое-либо решение этой проблемы?
Заранее благодарю вас!
(Примечание: я должен упомянуть, что я использовал известный CSS-удобный элемент управления меню из CodePlex до того, как я обновился до ASP.NET 4.0. Я полагал, что мне больше не нужен CSS-удобный элемент управления, поскольку asp: Меню в версии 4 теперь имеет встроенный режим рендеринга списка. Насколько я помню, у меня не было этого мерцания с помощью CSS-friendly элемента управления, и я думаю, что этот элемент управления не использует Javascript. Возможно, это был неудачный шаг. Я смотрю сейчас решение, не возвращаясь к удобному меню управления меню, если это возможно.)
Edit:
Это мерцание не зависит от браузера, хотя наиболее заметно в IE 8 и 7. В IE 7 (или режиме совместимости в IE 8) это необычайно уродливо, так как пункты меню отображаются в сумасшедшем диагональном шаблоне даже в 5 или 6 строках.
Ответы
Ответ 1
Если кому-то все еще нужно решение; мерцание там, потому что вы должны установить правильный стиль отображения в своем css для меню.
Попробуйте, например,
#menu ul li ul
{
display: none;
}
и
#menu ul li
{
position: relative;
float: left;
list-style: none;
}
Мерцание связано с тем, что в меню ASP.NET 4 используется javascript для установки некоторых встроенных стилей.
Ответ 2
Я также поднял эту проблему, когда у меня было много событий на странице между файлом CSS и событием onload, которое предположительно запускает javascript для украшения элементов меню. В частности, в IE8 эта задержка для javascript для исправления стиля была уродливой.
Решения от peter и Clearcloud8 были почти хороши для меня. Я использую это:
div.menu > ul > li
{
display: inline-block;
list-style: none;
}
div.menu ul li ul
{
display: none;
}
Основное различие заключается в том, что я использовал "div.menu > ul > li", который нацелен только на самую верхнюю строку элементов, вместо "div.menu ul li", которая также улучшает подменю - результатом является то, что элементы подменю не были одинаковой ширины, поэтому они упали в зубчатый список.
(Я использую Visual Studio 2010,.Net Framework 4)
Ответ 3
Добавьте эти строки в файл Site.css(в папке "Стили" вашего проекта VS 2010)
/* Fix for extra space above menu in Chrome and Safari */
img[alt='Skip Navigation Links'] {
display: none;
}
Альтернативой является добавление SkipLinkText = "" в каждый пункт меню (не проверял это)
Ответ 4
Я добавил:
.menu ul li ul
{
display: none;
}
.menu ul li
{
position: relative;
/*float: left;*/
list-style: none;
}
Ответ 5
Я пробовал рекомендованное решение, которое...
div.menu ul li ul { display:none }
div.menu ul li { position:relative; float:left; list-style:none }
Ответ 6
Такая же проблема была и со мной. Но решается путем удаления вызовов jquery.:)
или вы можете загрузить и сохранить файл .js script внутри папки script, а не ссылаться на него в Интернете.
Ответ 7
#menu ul li ul
{
display: none;
}
and
#menu ul li
{
position: relative;
float: left;
list-style: none;
}
Это сработало и для меня. У меня не было проблемы, пока я не разместил reCaptcha в форме. Мое меню также создавалось на странице мастера. Большое вам спасибо!
Ответ 8
У меня была та же проблема, что и при использовании ASP.NET 4.5.1, и хотя я пытался использовать теги стиля CSS сверху, я не смог предотвратить мерцание.
Однако, сравнивая исходный HTML-код с более старыми сайтами с новым, было ясно, что тег {display: none} отсутствует.
Я просто помог себе, адаптировав web.config с помощью
<pages controlRenderingCompatibilityVersion="3.5" clientIDMode="AutoID">
Это помогло, так как оно создало тот же исходный HTML-код, что и ранее, хотя это, безусловно, нехорошее обходное решение.
Ответ 9
Вышеупомянутое решение было близко, но не работало для меня. Для исправления описанной проблемы потребовалось небольшое изменение ниже. Когда я создаю новый проект приложений ASP.NET для веб-форм с использованием Visual Studio 2010, CSS, который создается для меню по умолчанию, использует ".menu" (классы CSS) для применения стиля, а не "#menu" (элемент с идентификатором "меню" ).
#menu
- не работает
.menu
- работает
Итак, другими словами, поместите это в свой CSS файл внизу:
.menu ul li ul
{
display: none;
}
.menu ul li
{
position: relative;
float: left;
list-style: none;
}
Ответ 10
Это, по-видимому, сработало (предложения выше), пока я просто не обновил свой jQuery до 2.1.1 с помощью nuget и начал использовать CDN (предложенный YSLow). Но теперь, когда мерцание вернулось, хуже, чем когда-либо. Кто-нибудь проверяет, есть ли лучшее решение? Thanx.
Я также нашел это решение, но не повезло:
(в голове)
<style type="text/css">
div.menu ul li ul { display:none; }
</style>
Ответ 11
Вы копируете ниже код таблицы стилей и вставляете его на сайт site.master, и он отлично работает, а также удаляет код стиля меню.
<style type="text/css">
div.hideSkiplink
{
background-color: #3a4f63;
width: 100%;
}
div.menu ul li ul
{
display: none;
}
div.menu ul
{
float: left;
list-style: none;
}
div.menu li
{
list-style: none;
float:inherit;
}
div.menu
{
padding: 2px 0px 2px 0px;
}
div.menu ul
{
margin: 0px;
padding: 0px;
width: auto;
}
div.menu ul li a, div.menu ul li a:visited
{
background-color: #465c71;
border: 1px #4e667d solid;
color: #dde4ec;
display: block;
line-height: 1.35em;
padding: 4px 20px;
text-decoration: none;
white-space: nowrap;
position: relative;
}
div.menu ul li a:hover
{
background-color: #bfcbd6;
color: #465c71;
text-decoration: none;
}
div.menu ul li a:active
{
background-color: #465c71;
color: #cfdbe6;
text-decoration: none;
}
</style>