【问题标题】:Detect device and swap the CSS file - jQuery检测设备并交换 CSS 文件 - jQuery
【发布时间】:2011-10-31 13:10:48
【问题描述】:

我的 Web 应用程序针对主要智能手机,我需要根据设备更改 CSS 文件(如果 UI 中有问题需要点击它们),我计划使用以下 jQuery 交换 CSS。只是想知道它是否是最佳实践并且性能良好?

<link rel="stylesheet" href="basic.css" type="text/css" class="cssLink" />
<link rel="stylesheet" href="general.css" type="text/css" />

<script type="text/javascript"> 
    $(document).ready(function() {

        //  css file based on the device
        var controlCss;
        //  get the device agent and conver to lover case
        var deviceAgent = navigator.userAgent.toLowerCase();

        if(deviceAgent.match(/android/i)){
            controlCss = "android.css";
            $(".cssLink").attr("href", controlCss);
        }
        else if(deviceAgent.match(/webso/i)){
            controlCss = "webOS.css";
            $(".cssLink").attr("href", controlCss);
        }
        else if(deviceAgent.match(/iphone/i)){
            controlCss = "iphone.css";
            $(".cssLink").attr("href", controlCss);
        }
        else if(deviceAgent.match(/ipod/i)){
            controlCss = "ipad.css";
            $(".cssLink").attr("href", controlCss);
        }
        else if(deviceAgent.match(/blackberry/i)){
            controlCss = "bb.css";
            $(".cssLink").attr("href", controlCss);
        }
        else {
            controlCss = "basic.css";
            $(".cssLink").attr("href", controlCss);
        }
    }); 
</script>

【问题讨论】:

  • 有什么理由避免使用带有屏幕尺寸规则的 CSS @media 查询?
  • @kojiro,我不反对你,首先我想办法,但后来,我认为 CSS 文件大小会增加,所以想去 diff 文件。
  • 没有什么能阻止你这样做。你应该阅读documentation on media queries
  • 这里的basic.css和general.css是什么?我面临同样的问题,我无法理解这种方法
  • 它只是标记重置文件和普通css文件。

标签: javascript jquery html css smartphone


【解决方案1】:

1.这是最佳实践吗?

取决于您认为的最佳实践,以及您的应用程序和公司的最佳实践。这让我想到的一件事是:你能保证你所有的页面都使用 jQuery 吗?如果是这样,那么我认为这是实现您追求的目标的好方法。另一种方法是在服务器端执行此操作,这将保证最佳性能,但可能还有其他原因您不想这样做(也许您无权访问服务器端代码,或者您想维护大部分前端程序员手中的功能)。

2.性能好不好?

简短的回答是否定的。除了需要 100K+ 的 jQuery 有效负载在页面上注入 CSS 之外。您目前解决问题的方法是等待整个页面(以及所有依赖项)加载,然后再添加样式。这将在页面第一次显示(没有样式)和样式被加载并且一切移动之间创建一个明显的“跳跃”。

加载 CSS 服务器端会消除这种情况,但我认为您仍然可以在 UI 中执行此操作,并将大部分代码库保留在 JavaScript 中,这样更易​​于维护。为此,请在调用 CSS 文件之前删除等待加载文档的位置:

<link rel="stylesheet" href="basic.css" type="text/css" class="cssLink" />
<link rel="stylesheet" href="general.css" type="text/css" />

<script type="text/javascript"> 

     // No need to wait for document to load
     // $(document).ready(function() {

        //  css file based on the device
        var controlCss;
        //  get the device agent and conver to lover case
        var deviceAgent = navigator.userAgent.toLowerCase();

        if(deviceAgent.match(/android/i)){
            controlCss = "android.css";
            $(".cssLink").attr("href", controlCss);
        }

        // etc..

    // }); 
</script>

为了进一步提高性能,您可以使用不依赖 jQuery 的解决方案,而不是

$(".cssLink").attr("href", controlCss);

您可以将#cssLink 添加到样式表&lt;link&gt; 元素并使用DOM 来做同样的事情:

document.getElementById("cssLink").setAttribute("href", controlCss);

这将使您的代码如下所示:

<link rel="stylesheet" href="basic.css" type="text/css" css="cssLink" id="cssLink" />
<link rel="stylesheet" href="general.css" type="text/css" />

<script type="text/javascript"> 

        // .. blah blah .. 

        if(deviceAgent.match(/android/i)){
            controlCss = "android.css";
            // use a solution that does not need jQuery
            document.getElementById("cssLink").setAttribute("href", controlCss);
        }

        // etc..

</script>

这样,您将删除对 j​​Query 的 100K plus 有效负载的依赖,然后才能将样式表应用到页面。

更新:

还可以根据屏幕大小而不是设备应用 CSS 规则。

你看过@media queries吗?

【讨论】:

  • 这是一个很好的回应......谢谢。如果我使用媒体查询,浏览器不会下载页面的所有必需资产,即使它们不是必需的..???例如,如果我有一个页面并在平板电脑上查看它,并且我有一个 tablet.css、desktop.css 链接在页面中(带有媒体查询)并且 desktop.css 引用了 4mb 背景图像,平板设备不会必须下载该图像以防万一它需要它??
  • Hiya @Ads,关于 CSS 媒体查询 - 答案是浏览器将为您所追求的元素隔离一个样式并忽略其他样式,包括 4mb 背景图像,如果您构建您的 CSS 代码正确。话虽如此,您必须注意媒体查询在平板电脑和台式机之间没有区别,仅根据宽度、方向、分辨率等工作,请参阅this link
猜你喜欢
  • 2013-07-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多