Search code examples
cssfont-facefallback

CSS: using font face only on mac


@font-face is awesome but it displays quiet hideously on PCs. Only on Macs (don't know about linux) does it display naturally. How can I display a special font only for mac users and fallback to a regular font for PC users?

Thanks!


Solution

  • If you don't mind using JavaScript and jQuery, you can detect the OS using the jQuery client plugin and then set the fonts. It seems to be old stuff but it works with jQuery 1.3.2 and I would not be surprised if it works with jQuery 1.6.1.

    <script src="./jquery-1.3.2.js"></script> 
    <script src="./jquery.client.js"></script> 
    <script type="text/javascript"> 
        if($.client.os == 'Mac')
            $('body').css('font-family',"'Looks good in Mac'")
        else if($.client.os == 'Windows')
            $('body').css('font-family',"'Looks good in Windows'")
        else if($.client.os == 'Linux')
            $('body').css('font-family',"'Looks good in Linux'")
    </script> 
    

    You can replace body with any CSS selector, even if it is not supported by the browser, it is likely supported by jQuery.

    jQuery is available from jquery.com

    Full jquery.client.js

    (function() {
    
        var BrowserDetect = {
            init: function () {
                this.browser = this.searchString(this.dataBrowser) || "An unknown browser";
                this.version = this.searchVersion(navigator.userAgent)
                    || this.searchVersion(navigator.appVersion)
                    || "an unknown version";
                this.OS = this.searchString(this.dataOS) || "an unknown OS";
            },
            searchString: function (data) {
                for (var i=0;i<data.length;i++) {
                    var dataString = data[i].string;
                    var dataProp = data[i].prop;
                    this.versionSearchString = data[i].versionSearch || data[i].identity;
                    if (dataString) {
                        if (dataString.indexOf(data[i].subString) != -1)
                            return data[i].identity;
                    }
                    else if (dataProp)
                        return data[i].identity;
                }
            },
            searchVersion: function (dataString) {
                var index = dataString.indexOf(this.versionSearchString);
                if (index == -1) return;
                return parseFloat(dataString.substring(index+this.versionSearchString.length+1));
            },
            dataBrowser: [
                {
                    string: navigator.userAgent,
                    subString: "Chrome",
                    identity: "Chrome"
                },
                {   string: navigator.userAgent,
                    subString: "OmniWeb",
                    versionSearch: "OmniWeb/",
                    identity: "OmniWeb"
                },
                {
                    string: navigator.vendor,
                    subString: "Apple",
                    identity: "Safari",
                    versionSearch: "Version"
                },
                {
                    prop: window.opera,
                    identity: "Opera"
                },
                {
                    string: navigator.vendor,
                    subString: "iCab",
                    identity: "iCab"
                },
                {
                    string: navigator.vendor,
                    subString: "KDE",
                    identity: "Konqueror"
                },
                {
                    string: navigator.userAgent,
                    subString: "Firefox",
                    identity: "Firefox"
                },
                {
                    string: navigator.vendor,
                    subString: "Camino",
                    identity: "Camino"
                },
                {       // for newer Netscapes (6+)
                    string: navigator.userAgent,
                    subString: "Netscape",
                    identity: "Netscape"
                },
                {
                    string: navigator.userAgent,
                    subString: "MSIE",
                    identity: "Explorer",
                    versionSearch: "MSIE"
                },
                {
                    string: navigator.userAgent,
                    subString: "Gecko",
                    identity: "Mozilla",
                    versionSearch: "rv"
                },
                {       // for older Netscapes (4-)
                    string: navigator.userAgent,
                    subString: "Mozilla",
                    identity: "Netscape",
                    versionSearch: "Mozilla"
                }
            ],
            dataOS : [
                {
                    string: navigator.platform,
                    subString: "Win",
                    identity: "Windows"
                },
                {
                    string: navigator.platform,
                    subString: "Mac",
                    identity: "Mac"
                },
                {
                    string: navigator.userAgent,
                    subString: "iPhone",
                    identity: "iPhone/iPod"
                },
                {
                    string: navigator.platform,
                    subString: "Linux",
                    identity: "Linux"
                }
            ]
    
        };
    
        BrowserDetect.init();
    
        window.$.client = { os : BrowserDetect.OS, browser : BrowserDetect.browser };
    
    })();