6

我正在使用 jQuery UI 选项卡。我应该如何防止加载内容的闪烁,同时确保在禁用 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>
4

5 回答 5

5
<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(由于 js 稍后执行而导致的未样式化内容的闪烁)。

于 2012-06-01T13:02:21.517 回答
5

这就是我所做的。在您的 html 标记上放置一个类,no-js然后将以下代码放在 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;
}
于 2012-06-01T13:07:35.773 回答
2

你可以这样做:

<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>
于 2012-06-01T13:03:30.847 回答
1

感谢上述解决负载闪烁的想法。由于浏览器试图尽快呈现标记,因此对于一些(巨大的)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>
于 2015-09-23T08:03:59.890 回答
0

你可以这样尝试:

<script>
$("#container").hide();
$(document).ready(function(){
  $('#tabs').tabs();
  $('#container').show();
});
</script>

容器在加载时是隐藏的,当文档准备好并且选项卡完成时,您可以显示容器。

于 2012-06-01T13:07:11.890 回答