Как предотвратить нежелательное мерцание при загрузке jQuery?
Я использую вкладки пользовательского интерфейса jQuery. Как я должен предотвратить мерцание загрузки контента, а также убедиться, что контент виден, когда отключен JavaScript?
Я попытался добавить класс.js к телу, когда документ загружен, но поскольку вкладки загружаются одновременно с добавляемым классом, содержимое контента все еще остается.
#container{display:none;}
<div id="container">
<div id="tabs">
<ul>
<li><a href="#tabs-1">Nunc tincidunt</a></li>
<li><a href="#tabs-2">Proin dolor</a></li>
</ul>
<div id="tabs-1">
<p>Tab 1</p>
</div>
<div id="tabs-2">
<p>Tab 2</p>
</div>
</div>
</div>
<script>
$(document).ready(function(){
$('#tabs').tabs();
$('#container').show();
});
</script>
5 ответов
Вот что я делаю. поставить класс no-js
на ваш HTML-тег, а затем поместите следующий код сразу после HTML-тега:
<script>
// Sets 'js' on html element and removes 'no-js' if present (here to prevent flashing)
(function(){
document.documentElement.className = document.documentElement.className.replace(/(^|\s)no-js(\s|$)/, '$1$2') + (' js ');
})();
</script>
Этот метод позволяет вам иметь другие классы на вашем html
тег, если требуется. Использовать no-js
Класс в ваших стилях для страниц, у которых не включен JS.
пример стилей:
#container {
display:none;
}
.no-js #container
{
display: block;
}
<html class="nojs">
...
<head>
<script>
document.documentElement.className = "js";
</script>
</head>
...
<style>
#container {display:none;}
.nojs #container { display: block;}
</style>
это сделает ваш контент видимым, даже если js недоступен на вашем устройстве. Этот подход почти такой же, как и в H5BP + Modernizr, и, помимо этого, он предотвратит JS FOUC (флэш-память нестандартного содержимого из-за более позднего выполнения).
Вы можете сделать это так:
<div id="container">
<div id="tabs">
<script>$('#tabs').addClass('js');</script><!-- added this line -->
<ul>
<li><a href="#tabs-1">Nunc tincidunt</a></li>
<li><a href="#tabs-2">Proin dolor</a></li>
</ul>
<div id="tabs-1">
<p>Tab 1</p>
</div>
<div id="tabs-2">
<p>Tab 2</p>
</div>
</div>
</div>
<script>
$(document).ready(function(){
$('#tabs').tabs().show(); // changed this line
$('#container').show();
});
</script>
Спасибо за вышеупомянутые идеи, чтобы решить мерцание под нагрузкой. Поскольку браузеры пытаются визуализировать разметку как можно быстрее, этого следует избегать для некоторых (огромных) элементов содержимого jquery-ui, таких как вкладки jquery-ui.
Это решение работает для меня:
<html>
...
<head>
...
<script>
$(document).ready(function() {
$("#tabs_container").tabs();
// force *initialized* #tab_container to be displayed
$("#tabs_container").show();
});
</script>
</head>
...
<body>
...
<!-- avoid unstyled tabs to be displayed using "display: none" at markup -->
<div id="tabs_container" style="display: none;">
<!-- (huge) tabs content -->
</div>
...
</body>
</html>
Вы можете попробовать это так:
<script>
$("#container").hide();
$(document).ready(function(){
$('#tabs').tabs();
$('#container').show();
});
</script>
Контейнер скрыт при загрузке, и когда документ готов и вкладки готовы, вы можете показать контейнер.