浏览器样式

您的扩展程序可以包含用户界面元素——浏览器和页面操作 弹出窗口侧边栏选项页——这些元素通过以下方式定义:

  1. 创建一个 HTML 文件来定义 UI 元素 的结构。
  2. 添加一个 manifest.json 键(actionbrowser_actionpage_actionsidebar_actionoptions_ui)指向该 HTML 文件。

您可以为这些元素设置样式,使其与浏览器的样式相匹配。manifest.json 键包含一个可选属性来帮助实现这一点:browser_style。如果包含此属性并将其设置为 true,您的文档将获得一个或多个额外的样式表,这些样式表有助于使其外观与浏览器 UI 和使用 browser_style 属性的其他扩展程序保持一致。

注意: Manifest V3 中对 browser_style 的支持已弃用。从 Firefox 115 开始,options_ui.browser_stylesidebar_action.browser_style 的默认值从 true 更改为 false。在 Firefox 118 中,Manifest V3 扩展程序将不再支持 "browser_style": true。如果您的 Manifest V3 扩展程序依赖于 "browser_style": true 样式,请遵循 browser_style 的 Manifest V3 迁移指南。有关更多信息,请参阅(Firefox bug 1827910)。如果您想将 Firefox 样式应用于您的扩展程序,请参阅 Firefox 样式指南

在考虑是否使用 browser_style: true 时,请测试您的扩展程序在各种主题(内置或来自 AMO)下的表现,以确保扩展程序的 UI 行为符合您的预期。

警告: 当您的 Web 扩展程序的 manifest 中包含 browser_style: true 时,除输入控件外,您的扩展程序 UI 中的文本选择将被禁用。如果这引起了问题,请改用 browser_style:false

注意: 在 Manifest V2 中,Google ChromeOpera 使用 chrome_style 而不是 browser_style。因此,对于跨浏览器扩展,您需要同时添加这两个键。chrome_style 在 Manifest V3 中不可用。

在 Firefox 中,样式表可以在 chrome://browser/content/extension.css 中找到。macOS 上的额外样式表 chrome://browser/content/extension-mac.css 也被包含在内。

大多数样式会自动应用,但有些元素需要您添加非标准的 browser-style 类才能获得其样式,如下表所示。

Element 示例
<button>
html
<button class="browser-style">Click me</button>

<select>

html
<select class="browser-style" name="select">
  <option value="value1">Value 1</option>
  <option value="value2" selected>Value 2</option>
  <option value="value3">Value 3</option>
</select>
<textarea>
html
<textarea class="browser-style">Write here</textarea>
<input> 的父级
html
<div class="browser-style">
  <input type="radio" id="op1" name="choices" value="op1"/>
  <label for="op1">Option 1</label>

<input type="radio" id="op2" name="choices" value="op2"/> <label for="op2">Option 2</label> </div>

Manifest V3 迁移

由于 browser_style 在 Manifest V3 中已弃用,您在迁移 Manifest V2 扩展程序时可能希望移除对它的支持。以 options_ui 为例,您可以按照以下步骤移除对 browser_style 的支持:

  • options_ui/browser_style 设置为 false
  • 您的扩展程序 UI 的外观是否发生变化?
    • 如果外观没有改变,则移除该键。
    • 如果外观发生变化,请尝试确定存在哪些依赖关系,并在扩展程序的样式表中添加相关的属性。最有可能引起布局更改的样式是 box-sizing:border-boxdisplay: flex。如果您无法确定依赖关系,请在扩展程序中包含 extension.css 的内容,并删除所有不相关的部分,通常是 bodybody * 块,因为大多数扩展程序不使用 browser-style 类。

Firefox 面板组件(旧版)

注意: 此功能是非标准的,并且仅在 Firefox 中有效。

chrome://browser/content/extension.css 样式表也包含旧版 Firefox 面板组件(导航组件)的样式。

