【问题标题】:How to prevent jQuery onload flicker unobtrusively?如何防止 jQuery onload 不显眼地闪烁?
【发布时间】:2012-06-06 17:23:42
【问题描述】:

我正在使用 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>

【问题讨论】:

    标签: jquery tabs load flicker unobtrusive


    【解决方案1】:
    <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 稍后执行而导致的无样式内容的闪烁)。

    【讨论】:

    • 我不知道。我现在就试试:)
    • +1 确保嵌入它,而不是链接它,因为外部资源将再次导致 FOUC。
    • &lt;script&gt; = &lt;script type='text/javascript'&gt;?
    • type='text/javascript' 不是必需的。请参阅下面的答案以获得更强大的解决方案。
    • type 不是必须的,在所有现代浏览器中都可以省略
    【解决方案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>
    

    【讨论】:

      【解决方案3】:

      你可以这样试试:

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

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

      【讨论】:

        【解决方案4】:

        这就是我所做的。在你的 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 标记上添加其他类。对于未启用 js 的页面,请在样式中使用 no-js 类。

        样式示例:

        #container {
          display:none;
        }
        .no-js #container
        { 
          display: block;
        }
        

        【讨论】:

        • 在head内部还是在html和head之间?
        • 只要它在容器 div 之前就没有关系。但我会把它放在 html 标签之后(在 html 和 head 之间)
        • 感谢大家的回答。这很好用,并且如果需要,还允许 html 标记中的其他类。
        【解决方案5】:

        感谢上述解决加载闪烁的想法。 由于浏览器尝试尽快呈现标记,因此对于一些(巨大的)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>
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-01-30
          • 2014-01-06
          • 1970-01-01
          • 1970-01-01
          • 2010-11-28
          • 2020-05-07
          • 2013-08-04
          相关资源
          最近更新 更多