通过Java脚本根据特定字体更改字体大小

时间:2010-11-25 作者:syed

我在水平菜单栏中使用了一种“rtl”字体(命名为JNN),这是正常的&;18px的可读性,Windows上可用的“rtl”字体(如Tahoma和Arial Unicode MS)在18px时太大。由于“字体宽度”的不同,如果我的wordpress网站的访问者的计算机上没有安装JNN字体,菜单栏将以Tahoma/“Arial Unicode MS”字体显示给他,因此这些字体会由于字体大小过大而干扰菜单栏的长度。

是否有通过javascript检查用户端“字体可用性”的解决方案,如果找到,请使用“font-Size-A”,如果没有,请使用“font-Size-B”?

我们将非常感谢您的帮助。

3 个回复
SO网友:Cronco

这并不完全符合您的要求,但您可以通过@font-face css3规则“确保”用户拥有所需的字体。

根据caniuse的说法。大约95%的全球用户可以使用css属性,所以这是一个很好的折衷方案。

但是,不同的浏览器使用不同的字体格式,因此您需要使用http://www.fontsquirrel.com/fontface/generator 生成所需的所有字体。该网站还将为您提供一些有关如何使用字体的额外详细信息。

保罗·爱尔兰(PaulIrish)在这里发表了一篇关于字体以及如何正确使用字体的博文。(转到他的博客并搜索字体)我本来会自己发布链接,但我不能发布多个链接,因为我是新用户。

希望这有帮助!

SO网友:Jan Fabry

此解决方案使用两个样式表:wpse-4508-default.csswpse-4508-small.css. 我们总是加载默认字体,如果某个字体不存在,也会加载小版本。我们将结果保存在cookie中,以便下次不需要在客户端进行测试和额外加载,从而获得更流畅的体验。代码设计为从主题目录运行,因此您可以将PHP代码添加到functions.php. 我加了一些var_dump()alert() 帮助您了解发生了什么。我只在Mac OS X上的Safari中进行了测试。

<?php
add_action( \'wp_head\', \'wpse4508_wp_head\' );
function wpse4508_wp_head()
{
    // Always display our normal stylesheet
    wp_enqueue_style( \'wpse4508_default\', get_stylesheet_directory_uri() . \'/wpse-4508-default.css\' );
    $urlSmallStylesheet = get_stylesheet_directory_uri() . \'/wpse-4508-small.css\';
    if ( ! array_key_exists( \'wpse4508_hasfont\', $_COOKIE ) ) {
        // We don\'t know anything, detect it
        var_dump( \'No cookie info, loading JS\' );
        wp_enqueue_script( \'wpse4508_detector\', get_stylesheet_directory_uri() . \'/wpse-4508-detector.js\', array(), false, true );
        // Send the style sheet URL to the front
        wp_localize_script( \'wpse4508_detector\', \'WPSE4508_Detector\', array( \'url\' => $urlSmallStylesheet ));
    } elseif ( \'false\' == $_COOKIE[\'wpse4508_hasfont\'] ) {
        // We know we should load the small stylesheet
        var_dump( \'Cookie info, no font, extra stylesheet via PHP\' );
        wp_enqueue_style( \'wpse4508_small\', $urlSmallStylesheet );
    }
}

// A simple div to test this code
add_action( \'wp_footer\', \'wpse4508_wp_footer\' );
function wpse4508_wp_footer()
{
    echo \'<div class="wpse4508_test">WPSE 4508 test</div>\';
}
Thewpse-4508-default.css 文件:

.wpse4508_test
{
    background-color: red;
    font-size: 20px;
    width: 100%;
    text-align: center;
    position: absolute;
    top: 0;
}
Thewpse-4508-small.css, 有额外的规则。我不认为!important 是必需的,因为它们是在前一个之后加载的,请自己尝试。

.wpse4508_test
{
    background-color: green !important;
    font-size: 10px !important;
}
检测字体并设置cookie的Javascript文件。

var Detector = function(){
    var h = document.getElementsByTagName("BODY")[0];
    var d = document.createElement("DIV");
    var s = document.createElement("SPAN");
    d.appendChild(s);
    d.style.fontFamily = "sans";            //font for the parent element DIV.
    s.style.fontFamily = "sans";            //serif font used as a comparator.
    s.style.fontSize   = "72px";            //we test using 72px font size, we may use any size. I guess larger the better.
    s.innerHTML        = "mmmmmmmmmmlil";       //we use m or w because these two characters take up the maximum width. And we use a L so that the same matching fonts can get separated
    h.appendChild(d);
    var defaultWidth   = s.offsetWidth;     //now we have the defaultWidth
    var defaultHeight  = s.offsetHeight;    //and the defaultHeight, we compare other fonts with these.
    h.removeChild(d);
    /* test
     * params:
     * font - name of the font you wish to detect
     * return: 
     * f[0] - Input font name.
     * f[1] - Computed width.
     * f[2] - Computed height.
     * f[3] - Detected? (true/false).
     */
    function debug(font) {
        h.appendChild(d);
        var f = [];
        f[0] = s.style.fontFamily = font;   // Name of the font
        f[1] = s.offsetWidth;               // Width
        f[2] = s.offsetHeight;              // Height
        h.removeChild(d);
        font = font.toLowerCase();
        if (font == "serif") {
            f[3] = true;    // to set arial and sans-serif true
        } else {
            f[3] = (f[1] != defaultWidth || f[2] != defaultHeight); // Detected?
        }
        return f;
    }
    function test(font){
        f = debug(font);
        return f[3];
    }
    this.detailedTest = debug;
    this.test = test;   
}

WPSE4508_Detector.loadStylesheetIfNeeded = function() {
    var hasFont = new Detector().test(\'Andalus\');
    alert( \'Testing for font: \' + hasFont );
    document.cookie = \'wpse4508_hasfont=\' + (hasFont ? \'true\' : \'false\'); // Maybe add expiry date?
    if (!hasFont) {
        alert( \'Loading stylesheet via JS\' );
        var elHead = document.getElementsByTagName(\'head\')[0];
        var elLink = document.createElement(\'link\');
        elLink.rel = \'stylesheet\';
        elLink.type = \'text/css\';
        elLink.href = WPSE4508_Detector.url;
        elHead.appendChild(elLink);
    }
}

WPSE4508_Detector.loadStylesheetIfNeeded();

SO网友:hakre

Q: Is there any solution through javascript to check the "font-availibility" at the user\'s end, and if found use "Font-Size-A" and if not then use "Font-Size-B" ?

有。它叫JavaScript/CSS Font Detector 它还可以检查字体的可用性。

在检查是否存在特定的类之后,您可以向HTML元素添加或删除一个类,这些元素提供了预先配置的回退样式。

结束

相关推荐

在没有CSS的情况下从管理菜单中删除不必要的文本

我正在寻找一种方法来删除默认worpdress元数据库中所有不必要的文本。最好我想确保内容不仅通过CSS隐藏,而且实际上从HTML中删除,这样它甚至不会显示在源代码中。我想删除的领域包括:单击右上角的“帮助”按钮并关联DIV/HTML/text时,我想删除与正在使用的主题和wordpress版本相关的文本以及“更改主题”按钮在底部的“页面属性”元框中,有文本“需要帮助?使用屏幕右上角的帮助选项卡”我希望删除此文本,在“摘录元数据库”下有一个文本,我希望删除任何其他文本,您可能也知道如何删除以清理wordp