【问题标题】:How can I display text over toolbar button for a firefox addon?如何在 Firefox 插件的工具栏按钮上显示文本?
【发布时间】:2011-06-09 09:26:33
【问题描述】:

我正在尝试在工具栏按钮的图标上显示一个小文本(新消息计数),例如 Chrome 和 Opera 扩展程序在工具栏图标上带有徽章。文本不应该覆盖整个图标,它应该在底部,这样用户仍然可以看到图标的主要部分并识别它是什么扩展。我该怎么做?

您可以在 Chrome 的这个示例图片上看到我想要的内容:


我尝试在堆栈元素中使用描述、跨度和 div,但我无法让它们都位于底部。 Description 和 div 始终在中心显示文本,而 span 将其显示在图标的右侧,使整个按钮更宽。

<toolbarpalette id="BrowserToolbarPalette">
    <toolbarbutton class="toolbarbutton-1">
        <stack>
            <image></image>
            <description right="0" bottom="0" value="4"></description>
            <!-- <html:div right="0" bottom="0">5</html:div> -->
        </stack>
    </toolbarbutton>
</toolbarpalette>

【问题讨论】:

    标签: firefox firefox-addon xul


    【解决方案1】:

    在一级方程式比赛中等待雨停时,我有一些时间可以浪费,所以我用画布完成了这项工作:

    更新:以前的方法在用户从工具栏中删除图标时存在缺陷,更新后的方法更健壮且代码更少。


    XUL

    <overlay xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" xmlns:html="http://www.w3.org/1999/xhtml">
        <hbox hidden="true">
            <html:canvas id="toolbar_button_canvas" width="24" height="24"></html:canvas>
        </hbox>
        <toolbarpalette id="BrowserToolbarPalette">
            <toolbarbutton id="toolbar_button" class="toolbarbutton-1" />
        </toolbarpalette>
    </overlay>
    


    CSS

    #toolbar_button {
        list-style-image:url("chrome://your_extension/skin/icon_024.png");
    }
    
    toolbar[iconsize="small"] #toolbar_button {
        list-style-image:url("chrome://your_extension/skin/icon_016.png");
    }
    


    JavaScript

    show_status: function(display_text)
    {
        var btn = document.getElementById("toolbar_button");
        var canvas = document.getElementById("toolbar_button_canvas");
        var img_src = window.getComputedStyle(btn).listStyleImage.replace(/^url\("(chrome:\/\/your_extension\/skin\/icon_0\d{2}.png)"\)$/, "$1");   // get image path
        var csize = img_src.replace(/^chrome:\/\/your_extension\/skin\/icon_0(\d{2})\.png$/, "$1"); // get image size
    
        canvas.setAttribute("width", csize);
        canvas.setAttribute("height", csize);
        var ctx = canvas.getContext("2d");
    
        var img = new Image();
        img.onload = function()
        {
            ctx.textBaseline = "top";
            ctx.font = "bold 9px sans-serif";       // has to go before measureText
    
            ctx.clearRect(0, 0, canvas.width, canvas.height);
            ctx.drawImage(img, 0, 0);
    
            if (display_text !== "")
            {
                var w = ctx.measureText(display_text).width;
                var h = 7;                  // 9 = font height
    
                var rp = ((canvas.width - 4) > w) ? 2 : 1;  // right padding = 2, or 1 if text is wider
                var x = canvas.width - w - rp;
                var y = canvas.height - h - 1;          // 1 = bottom padding
    
                ctx.fillStyle = "#f00";             // background color
                ctx.fillRect(x-rp, y-1, w+rp+rp, h+2);
                ctx.fillStyle = "#fff";             // text color
                ctx.fillText(display_text, x, y);
                //ctx.strokeText(display_text, x, y);
            }
            btn.image = canvas.toDataURL("image/png", "");  // set new toolbar image
        };
        img.src = img_src;
    }
    

    【讨论】:

    • 我无法让它工作,它说canvas is null。我调用这个方法的脚本在页尾
    • 在画布上绘制后如何让按钮显示画布?我想我遗漏了一些明显的东西,但是画布在一个隐藏的 hbox 中,所以它不可见。
    • @MatthewGertner 你说得对,我不小心遗漏了一些非常重要的代码部分,我更新了答案,所以请重试。
    • 有时,在加载 FF 时,图像属性的更新失败。它破坏代码的工作:'btn.image = canvas.toDataURL("image/png", "");'。属性已更改,但图标保持旧。对于此修复,您需要在该行之后附加此行:'btn.style.listStyleImage = "url('" + btn.image + "')";' - 它的修复问题。
    • btn.style.listStyleImage 是不够的。完整版:var image = canvas.toDataURL("image/png", ""); btn.image = image; btn.setAttribute('image', image); btn.style.listStyleImage = "url('" + image + "')"; 替换为行btn.image = canvas.toDataURL("image/png", "");
    【解决方案2】:

    我的 html:div 变体

    附:你也可以试试 z-index

    看起来如何http://f3.s.qip.ru/fTUvr2Cj.jpg

    XUL

    <overlay xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" xmlns:html="http://www.w3.org/1999/xhtml">
        <toolbar id="nav-bar">
        <hbox>
        <html:div style="color: #000000;
            font-size: 10px;
            font-weight: bold;
            margin-right: 10px;
            margin-top: 16px;
            position: fixed;
            right: 0;">5</html:div>
        <toolbarbutton  insertafter="search-container" type="menu">
        <menupopup>
        <menuitem   class="menuitem-iconic" label="&count;"></menuitem>
    
        <menuitem   class="menuitem-iconic" label="&size;"></menuitem>
    
        <menuitem  class="menuitem-iconic" label="&time;"></menuitem>
        <menuseparator></menuseparator>
        <menuitem  class="menuitem-iconic" label="&settings;"></menuitem>
        </menupopup>
        </toolbarbutton>
        </hbox>
        </toolbar>
    </overlay>
    

    【讨论】:

    • 在许多方面,这个变体比 Igor 的变体更干净(例如,它自然地处理具有悬停状态的图像)。但是,固定定位是相对于浏览器窗口而言的,如果您的按钮不是最右边或最左边的按钮,则使用起来会更加困难。在我自己的测试中,我发现这个问题可以通过将父hbox设置为style="position:relative;"并将html:div的位置设置为position: absolute;来解决,纯粹主义者可以将html:div替换为hbox(或vbox)或box);它似乎仍然有效。
    • 我还建议在 div 的样式中添加pointer-events: none;。这会导致鼠标交互(光标图像和点击)落入toolbarbutton
    • 对于其他寻找相同的人。这个解决方案确实有效。除了上述评论员指出的要点外,从 Firefox 25 开始还需要完成以下工作:
    • 1.如果父级是hbox,则无法使用自定义工具栏对话框删除按钮。父元素应该是toolbaritem。 2. 如果需要firefox在浏览器重启后显示按钮,父级必须有一个id。我将在 github 上发布后立即链接到我正在使用的代码
    【解决方案3】:

    我刚刚使用了来自 browser-action-jplib

    的库

    它在我的 simple addons

    上运行良好

    如果你使用这个库,你可能会遇到 AMO-review 的一些问题

    可以通过issue

    解决

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-30
      • 2016-01-03
      • 1970-01-01
      • 2013-11-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多