Firefox 旧版样式指南》文档说明了正确用法。

Element 示例
页眉
html
<header class="panel-section panel-section-header">
  <div class="icon-section-header"><img src="image.svg"/></div>
  <div class="text-section-header">Header</div>
</header>
页脚
html
<footer class="panel-section panel-section-footer">
  <button class="panel-section-footer-button">Cancel</button>
  <div class="panel-section-footer-separator"></div>
  <button class="panel-section-footer-button default">Confirm</button>
</footer>
标签页
html
<div class="panel-section panel-section-tabs">
  <button class="panel-section-tabs-button selected">Tab</button>
  <div class="panel-section-tabs-separator"></div>
  <button class="panel-section-tabs-button">Tab</button>
  <div class="panel-section-tabs-separator"></div>
  <button class="panel-section-tabs-button">Tab</button>
</div>
表单
html
<div class="panel-section panel-section-formElements">
  <div class="panel-formElements-item">
    <label for="name01">Label:</label>
    <input type="text" value="Name" id="name01" />
  </div>
  <div class="panel-formElements-item">
    <label for="picker01">Label:</label>
    <select id="picker01">
      <option value="value1" selected="true">Dropdown</option>
      <option value="value2">List Item</option>
      <option value="value3">List Item</option>
    </select>
  </div>
  <div class="panel-formElements-item">
    <label for="placeholder01">Label:</label>
    <input type="text" placeholder="Placeholder" id="placeholder01" />
    <button name="expander" class="expander"></button>
  </div>
</div>
Menu
html
<div class="panel-section panel-section-list">
  <div class="panel-list-item">
    <div class="icon"></div>
    <div class="text">List Item</div>
    <div class="text-shortcut">Ctrl-L</div>
  </div>

<div class="panel-list-item"> <div class="icon"></div> <div class="text">List Item</div> <div class="text-shortcut"></div> </div>

<div class="panel-section-separator"></div>

<div class="panel-list-item disabled"> <div class="icon"></div> <div class="text">Disabled List Item</div> <div class="text-shortcut"></div> </div>

<div class="panel-section-separator"></div>

<div class="panel-list-item"> <div class="icon"></div> <div class="text">List Item</div> <div class="text-shortcut"></div> </div>

<div class="panel-list-item"> <div class="icon"></div> <div class="text">List Item</div> <div class="text-shortcut"></div> </div> </div>

示例

HTML

html
<header class="panel-section panel-section-header">
  <div class="icon-section-header"><!-- An image goes here. --></div>
  <div class="text-section-header">Header</div>
</header>

<div class="panel-section panel-section-list">
  <div class="panel-list-item">
    <div class="icon"></div>
    <div class="text">List Item</div>
    <div class="text-shortcut">Ctrl-L</div>
  </div>

  <div class="panel-list-item">
    <div class="icon"></div>
    <div class="text">List Item</div>
    <div class="text-shortcut"></div>
  </div>

  <div class="panel-section-separator"></div>

  <div class="panel-list-item disabled">
    <div class="icon"></div>
    <div class="text">Disabled List Item</div>
    <div class="text-shortcut"></div>
  </div>

  <div class="panel-section-separator"></div>

  <div class="panel-list-item">
    <div class="icon"></div>
    <div class="text">List Item</div>
    <div class="text-shortcut"></div>
  </div>

  <div class="panel-list-item">
    <div class="icon"></div>
    <div class="text">List Item</div>
    <div class="text-shortcut"></div>
  </div>
</div>

<footer class="panel-section panel-section-footer">
  <button class="panel-section-footer-button">Cancel</button>
  <div class="panel-section-footer-separator"></div>
  <button class="panel-section-footer-button default">Confirm</button>
</footer>

结果

浏览器兼容性

webextensions.manifest.action

webextensions.manifest.browser_action

webextensions.manifest.page_action

webextensions.manifest.sidebar_action

webextensions.manifest.options_ui