Скрыть jQuery Аккордеон при загрузке

Я тестирую сборку сайта с медленным соединением, и я заметил, что JQuery Accordion остается расширенным в течение длительного времени, пока остальная часть сайта не будет загружена, а затем, наконец, обрушится. Не очень красиво. Мне было интересно, как я могу заставить его рухнуть в процессе загрузки и только расширяться при нажатии.

Я работаю с автономной версией 1.6 плагина аккордеона.

Основная структура:

<div class="sidebar">
    <ul id="navigation" class="ui-accordion-container">
        <li><a class="head" href="#">1</a>
            <ul class="sub">
                <li><a href="#">1a</a></li>
                <li><a href="#">2a</a></li>
            </ul> 
         </li>
    </ul>
</div>

и script

jQuery().ready(function(){
    jQuery('#navigation').accordion({ 
        active: 'false', 
        header: '.head', 
        navigation: true,
        animated: 'easeslide',
        collapsible: true
    });     
});

Я попытался скрыть элементы в CSS, чтобы они не появлялись во время загрузки, но все, что было достигнуто, заключается в том, что они всегда скрыты.

Возможно, проблема в CSS У меня есть фоновое изображение в каждом из подменю:

#navigation{
    margin:0px;
    margin-left: 10px;
    padding:0px;
    text-indent:0px;
    font-size: 1.1em;
    width:200px;
    text-transform: uppercase;
    padding-bottom: 30px;
} 
#navigation ul{
    border-width:0px;
    margin:0px;
    padding:0px;
    text-indent:0px;
}
#navigation li{
    list-style:none outside none;
}
#navigation li ul{
    height:185px; overflow:auto;
}
#navigation li ul.sub{
    background:url('../images/sub.jpg') no-repeat;
    dispaly: block;
}
#navigation li li a{
    color:#000000;
    display:block;
    text-indent:20px;
    text-decoration: none;
    padding: 6px 0;
}
#navigation li li a:hover{
    background-color:#FFFF99;
    color:#FF0000;
}

Заранее благодарим за любой совет о том, как сделать эту вещь немного более гладкой, и аккордеон всегда рушится.

-edit - Я забыл упомянуть, что я также надеюсь на решение, которое позволит nav оставаться доступным для тех, у кого нет Javascript.

Ответ 1

Я делаю это первым делом со всеми моими сайтами: сразу после тега body поместите тег script с помощью этого javascript:

jQuery('body').addClass('js');

Это дает вам крючок стиля для любых элементов, которые будут выглядеть по-другому, когда Javascript включен, и это происходит немедленно.

В других ответах есть хорошие решения для остальной части ваших проблем. Вам просто нужны два "базовых" стиля вместо одного:

#navigation ul li { /*open styles for no javascript*/ }
body.js #navigation ul li { /*closed styles for pre dom.ready*/ }

... и затем снова откройте перед применением аккордеона на dom.ready.

EDIT: если вы загружаете jQuery в конце страницы (или не используете jQuery), вы можете использовать эту прямую версию javascript:

<script type="text/javascript">
    var b = document.getElementsByTagName('body')[0];
    b.className+=b.className?' js':'js';
</script>

Ответ 2

Я столкнулся с этой проблемой неделю назад. Я установил контейнер для отображения: none, а затем использовал jQuery, чтобы он отображался в соответствующее время:

$(".accordion").show();
$(".accordion").accordion();

Ответ 3

Код внутри jQuery.ready() не запускается до тех пор, пока DOM не будет готов - так что это нормально для элементов, которые в конечном итоге будут скрыты, чтобы оставаться видимыми некоторое время. Аккордеон настроен таким образом частично для простоты использования и частично ради грамотной деградации: контент не будет отсутствовать (скрыт), если JavaScript отключен.

Если вы готовы рисковать страницей, которая ломается без JavaScript, идите, и ваши элементы будут скрыты. Затем, непосредственно перед .accordion(), show() их.


Здесь идея поддерживать совместимость. Он был минимально проверен и доступен для комментариев.

Оставьте свой CSS один, но добавьте его в начало JavaScript (вне jQuery.ready()):

document.styleSheets[0].addRule(".yourclass", "display:none");

Таким образом, по мере того как страница будет построена, будет создано правило CSS, чтобы скрыть ваши скрытые элементы. Затем внутри jQuery.ready() вызовите $(".yourclass").show(), чтобы вернуть их перед инициализацией аккордеона.

Ответ 4

Сделайте свой .accordion, связанный непосредственно в <script> чуть ниже элементов аккордеона, а не ожидая готовности документа.

Затем они активируются как можно скорее, а не ждут, пока страница не будет готова (что может занять много времени, особенно в IE, что не поддерживает событие DOMContentLoaded, поэтому jQuery должен ждать загрузки, который запускается только после всех изображений и все загружается).

Вы можете установить родительский элемент аккордеона на "видимость: скрытый, а затем восстановить его до", который будет отображаться вручную при инициализации script. Но тогда браузеры с выключенным JavaScript не будут видеть контент вообще, что не идеально.

Ответ 5

будьте осторожны с этим в отношении доступности:

body {
  display: none; 
}

Если по какой-либо причине javascript отключен, то ничего не будет отображаться;)

Ответ 6

Я не использовал UI-аккордеон, но я создал гармоники с jQuery. Единственное, что делает script, - это чередование видимости панелей аккордеона. Поэтому, если одна панель видна при загрузке страницы, возможно, вам следует попробовать использовать правило CSS, например:

ul.sub{
  visiblity:hidden;
  display:none;
}

Ответ 7

Я попытался скрыть элементы в CSS, чтобы они не появлялись во время но все достигнутое в всегда скрывая их.

Почему бы вам не попробовать сделать это скрытым в css, а затем сделать это:

JQuery ( '# навигация'). Шоу(). Accordian...

Ответ 8

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

Простое решение, спрячьте тело до тех пор, пока jQuery не будет готов и не построит элементы, а затем покажет тело.

В моей таблице стилей мастера:

body {
  display: none; 
}

В моем основном файле javascript внизу jQuery.ready():

$(document).ready(function() { 
   $("body").show(); 
}

Ответ 9

Я использую css-решения, подобные тому, что предложил Тим, но это означало бы скрыть контент для людей с отключенным javascript (или устройствами без поддержки javascript). Я предпочитаю решение, предоставленное Джефри, спасибо за обмен.

Ответ 10

Я не использовал UI-аккордеон, но я создал гармоники с jQuery. Единственное, что делает script, - это чередование видимости панелей аккордеона. Поэтому, если одна панель видна при загрузке страницы, возможно, вам следует попробовать использовать правило CSS, например:

ul.sub{
  visiblity:hidden;
  display:none;
}