Wenn wir keinen benutzerdefinierten CSS-Selektor für jede einzelne Website erstellen, für die wir dies tun wollen, kann CSS nicht den `href` von Links extrahieren und ihn verwenden, um ein Favicon neben dem Link zu platzieren. Aber wenn wir ein kleines bisschen JavaScript einbeziehen, können wir es schaffen.
Die „Ich wünschte“-Nur-CSS-Technik
Was schön wäre, ist, wenn Sie einfachen semantischen HTML wie diesen hätten
<a href="https://github.com">GitHub</a>
Und dann könnten Sie alles abrufen, was Sie benötigen, um ein Hintergrundbild des Favicons mit einem Dienst wie getFavicon einzufügen.
/* Fair warning, this doesn't work */
a[href^="http://"]::before {
content: url(https://g.etfv.co/ + attr(href));
}
Vielleicht wäre die Syntax nicht genau so, aber etwas Ähnliches. Der Punkt ist, dass Sie die `url()`-Syntax nicht in solche Teile in CSS aufteilen können.
Googles Favicon-Dienst
Google hat seinen eigenen Favicon-Dienst, den Sie nutzen können. Zum Beispiel
https://www.google.com/s2/u/0/favicons?domain=css-tricks.com
Automatisierung
Der Trick ist, dass Sie nur den Hostnamen und die TLD benötigen und nichts anderes. Ich habe gesucht und einen einfachen Regex gefunden, um dies aus jeder URL zu extrahieren. Wir brauchen das, da Links nicht immer (oder sogar meistens) die Wurzel von Websites sind.
function getDomain(url) {
return url.match(/:\/\/(.[^/]+)/)[1];
}
Mit diesen Dingen und jQuery finden wir alle Links und wenden das Favicon als Hintergrundbild an. Die Prüfung auf externe Links ist sehr rudimentär, aber es gibt robustere Methoden hier, falls nötig.
$("a[href^='http']").each(function() {
$(this).css({
background: "url(http://www.google.com/s2/favicons?domain=" + getDomain(this.href) + ") left center no-repeat",
"padding-left": "20px"
});
});
Dann erinnerte mich @travis daran, dass man einfach `this.hostname` anstelle des schicken Regex verwenden kann. Also
/* Nothing else needed */
$("a[href^='http']").each(function() {
$(this).css({
background: "url(https://www.google.com/s2/favicons?domain=" + this.hostname + ") left center no-repeat",
"padding-left": "20px"
});
});
Ich bin mir nicht sicher, wie die Browserunterstützung für `hostname` ist, ob sie genauso gut ist wie `href` oder schlechter, ich weiß es nicht.
getFavicon-Methode
@seanodotcom zeigte mir einen weiteren ähnlichen Dienst namens getFavicon.
Er wird von Google AppEngine gehostet, ist aber nicht Googles eigener Dienst. Ich fand ihn etwas langsamer. Aber der Vorteil ist, dass Sie sich überhaupt nicht mit Hostnamen auseinandersetzen müssen, Sie geben ihnen einfach die vollständige URL.
Dann wird es also
$("a[href^='http']").each(function() {
$(this).css({
background: "url(https://g.etfv.co/" + this.href + ") left center no-repeat",
"padding-left": "20px"
});
});
Performance?
Wie Sie sicher wissen, ist die Anzahl der HTTP-Anfragen, die eine Seite stellt, ein wichtiger Faktor für die Performance. Jedes kleine Bild in diesen Techniken ist eine einzelne Seitenanfrage.
@yuritkanchenko wies mich darauf hin, dass es einen coolen Favicon-Dienst gibt, der die Favicons für Sie automatisch sprite, sodass Sie bei einer Anfrage bleiben können.
Zum Beispiel
http://favicon.yandex.net/favicon/google.com/yandex.ru/css-tricks.com
Ich bin ehrlich, ich bin nicht die zusätzliche Meile gegangen und habe das benötigte JavaScript geschrieben, um alle Links zu finden, die Domänen zu verketten, die Anfrage zu stellen und dann die Bilder als Sprite anzuwenden, aber ich bin sicher, Sie könnten das ziemlich schnell erstellen, wenn Sie es wirklich bräuchten.
Die CSS Values and Units Module Level 3 specifications beschreiben, dass dies funktionieren sollte
(Quelle)
Hm. Wusste gar nicht, dass es Favicon-Dienste überhaupt gibt. Ich könnte mir vorstellen, dass dies genutzt wird, besonders da Favicons mehr oder weniger zur „Identität“ einer Website werden.
+1 für die „Ich wünschte“-Nur-CSS-Technik. Ich wünschte, das wäre wahr…
Ich habe tatsächlich kürzlich einen ähnlichen Ansatz ausprobiert und bin ebenfalls bei einer jQuery-Lösung gelandet.
Ich habe genau das mit Lea Verou im April besprochen, zu schade, dass kein Browser Level 3 Attribute implementiert hat.
http://twitter.theinfo.org/192968593087004675
Da Sie die Favicons mit JS laden, sollten die zusätzlichen HTTP-Aufrufe keine große Rolle spielen, oder? Das passiert alles nach dem Seitenaufruf.
@Aaron: Es passiert nach `document.ready`, aber Bilder und dergleichen werden immer noch geladen, und es wäre schön, wenn sie alle auf einmal erscheinen würden!
Haha, ziemlich lustig. Habe etwa 5 Minuten gebraucht, um etwas Dummes zu mocken.
http://jsfiddle.net/95A4h/
Ich mag diese Lösung ziemlich gut, obwohl ein Tipp wäre, den Selektor (oben im JS) anzupassen, sodass er nur HREFs auswählt, die zu anderen Domänen als unserer eigenen gehören, oder nur HREFs auswählt, die ein entsprechendes `target="_blank"` haben…
Es hat keinen Sinn, interne Links auf unserer eigenen Website mit Favicons zu versehen! :)
Es gibt noch ein paar andere Dinge, die hinzugefügt werden sollten, wenn Sie dies tatsächlich in Produktion verwenden möchten.
– Doppelte Domänen aus dem Array entfernen
– Sie sortieren und generieren dann die Hintergrund-URL
Auf diese Weise müsste es nicht mehrere Favicons für dieselbe Domäne laden, und es könnte den generierten Sprite cachen :)
Hier, bitte
http://jsfiddle.net/95A4h/20/
Änderungen
1. Favicons für Links, daher muss kein initialer Selektor an die Links übergeben werden
2. Container-Selektor hinzugefügt, falls Sie ihn nur auf einen Container anwenden möchten
3. `$.map` anstelle von `$.each` verwendet
Sie müssen es auch in separate Anfragen aufteilen, da bei zu vielen Links ein 414 Request-URI Too Large ausgegeben wird.
Stimmt, aber nur, wenn die Liste der eindeutigen Domänen/Seiten (unterschiedliche Seiten könnten unterschiedliche Favicons haben)
Ich habe ein wenig herumgespielt und mir ist eingefallen: Warum müssen wir jeden Link mit derselben wiederholten CSS-Regel inline stylen? Warum nicht eine Art kleines Stil-Management erstellen, das eine Klasse erstellt, sie injiziert und den Klassennamen zurückgibt, der angewendet werden könnte – viel sauberer, fühlt sich besser an.
Und so wurde stylist.js geboren – unabhängig (Sie können es mit jedem Framework verwenden, das Sie mögen) – bisher 2 Tage Arbeit, funktioniert bereits, jetzt wird die Analyse von Eingabe-Kurzschreibweisen-CSS-Regeln, die als String übergeben werden, durchgeführt – ich werde die Ergebnisse posten, wenn ich mehr oder weniger fertig bin :-)
Eine Lösung könnte die Verwendung von Favatar sein, das nicht nur verschiedene Bilder für die Webseite abruft (apple-touch-icon, og:image etc.), sondern sie auch als `data:`-Elemente zurückgibt, was sie möglicherweise einfacher über CSS einzufügen macht.
Hallo.
Chad Scira hat das bereits getan, aber hier ist eine weitere Annäherung : ) (ich verwende sie, um das Favicon anzuzeigen, auf diese Weise können Sie die Schriftgröße ändern)
http://jsfiddle.net/tx2z/WTAr9/225/
Grüße!
Ich habe „span“ verwendet, um das Favicon anzuzeigen*
Ich habe Probleme damit.
Ich habe das JavaScript in die
kopiert und eingefügt. Ist das alles, was ich tun muss??? Weil es bei mir nicht funktioniert.
Ich benutze WordPress, falls das einen Unterschied macht?
Wie Sie wahrscheinlich sehen können, bin ich ein Amateur, also seien Sie nicht zu hart zu mir!
τακακια – Haben Sie jQuery eingebunden?
Hi, das Einzige, was ich getan habe, war, das JavaScript aus Ihrem Beitrag in den Kopf einzufügen. Mir fehlt etwas, richtig?
Ja, Sie müssen auch jQuery einbinden, damit es funktioniert.
Ein Gruß
Ok, wo kann ich es finden? :- (
Grüße,
Ich weiß nicht, ob ich etwas falsch verstehe, aber was ist mit dem einfachen Missbrauch des `title`-Attributs und dem Zielen darauf in CSS?
Wirklich… Kann mir jemand beschreiben, was das Problem ist?
Ich meine, legen Sie einfach Ihre Favicons auf Ihren Server, warum brauchen Sie dafür einen externen Dienst?
Alter… ernsthaft? Das bedeutet, ich spare 30 Sekunden… Das ist wie zu sagen: Warum zu Burger King gehen und 5,00 Dollar ausgeben, wenn man dasselbe (aber gesünder) zu Hause in ungefähr der gleichen Zeit für 1,00 Dollar kochen könnte… Jeder Muskel, den ich bewege, bringt mich einen Muskel näher an den Tod… Also im Grunde… Ich will nicht sterben, deshalb ist das eine großartige Idee… Dein Denkprozess ist völlig daneben, Mann… ernsthaft…
Oh Mann, ich habe gerade deinen Namen gesehen, er ist wie ein Ninja-Name, ich wette, du schreist deinen eigenen Namen, wenn du mit deinem Ninjenschwert durch den Raum fliegst, alle “UTZZZUTTZZZZ!!!!” *hack*… Im Kill-Bill-Stil mit dem Gartenschlauch und dem fließenden Blut. Den Film habe ich aber nicht wirklich verstanden, ich war einfach nicht dazu *in*teressiert, weißt du? Vielleicht sehe ich ihn mir noch einmal an und schaue, ob er mich, da ich älter bin und verheiratet, mehr anspricht.
Genial, Kumpel… hat meinen Tag gemacht ;)
..und Sie sind nicht einmal weit von der Realität entfernt. Sie reden besser in der dritten Person von sich selbst, wenn Sie ein Ninja-Meister und der Sohn von Tonny f***ing Montana sind.
Das Problem ist die Ladezeit und die Anfragen. Wenn man dies mit einer Seite mit vielen externen Links (z. B. einer Kleinanzeigenseite) verwenden würde, könnte man eine Caching-Technik in Betracht ziehen, wie z. B. die Verwendung von PHP, um die Bilder einmal täglich herunterzuladen.
Guter Punkt, SodaPop… Ladezeit ist alles, und jede Millisekunde zählt.
Großartige Diskussion………und auch ein schöner Artikel……….Ich folge dieser Seite………
Re-Unterstützung für `HTMLAnchorElement#hostname`: Es ist nicht in DOM2 HTML aufgeführt, aber ich habe es ausprobiert und es auf Desktop-Browsern weitgehend unterstützt gefunden: Ich habe all diese erfolgreich getestet
Aktuelles Chrome (ich habe keine älteren Kopien)
Firefox 3.6 (und damit wahrscheinlich alle danach)
IE6 (ja, wirklich, und damit wahrscheinlich alle danach)
Opera 11
Konqueror 4.7.4
Safari 5.1
Midori 0.4.0
Mobile Browser habe ich nicht getestet.
Das JSFiddle-Tool gefällt mir wirklich. Habe früher sqlfiddle benutzt. Danke für die Information über die Dienste zum Abrufen von Favicons.
Toller Artikel, Chris! Ich werde ihn auf jeden Fall in meinem nächsten Projekt verwenden!
Es wäre schön, auch das `title`-Attribut abrufen zu können, falls Sie viele Links haben und nicht manuell einen Titel für jeden Link hinzufügen möchten.
Weiß jemand, ob das möglich ist?
Ich wünschte nur, es bräuchte kein jq… aber es ist eine sehr benutzerfreundliche Sache :)
OpenDNS hat mich gerade informiert, dass die „Demo“-Website eine Phishing-Website ist.
Gut, dass ich nicht durch diese Website getäuscht wurde, um dorthin zu gehen und persönliche Daten missbrauchen zu lassen.
Ich habe etwas Ähnliches als jQuery-Plugin gemacht. Es funktioniert mit den meisten Websites, da die meisten von ihnen bereits `/favicon.ico` in ihrem Hauptverzeichnis haben. Und die Leistung ist besser, da Sie nur eine Bildanfrage senden.
Die Verwendung ist auch ziemlich einfach, fügen Sie einfach zwei Zeilen aus dem enthaltenen Gist hinzu und fügen Sie dann die Klasse `fav` zu jedem `` in Ihrem Code hinzu. FERTIG.
http://goo.gl/Ft1dM
Ich hoffe, jemand wird es genießen :)
PS. Wenn Sie Fehler finden, kommentieren Sie gerne den Code auf Gist. Cheers!
Cool, Sir. Ich werde es versuchen
@Maurice: Kommt das jQuery in den Kopf der Website innerhalb der Tags?
@Avinash: Es gibt viele Möglichkeiten. Die, die ich am häufigsten benutze, ist, eine Datei für Ihre Skripte und eine weitere nur für Plugins zu haben, und in diesem Fall fügen Sie einfach die erste Zeile zu dieser Datei und die zweite Zeile hinzu, wo Sie es für geeignet halten, Favicons zu rendern/herunterzuladen, um zu starten.
Wenn Sie die Plugins.js-Datei nicht verwenden möchten, können Sie sie überall einfügen: im `
` in `DigitalOcean
CSS-Tricks
Soziales