Расширения Google Chrome - не удается загрузить локальные изображения с помощью CSS
у меня есть простое расширение Chrome, которое использует функцию сценария контента для изменения веб-сайта. Более конкретно,background-image
указанного сайта.
по какой-то причине я не могу использовать локальные изображения, даже если они упакованы в расширение.
body {
background: #000 url('image.jpg') !important;
background-repeat: repeat !important;
}
вот и все, самый простой CSS... но это не сработает. Браузер не загружает изображение.
9 ответов:
URL вашего изображения должен выглядеть как
chrome-extension://<EXTENSION_ID>/image.jpg
вам было бы лучше заменить css через javascript. От docs:
//Code for displaying <extensionDir>/images/myimage.png: var imgURL = chrome.extension.getURL("images/myimage.png"); document.getElementById("someImage").src = imgURL;
главная i18n поддержка это дает возможность ссылаться на ваше расширение в вашем CSS. Я храню свои изображения в папке изображений в расширении, поэтому ссылаюсь на активы в CSS следующим образом:
background-image:url('chrome-extension://__MSG_@@extension_id__/images/main.png');
есть много старых ответов и решений на этот вопрос.
по состоянию на август 2015 года (с использованием Chrome 45 и Манифеста версии 2), текущая "лучшая практика" для привязки к локальным изображениям в пределах Расширения Chrome это следующий подход.
1) Ссылка на актив в вашем CSS с помощью относительный путь в папку images вашего расширения:
.selector { background: url('chrome-extension://__MSG_@@extension_id__/images/file.png'); }
2) добавить отдельный актив к web_accessible_resources раздел вашего расширения манифест.json file:
"web_accessible_resources": [ "images/file.png" ]
Примечание: этот метод подходит для нескольких файлов, но не масштабируется хорошо со многими файлами.
вместо этого, лучше использовать поддержку Chrome для шаблоны в белый список всех файлов в данной директории:
{ "name": "Example Chrome Extension", "version": "0.1", "manifest_version": 2, ... "web_accessible_resources": [ "images/*" ] }
использование этого подхода позволит вам быстро и без особых усилий использовать изображения в файле CSS вашего расширения Chrome с использованием изначально поддерживаемых методов.
одним из вариантов будет преобразование ваше изображение в base64:
а затем поместите данные прямо в ваш css, например:
body { background-image: url(data:image/png;base64,iVB...); }
при этом возможно, это не тот подход, который вы хотели бы использовать при регулярной разработке веб-страницы, Это отличный вариант из-за некоторых ограничений построения расширения Chrome.
мое решение.
С Menifest v2 вам нужно добавить
web_accessible_resources
в файл, а затем использоватьchrome-extension://__MSG_@@extension_id__/images/pattern.png
как url-адрес в вашем css-файле.CSS:
#selector { background: #fff url('chrome-extension://__MSG_@@extension_id__/images/pattern.png'); }
Манифест.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" ] }
p. s. ваш манифест.json может выглядеть иначе, чем этот.
эта CSS-версия-работает только в расширения среды (приложение страницы, всплывающее окно, фон страницы, странице) а также content_scripts CSS файл.
In .меньше файла, я всегда устанавливаю переменную в начале:
@extensionId : ~"__MSG_@@extension_id__";
потом, если вы хотите сослаться на расширение местных ресурсов, таких как изображения, использовать:
.close{ background-image: url("chrome-extension://@{extensionId}/images/close.png"); }
следует отметить, что в web_accessible_resources вы можете использовать подстановочные знаки. Так что вместо
"изображения/картины.png"
можно использовать
"изображения/*"
просто чтобы уточнить, согласно документация, каждый файл в расширении также доступен по абсолютному URL-адресу:
chrome-расширение://
<extensionID>
/<pathToFile>
Примечание
<extensionID>
- Это уникальный идентификатор, который система расширений генерирует для каждого расширения. Вы можете увидеть идентификаторы для всех загруженных расширений, перейдя по URL chrome: / / extensions. Этот<pathToFile>
- это расположение файла в верхней папке расширения; это то же самое, что и относительный URL....
изменение фонового изображения в CSS:
#id
{ фонового изображения: url ("chrome-extension://<extensionID>/<pathToFile>
");}
изменение фонового изображения в CSS через JavaScript:документ.getElementById ('
id
').стиль.фоновое изображение = "url ('chrome-extension://<extensionID>
/<pathToFile>
')");
изменение фонового изображения в CSS через jQuery:$("
#id
").css ("background-image", "url ('chrome-extension://<extensionID>
/<pathToFile>
')");
Если вы хотите протестировать локальное изображение на реальном сайте, вы можете запустить локальный веб-сервер и установить URL-адрес как http://127.0.0.1:8123/img.jpg на странице с помощью DevTools
есть разные способы запуска веб-сервера:
расширение для браузера "Web Server for Chrome" с определенной папкой https://chrome.google.com/webstore/detail/web-server-for-chrome/ofhbbkphhbklhfoeikjpcbhemlocgigb
Если у вас есть затем python запускает embedded http server в выбранной папке
python3-m http.сервер 8123 # python 3 version
python-m SimpleHTTPServer 8123 # python 2 versionиспользовать готовый к производству сервер, как nginx,apache
также я попробовал флаг запуска chrome -- разрешить-файл-доступ-из-файлов но это не было работой для моей версии 52.0.2743.116, и это опасно и небезопасно. Документы, исходящие из любого места, локального или веб-сайта, по умолчанию не должны иметь доступа к локальным файлам:/// ресурсы.