Как предотвратить нежелательное мерцание при загрузке 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>

Контейнер скрыт при загрузке, и когда документ готов и вкладки готовы, вы можете показать контейнер.

Другие вопросы по тегам