Rozszerzenia Google Chrome - nie można załadować obrazów lokalnych za pomocą CSS


99

Mam proste rozszerzenie do przeglądarki Chrome, które używa funkcji skryptu zawartości do modyfikowania witryny internetowej. Dokładniej rzecz biorąc, background-imagewspomniana witryna.

Z jakiegoś powodu nie mogę używać lokalnych obrazów, mimo że są one spakowane w rozszerzeniu.

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

To wszystko, najprostszy CSS ... ale to nie zadziała. Przeglądarka nie ładuje obrazu.


2
Dlaczego rozszerzenie miałoby myśleć, że adres URL („image.jpg”) jest lokalny? Czy nie potrzebowałbyś pełnej ścieżki?
Traingamer

Odpowiedzi:


70

Adres URL Twojego obrazu powinien wyglądać tak chrome-extension://<EXTENSION_ID>/image.jpg

Lepiej byłoby zastąpić css przez javascript. Z dokumentów :

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

7
@Salem Ponieważ w przeciwnym razie musiałbyś zakodować swój identyfikator rozszerzenia w css.
serg

Nie być głupim, ale dlaczego jest to problem?
Salem

4
@Salem Byłoby niewygodne opracowanie jako rozpakowanego identyfikatora rozszerzenia i przesłanie do galerii, które ma różne identyfikatory. To nie koniec świata, tylko niedogodności i rodzaj złej praktyki, tak jak na przykład zakodowanie bezwzględnych ścieżek plików w kodzie.
serg

Ach, ma sens. Doceniam to.
Salem

Ponieważ jest to zaakceptowana odpowiedź, powinieneś zobaczyć komentarz do drugiej odpowiedzi, w której ariera wspomniała o włączeniu web_accessible_resources do pliku manifestu, aby uzyskać dostęp do lokalnych czcionek i obrazów.
Aryan Firouzian

254

Chrome obsługuje i18n, co zapewnia możliwość odniesienia się do rozszerzenia w CSS. Trzymam obrazy w folderze obrazów w rozszerzeniu, więc odwołuję się do zasobów w CSS w następujący sposób:

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

4
Świetny. To świetne rozwiązanie i rzeczywiście działa zarówno w przypadku nieopakowanych, jak i spakowanych rozszerzeń - dzięki za podzielenie się naprawdę świetną wskazówką.
Richard Hollis

41
Dzięki, właśnie tego szukałem. Tylko przypis: pamiętaj, że musisz zadeklarować swoje zasoby jako web_accessible_resources w swoim pliku manifestu (jak wyjaśniono tutaj: code.google.com/chrome/extensions/… ). W przeciwnym razie nie zostaną załadowane
ariera

2
Zrozumiałem jedną rzecz! Nigdy nie myśl, że zaakceptowana odpowiedź jest jedynym poprawnym rozwiązaniem tego pytania! Bałem się, że muszę zrobić kod twardy, kiedy zobaczyłem zaakceptowaną odpowiedź, ale po zobaczeniu twojej odpowiedzi powiedziałem sobie, że ten facet uratował mi dzień !! ;-)
Rafique Mohammed

To prawie zawsze lepszy sposób na zrobienie tego. Czysty CSS a łączenie Javascirpt i CSS razem w odpowiedzi @serg. Moim zdaniem powinna to być akceptowana odpowiedź.
Jeremy Zerr

Link do @ ariera jest teraz tutaj: developer.chrome.com/extensions/manifest/…
Ben

42

Istnieje wiele starszych odpowiedzi i rozwiązań na to pytanie.

Od sierpnia 2015 r. (Przy użyciu przeglądarki Chrome 45 i Manifest w wersji 2) aktualne „sprawdzone metody” tworzenia linków do obrazów lokalnych w rozszerzeniach Chrome metoda jest następująca.

1) Połącz z zasobem w CSS, używając względnej ścieżki do folderu z obrazami rozszerzenia:

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

2) Dodaj pojedynczy zasób do sekcji web_accessible_resources w pliku manifest.json rozszerzenia:

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

Uwaga: ta metoda jest odpowiednia dla kilku plików, ale nie skaluje się dobrze w przypadku wielu plików.

Zamiast tego lepszą metodą jest wykorzystanie obsługi wzorców dopasowania przez Chrome do białej listy wszystkich plików w danym katalogu:

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

Skorzystanie z tego podejścia pozwoli Ci szybko i bez wysiłku używać obrazów w pliku CSS rozszerzenia Chrome przy użyciu natywnie obsługiwanych metod.


22

Jedną z opcji byłaby konwersja obrazu na base64:

a następnie umieść dane bezpośrednio w swoim CSS, na przykład:

body { background-image: url(data:image/png;base64,iVB...); }

Chociaż może nie być to podejście, którego chciałbyś używać podczas regularnego tworzenia strony internetowej , jest to świetna opcja ze względu na niektóre ograniczenia związane z budowaniem rozszerzenia Chrome.


1
Wolę tę opcję. Nie zgadzam się, że Google ma rację, sugerując wstrzykiwanie wszystkich obrazów za pomocą wspomnianego powyżej podejścia. Podejście base64 jest również szybsze. +1 !!!
Skone

20

Moje rozwiązanie.

W Menifest v2 musisz dodać web_accessible_resourcesdo pliku, a następnie użyćchrome-extension://__MSG_@@extension_id__/images/pattern.png jako URL w pliku css.

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 Twój plik manifest.json może wyglądać inaczej niż ten.


9

Ta wersja CSS działa tylko w środowisku rozszerzenia (strona aplikacji, strona podręczna, strona w tle, strona opcji), a także pliku CSS content_scripts.

W pliku .less zawsze ustawiam zmienną na początku:

@extensionId : ~"__MSG_@@extension_id__";

Później, jeśli chcesz odnieść się do obrazów rozszerzenia-lokalnego-zasobu, użyj:

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

7

Należy wspomnieć, że w zasobach web_accessible_resources można używać symboli wieloznacznych. Więc zamiast

„images / pattern.png”

Możesz użyć

"zdjęcia/*"


4

Dla wyjaśnienia, zgodnie z dokumentacją , każdy plik w rozszerzeniu jest również dostępny pod bezwzględnym adresem URL, takim jak ten:

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

Zwróć uwagę, że <extensionID>jest to unikalny identyfikator, który system rozszerzeń generuje dla każdego rozszerzenia. Aby zobaczyć identyfikatory wszystkich wczytanych rozszerzeń, przejdź do adresu URL chrome: // extensions . Plik<pathToFile> jest lokalizacja pliku w głównym folderze rozszerzenia; jest taki sam jak względny adres URL.

...

Zmiana obrazu tła w CSS:

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


Zmiana obrazu tła w CSS poprzez JavaScript:

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


Zmiana obrazu tła w CSS poprzez jQuery:

$ (" #id") .css ("obraz-tła", "url ('rozszerzenie-chrome: // <extensionID>/ <pathToFile>')");

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.