Google Chrome扩展程序-无法使用CSS加载本地图像


98

我有一个简单的Chrome扩展程序,该扩展程序使用内容脚本功能来修改网站。更具体地说,background-image所述网站。

由于某些原因,即使扩展中打包了本地图像,我似乎也无法使用它。

body {
    background: #000 url('image.jpg') !important;
    background-repeat: repeat !important;
}

就是这样,最简单的CSS ...但是它不起作用。浏览器不会加载图像。


2
为什么扩展名会认为url('image.jpg')是本地的?您不需要完整的路径吗?
Traingamer 2010年

Answers:


70

您的图片网址应类似于 chrome-extension://<EXTENSION_ID>/image.jpg

您最好通过JavaScript替换CSS。从文档

//Code for displaying <extensionDir>/images/myimage.png:
var imgURL = chrome.extension.getURL("images/myimage.png");
document.getElementById("someImage").src = imgURL;

7
@Salem因为否则您将需要在CSS中对扩展ID进行硬编码。
塞格2011年

别傻了,但是为什么这是个问题?
塞勒姆

4
@Salem将其作为未打包的扩展ID进行开发并上传到具有不同ID的图库会很不方便。这不是世界末日,只是不便和某种不良习惯,例如在代码中对绝对文件路径进行硬编码。
塞格2011年

嗯,很有道理。我很感激。
塞勒姆

由于这是公认的答案,因此您应该在另一个答案中看到注释,其中ariera提到了在清单文件中包含web_accessible_resources以访问本地字体和图像。
Aryan Firouzian

253

Chrome具有i18n支持 ,可在CSS中引用您的扩展程序。我将图片保存在扩展程序的图片文件夹中,因此请在CSS中引用资源,如下所示:

background-image:url('chrome-extension://__MSG_@@extension_id__/images/main.png');

4
太好了 这是一个很棒的解决方案,并且确实适用于未打包的扩展和打包的扩展-感谢您分享了一个非常好的技巧。
理查德·霍利斯

40
谢谢,这正是我想要的。只是一个脚注:请记住,您需要在清单文件中将资产声明为web_accessible_resources(如此处所述:code.google.com/chrome/extensions/…)。否则,将不会加载它们
2012年

2
我意识到的一件事!永远不要认为接受的答案是该问题的唯一正确解决方案!当我看到被接受的答案时,我担心我必须做硬编码,但是看到你的答案后,我告诉自己这个人救了我的命!;-)
拉菲克·穆罕默德

这几乎总是更好的方法。纯CSS与@serg答案中的Javascirpt和CSS耦合在一起。我认为这应该是公认的答案。
杰里米·泽尔

@ ariera的链接现在是在这里:developer.chrome.com/extensions/manifest/...

41

这个问题有很多较旧的答案和解决方案。

从2015年8月开始(使用Chrome 45和Manifest版本2),当前的“最佳做法” 是通过以下方法链接到Chrome扩展程序中的本地图片。

1)使用扩展程序的images文件夹的相对路径链接到CSS中的资产:

.selector {
    background: url('chrome-extension://__MSG_@@extension_id__/images/file.png');
}

2)将单个资产添加到扩展程序的manifest.json文件的web_accessible_resources部分:

"web_accessible_resources": [
  "images/file.png"
]

注意:此方法适用于少量文件,但不适用于许多文件。

相反,一种更好的方法是利用Chrome对匹配模式的支持,将给定目录中的所有文件列入白名单:

{
    "name": "Example Chrome Extension",
    "version": "0.1",
    "manifest_version": 2,
    ...    
    "web_accessible_resources": [
      "images/*"
    ]
}

使用此方法,您可以使用本机支持的方法快速轻松地使用Chrome扩展程序CSS文件中的图像。



20

我的解决方案。

使用Menifest v2,您需要添加web_accessible_resources到文件中,然后chrome-extension://__MSG_@@extension_id__/images/pattern.png用作CSS文件中的url。

CSS:

 #selector {
      background: #fff url('chrome-extension://__MSG_@@extension_id__/images/pattern.png'); 
 }

Manifest.json

{
  "manifest_version": 2,

  "name": "My Extension Name",
  "description": "My Description",
  "version": "1.0",

  "content_scripts": [
      {
        "matches": ["https://mydomain.com/*"],
        "css": ["style.css"]
      }
    ],

  "permissions": [
    "https://mydomain.com/"
  ],
  "browser_action": {
      "default_icon": {                    
            "19": "images/icon19.png",           
            "38": "images/icon38.png"          
       },
       "default_title": "My Extension Name"  
   },
   "web_accessible_resources": [
       "images/pattern.png"
     ]
}

ps您的manifest.json可能与此不同。


8

仅限于CSS版本可在扩展环境(应用页面,弹出页面,背景页面,选项页面)以及content_scripts CSS文件中使用。

在.less文件中,我总是在开头设置一个变量:

@extensionId : ~"__MSG_@@extension_id__";

然后,如果您想引用扩展本地资源(如图像),请使用:

.close{
    background-image: url("chrome-extension://@{extensionId}/images/close.png");
}

7

要提及的一件事是,您可以在web_accessible_resources中使用通配符。所以代替

“ images / pattern.png”

您可以使用

“图片/*”


4

根据文档说明,扩展名中的每个文件都可以通过绝对URL进行访问,如下所示:

chrome-extension:// <extensionID>/<pathToFile>

请注意,<extensionID>是扩展系统为每个扩展生成的唯一标识符。您可以转到URL chrome:// extensions来查看所有已加载扩展的ID 。该<pathToFile>是扩展的顶层文件夹下的文件的位置; 与相对网址相同。

...

在CSS中更改背景图片:

#id{background-image:url(“ chrome-extension://<extensionID>/<pathToFile>”); }


通过JavaScript更改CSS中的背景图片:

document.getElementById(' id').style.backgroundImage =“ url('chrome-extension:// <extensionID>/ <pathToFile>')”);


通过jQuery在CSS中更改背景图片:

$(“ #id”).css(“ background-image”,“ url('chrome-extension:// <extensionID>/ <pathToFile>')”);

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.