Beste Möglichkeit, CSS einzuschließen? Warum @import verwenden?

288

Grundsätzlich frage ich mich, welchen Vorteil / Zweck es hat @import, Stylesheets in ein vorhandenes Stylesheet zu importieren, anstatt nur ein weiteres hinzuzufügen ...

<link rel="stylesheet" type="text/css" href="" />

an den Kopf des Dokuments?

Gemeinschaft
quelle
14
Die Portabilität ist die erste, die mir in den Sinn kommt. Wenn Sie eine Reihe von CSS-Dateien in verschiedene Seiten aufnehmen möchten, ist es einfacher und wartbarer, nur eine CSS-Datei auf jeder Seite zu verknüpfen, anstatt 5.
xbonez
1
@xbonez: In den meisten solchen Situationen ist jedoch eine erhebliche Menge anderen gängigen HTML-Codes beteiligt. Daher ist es im Allgemeinen besser, beide Stylesheets in einer Vorlage zu verknüpfen.
Abenddämmerung -inaktiv-
6
In den schlechten alten Zeiten war @import praktisch, um sowohl "gute" Browser (Netscape 4, IE5) als auch schlechte Browser (IE3, N3) zu unterstützen. Heutzutage ist es fast nutzlos.
mddw
4
<link> ist ein ungültiges Element in HTML5 . Sie können es also ohne Schrägstrich verwenden <link rel="stylesheet" type="text/css" href="theme.css">.
14онстантин Ван

Antworten:

333

Unter dem Gesichtspunkt der Seitengeschwindigkeit @importsollte eine CSS-Datei fast nie verwendet werden, da dies verhindern kann, dass Stylesheets gleichzeitig heruntergeladen werden. Zum Beispiel, wenn Stylesheet A den Text enthält:

@import url("stylesheetB.css");

Dann wird der Download des zweiten Stylesheets möglicherweise erst gestartet, nachdem das erste Stylesheet heruntergeladen wurde. Wenn andererseits beide Stylesheets in <link>Elementen auf der Haupt-HTML-Seite referenziert sind , können beide gleichzeitig heruntergeladen werden. Wenn beide Stylesheets immer zusammen geladen werden, kann es auch hilfreich sein, sie einfach in einer einzigen Datei zu kombinieren.

Es gibt gelegentlich Situationen, in denen dies @importangemessen ist, aber sie sind im Allgemeinen die Ausnahme und nicht die Regel.

Dämmerung -inaktiv-
quelle
46
There are occasionally situations where @import is appropriateWie unter Verwendung von @mediaverschiedenen Arten auf verschiedene Geräte anzuwenden.
Derek 5 會 功夫
50
Ein weiterer Grund wäre das Hinzufügen einer @importSchriftart für Google @import url(http://fonts.googleapis.com/css?family=Archivo+Narrow);zum linkStylesheet (z. B. ), damit Sie nicht mit diesem Stylesheet eine in jede Seite einfügen müssen .
Cayhorstmann
28
Für diejenigen, die neugierig sind: Eine meiner Lieblingsanwendungen @importist, wenn Sie einen Build-Prozess mit so etwas wie eingerichtet haben grunt-concat-css. Während der Entwicklung @importfunktionieren die Anweisungen und die Geschwindigkeit beim Laden von Seiten ist kein Problem. Wenn Sie dann für die Produktion erstellen, verkettet ein solches Tool alle Ihre CSS-Dateien entsprechend und entfernt die @import. Ähnliches mache ich mit meinen JavaScript-Dateien grunt-browserify.
Brandon
3
@Derek 朕 會 功夫 Wenn Sie @importgerätespezifische Stile anwenden möchten, verwenden Sie doch einfach ein <link>Tag mit einem Medienattribut .
Jomar Sevillejo
1
@ MuhammedAsif Es gibt keinen Grund, warum @importschneller sein würde. Sie sehen wahrscheinlich eine Art Messartefakt.
Abenddämmerung -inaktiv-
185

Ich werde Devil's Advocate spielen, weil ich es hasse, wenn die Leute zu sehr zustimmen.

1. Wenn Sie ein Stylesheet benötigen, das von einem anderen abhängt, verwenden Sie @import. Führen Sie die Optimierung in einem separaten Schritt durch.

Es gibt zwei Variablen, für die Sie zu einem bestimmten Zeitpunkt optimieren - die Leistung Ihres Codes und die Leistung des Entwicklers . In vielen, wenn nicht in den meisten Fällen ist es wichtiger , den Entwickler effizienter zu machen und erst dann den Code leistungsfähiger zu machen .

Wenn Sie ein Stylesheet haben, das von einem anderen abhängt , ist es am logischsten, es in zwei separate Dateien zu legen und @import zu verwenden. Das ist für die nächste Person, die sich den Code ansieht, am logischsten.

(Wann würde eine solche Abhängigkeit auftreten? Es ist meiner Meinung nach ziemlich selten - normalerweise reicht ein Stylesheet aus. Es gibt jedoch einige logische Stellen, an denen Dinge in verschiedene CSS-Dateien eingefügt werden können :)

  • Theming: Wenn Sie unterschiedliche Farbschemata oder Themes für dieselbe Seite haben, teilen diese möglicherweise einige, aber nicht alle Komponenten.
  • Unterkomponenten: Ein erfundenes Beispiel: Angenommen, Sie haben eine Restaurantseite mit einem Menü. Wenn sich das Menü stark vom Rest der Seite unterscheidet, ist es einfacher zu pflegen, wenn es sich in einer eigenen Datei befindet.

Normalerweise sind Stylesheets unabhängig, daher ist es sinnvoll, sie alle mit einzuschließen <link href>. Wenn es sich jedoch um eine abhängige Hierarchie handelt, sollten Sie das tun, was am logischsten ist.

Python verwendet den Import. C verwendet include; JavaScript hat erforderlich. CSS hat Import; Wenn Sie es brauchen, verwenden Sie es!

2. Wenn Sie den Punkt erreicht haben, an dem die Site skaliert werden muss, verketten Sie das gesamte CSS.

Mehrere CSS-Anfragen jeglicher Art - ob über Links oder über @imports - sind für Hochleistungswebsites eine schlechte Praxis . Sobald Sie an dem Punkt angelangt sind, an dem die Optimierung wichtig ist, sollte Ihr gesamtes CSS durch einen Minifier fließen. Cssmin kombiniert Importanweisungen. Wie @Brandon hervorhebt, hat grunt auch dafür mehrere Möglichkeiten. ( Siehe auch diese Frage ).

Sobald Sie sich in der minimierten Phase befinden, <link>ist es schneller, wie die Leute bereits betont haben. Verknüpfen Sie also höchstens ein paar Stylesheets und importieren Sie keine, wenn überhaupt möglich.

Bevor die Site jedoch den Produktionsmaßstab erreicht, ist es wichtiger, dass der Code organisiert und logisch ist, als dass er etwas schneller abläuft.

Chris
quelle
37
+1 für das Spielen des "Bösen", während wirklich Punkte gemacht werden, die zu einer breiteren Sicht auf das Thema beitragen.
Harogaston
"Mehrere CSS-Anfragen jeglicher Art - ob über Links oder über @imports - sind eine schlechte Praxis für Hochleistungswebsites." Dies ist aufgrund des Multiplexens keine schlechte Vorgehensweise bei der Verwendung von HTTP / 2.
Gummiost
13

Aus @importGeschwindigkeitsgründen ist es am besten, CSS NICHT in eine Seite aufzunehmen. In diesem ausgezeichneten Artikel erfahren Sie, warum nicht: http://www.stevesouders.com/blog/2009/04/09/dont-use-import/

Außerdem ist es oft schwieriger, CSS-Dateien zu minimieren und zu kombinieren, die über das @ import-Tag bereitgestellt werden, da Minify-Skripte die @ import-Zeilen nicht aus anderen CSS-Dateien "herausschälen" können. Wenn Sie sie als <Link-Tags einfügen, können Sie vorhandene Minify-PHP / Dotnet / Java-Module verwenden, um die Minimierung durchzuführen.

Also: verwenden <link />statt @import.

Koen Peters
quelle
1
Wenn Sie zum Beispiel grunzen, können Sie den @import auch mit Mähdrescher nutzen. Dann wird das importierte Stylesheet eingebettet, sodass es eins wird. Was für mich ist, das Beste aus beiden Welten zu bekommen.
Bjorsig
11

Mit der Link-Methode werden die Stylesheets parallel geladen (schneller und besser), und fast alle Browser unterstützen Link

Beim Importieren werden alle zusätzlichen CSS-Dateien einzeln (langsamer) geladen, und Sie erhalten möglicherweise Flash Of Unstyled Content

mowgli
quelle
8

@Nebo Iznad Mišo Grgur

Im Folgenden finden Sie alle korrekten Möglichkeiten zur Verwendung von @import

@import url("fineprint.css") print;
@import url("bluish.css") projection, tv;
@import 'custom.css';
@import url("chrome://communicator/skin/");
@import "common.css" screen, projection;
@import url('landscape.css') screen and (orientation:landscape);

Quelle: https://developer.mozilla.org/en-US/docs/Web/CSS/@import

BBagi
quelle
7

Es gibt keinen großen Unterschied zwischen dem Hinzufügen eines CSS-Stylesheets im Kopf und der Verwendung der Importfunktion. Die Verwendung @importwird im Allgemeinen zum Verketten von Stylesheets verwendet, damit diese leicht erweitert werden können. Es könnte verwendet werden, um verschiedene Farblayouts einfach auszutauschen, beispielsweise in Verbindung mit einigen allgemeinen CSS-Definitionen. Ich würde sagen, der Hauptvorteil / Zweck ist die Erweiterbarkeit.

Ich stimme dem Kommentar von xbonez auch darin zu, dass Portabilität und Wartbarkeit zusätzliche Vorteile sind.

Travis J.
quelle
3

Sie sind sehr ähnlich. Einige mögen argumentieren, dass @import besser zu warten ist. Jeder @ Import kostet Sie jedoch eine neue HTTP-Anfrage auf die gleiche Weise wie die Verwendung der "Link" -Methode. Im Kontext der Geschwindigkeit ist es also nicht schneller. Und wie "duskwuff" sagte, wird es nicht gleichzeitig geladen, was ein Nachteil ist.

Kris Hollenbeck
quelle
3

Ein Ort, an dem ich @import verwende, ist, wenn ich zwei Versionen einer Seite mache, Englisch und Französisch. Ich werde meine Seite auf Englisch mit einer main.css erstellen. Wenn ich die französische Version ausbaue, werde ich auf ein französisches Stylesheet (main_fr.css) verlinken. Oben im französischen Stylesheet importiere ich die Datei main.css und definiere dann bestimmte Regeln für nur die Teile neu, die ich in der französischen Version anders benötige.

BBagi
quelle
3

Zitiert von http://webdesign.about.com/od/beginningcss/f/css_import_link.htm

Der Hauptzweck der @ import-Methode besteht darin, mehrere Stylesheets auf einer Seite zu verwenden, jedoch nur einen Link in Ihrem <Kopf>. Beispielsweise kann ein Unternehmen für jede Seite der Site ein globales Stylesheet haben, wobei Unterabschnitte zusätzliche Stile enthalten, die nur für diesen Unterabschnitt gelten. Durch Verknüpfen mit dem Stylesheet des Unterabschnitts und Importieren der globalen Stile oben in diesem Stylesheet müssen Sie kein gigantisches Stylesheet mit allen Stilen für die Site und jeden Unterabschnitt verwalten. Die einzige Voraussetzung ist, dass alle @ import-Regeln vor den restlichen Stilregeln stehen müssen. Und denken Sie daran, dass Vererbung immer noch ein Problem sein kann.

Vishnuraj V.
quelle
3

Manchmal muss man @import anstelle von Inline verwenden. Wenn Sie an einer komplexen Anwendung mit 32 oder mehr CSS-Dateien arbeiten und IE9 unterstützen müssen, haben Sie keine andere Wahl. IE9 ignoriert alle CSS-Dateien nach den ersten 31 und dies schließt CSS ein. Jedes Blatt kann jedoch 31 andere importieren.

Carl
quelle
3

Es gibt viele gute Gründe, @import zu verwenden.

Ein wichtiger Grund für die Verwendung von @import ist das browserübergreifende Design. Importierte Blätter sind im Allgemeinen vor vielen älteren Browsern verborgen, sodass Sie bestimmte Formatierungen für sehr alte Browser wie Netscape 4 oder ältere Serien, Internet Explorer 5.2 für Mac, Opera 6 und älter sowie IE 3 und 4 für PC anwenden können.

Zu diesem Zweck können Sie in Ihrer base.css-Datei Folgendes haben:

@import 'newerbrowsers.css';

body {
  font-size:13px;
}

Wenden Sie in Ihrem importierten benutzerdefinierten Blatt (newerbrowsers.css) einfach den neueren Kaskadenstil an:

html body {
  font-size:1em;
}

Die Verwendung von "em" -Einheiten ist den "px" -Einheiten überlegen, da sich sowohl die Schriftarten als auch das Design basierend auf den Benutzereinstellungen dehnen können, während ältere Browser besser mit pixelbasierten Einheiten umgehen können (die starr sind und in den Benutzereinstellungen des Browsers nicht geändert werden können). . Das importierte Blatt wird von den meisten älteren Browsern nicht gesehen.

Sie können so, wen interessiert das? Wenn Sie versuchen, größere veraltete Regierungs- oder Unternehmenssysteme aufzusuchen, werden diese älteren Browser weiterhin verwendet. Aber es ist wirklich nur gutes Design, denn der Browser, den Sie heute lieben, wird auch eines Tages veraltet und veraltet sein. Wenn Sie CSS nur eingeschränkt verwenden, haben Sie jetzt eine noch größere und wachsende Gruppe von Benutzeragenten, die mit Ihrer Website nicht gut funktionieren.

Wenn Sie @import verwenden, erreicht Ihre browserübergreifende Website-Kompatibilität jetzt eine Sättigung von 99,9%, einfach weil so viele ältere Browser die importierten Blätter nicht lesen. Es garantiert, dass Sie einen einfachen Schriftsatz für das HTML anwenden, aber fortgeschrittenere CSS werden von neueren Agenten verwendet. Auf diese Weise können ältere Agenten auf Inhalte zugreifen, ohne die in neueren Desktop-Browsern erforderlichen visuellen Anzeigen zu beeinträchtigen.

Denken Sie daran, dass moderne Browser HTML-Strukturen und CSS nach dem ersten Aufruf einer Website sehr gut zwischenspeichern. Mehrere Anrufe an den Server sind nicht der Engpass, der es einmal war.

Megabyte und Megabyte an Javascript-APIs und JSON, die auf intelligente Geräte hochgeladen wurden, und schlecht gestaltete HTML-Markups, die zwischen den Seiten nicht konsistent sind, sind heute der Haupttreiber für langsames Rendern. Ihre durchschnittliche Google-Nachrichtenseite enthält mehr als 6 Megabyte ECMAScript, um nur ein kleines Stück Text zu rendern! LOL

Ein paar Kilobyte zwischengespeichertes CSS und konsistentes sauberes HTML mit kleineren Javascript-Footprints werden in einem Benutzeragenten blitzschnell gerendert, einfach weil der Browser sowohl konsistentes DOM-Markup als auch CSS zwischenspeichert, es sei denn, Sie möchten dies über Javascript-Zirkustricks manipulieren und ändern.

Stokely
quelle
2

Ich denke, der Schlüssel dazu sind die beiden Gründe, warum Sie tatsächlich mehrere CSS-Stylesheets schreiben.

  1. Sie schreiben mehrere Blätter, da für die verschiedenen Seiten Ihrer Website unterschiedliche CSS-Definitionen erforderlich sind. Oder zumindest erfordern nicht alle von ihnen alle CSS-Definitionen, die eine andere Seite benötigt. Sie teilen also die CSS-Dateien auf, um zu optimieren, welche Blätter auf den verschiedenen Seiten geladen werden, und um zu vermeiden, dass zu viele CSS-Definitionen geladen werden.
  2. Der zweite Grund, der Ihnen in den Sinn kommt, ist, dass Ihr CSS so groß wird, dass es unhandlich wird, es zu handhaben. Um die Verwaltung der großen CSS-Datei zu vereinfachen, teilen Sie sie in mehrere CSS-Dateien auf.

Aus dem ersten Grund würde das zusätzliche <link>Tag gelten, da Sie so verschiedene CSS-Dateien für verschiedene Seiten laden können.

Aus dem zweiten Grund @importerscheint die Anweisung als die praktischste, da Sie mehrere CSS-Dateien erhalten, die geladenen Dateien jedoch immer gleich sind.

Aus Sicht der Ladezeit gibt es keinen Unterschied. Der Browser muss die getrennten CSS-Dateien unabhängig von ihrer Implementierung überprüfen und herunterladen.

Nitram
quelle
1
Sie sagen: "Aus Sicht der Ladezeit gibt es keinen Unterschied. Der Browser muss die getrennten CSS-Dateien überprüfen und herunterladen, unabhängig davon, wie sie implementiert sind." Dies ist jedoch nicht korrekt. Der Browser kann mehrere <link> CSS-Dateien parallel herunterladen. Für @ import CSS-Dateien müssen diese jedoch heruntergeladen, analysiert und anschließend die @ import-Dateien heruntergeladen werden. Dies verlangsamt das Laden Ihrer Seite, insbesondere wenn die importierte CSS-Datei über eigene @ import-Dateien verfügt
Cyberspy
2

Verwenden Sie @import in Ihrem CSS, wenn Sie ein CSS-RESET wie Eric Meyers Reset CSS v2.0 verwenden. Es erledigt also seine Aufgabe, bevor Sie Ihr CSS anwenden, um Konflikte zu vermeiden.

user2847941
quelle
2

Ich denke, @import ist am nützlichsten, wenn Sie Code für mehrere Geräte schreiben. Fügen Sie eine bedingte Anweisung ein, um nur den Stil für das betreffende Gerät einzuschließen. Dann wird nur ein Blatt geladen. Sie können das Link-Tag weiterhin verwenden, um allgemeine Stilelemente hinzuzufügen.

Ethan
quelle
0

Ich habe einen "hohen Höhepunkt" verknüpfter Stylesheets erlebt, die Sie hinzufügen können. Während das Hinzufügen einer beliebigen Anzahl von verknüpften Javascript für meinen kostenlosen Host-Anbieter kein Problem war, kam es nach dem Verdoppeln der Anzahl externer Stylesheets zu einem Absturz / einer Verlangsamung. Und das richtige Codebeispiel ist:

@import 'stylesheetB.css';

Ich finde es also nützlich, eine gute mentale Karte zu haben, wie Nitram erwähnte, während ich das Design noch hart codiere. Gute Fahrt. Und ich entschuldige mich für etwaige englische Grammatikfehler.

mggluscevic
quelle
-2

Es gibt fast keinen Grund, @import zu verwenden, da es jede einzelne importierte CSS-Datei separat lädt und Ihre Site erheblich verlangsamen kann. Wenn Sie an der optimalen Art und Weise interessiert sind, mit CSS umzugehen (wenn es um die Seitengeschwindigkeit geht), sollten Sie wie folgt mit Ihrem gesamten CSS-Code umgehen :

  • Öffnen Sie alle Ihre CSS-Dateien und kopieren Sie den Code jeder einzelnen Datei
  • Fügen Sie den gesamten Code zwischen einem einzelnen STYLE-Tag in den HTML-Header Ihrer Seite ein
  • Verwenden Sie niemals CSS @import oder separate CSS-Dateien, um CSS bereitzustellen, es sei denn, Sie haben eine große Menge Code oder es besteht eine besondere Notwendigkeit.

Weitere Informationen finden Sie hier: http://www.giftofspeed.com/optimize-css-delivery/

Der Grund, warum das oben Genannte am besten funktioniert, liegt darin, dass der Browser weniger Anfragen bearbeitet und sofort mit dem Rendern des CSS beginnen kann, anstatt separate Dateien herunterzuladen.

William Dresker
quelle
1
Eine extrem enge, aber gültige Sicht auf den Begriff "Optimierung". Verwenden Sie für Ihre Gesundheit während der Veröffentlichungsphase ein Tool, um diese Art der Optimierung zu erreichen. Bis dahin tun Sie alles, was Ihnen hilft , schneller zu denken und zu programmieren.
Jesse Chisholm
7
Wäre es nicht schneller, eine CSS-Datei (im Header verlinkt) zu verwenden, da die meisten Websites mehr als eine Seite haben und jede Seite im Allgemeinen dieselbe CSS verwendet? Dies führt dazu, dass es einmal übertragen und dann aus dem Browser-Cache (häufig im Speicher) verwendet wird, während das Ganze für jede Seite heruntergeladen wird, wenn es Teil des HTML-Codes jeder Seite ist.
Legolas
4
Es ist eine Katastrophe, alle CSS-Dateien zu kopieren und in STYLE <HEAD>
einzufügen
6
Dies ignoriert völlig das Browser-Caching
Michiel
3
Ich gehe davon aus, dass diese Antwort ein Witz ist? (Der unentgeltliche fette Typ und die verlinkte Seite sagen, dass keine Stil-Tags verwendet werden sollen)
Sanjay Manohar
-2

Dies könnte einem PHP-Entwickler helfen. Mit den folgenden Funktionen werden Leerzeichen entfernt, Kommentare entfernt und alle Ihre CSS-Dateien verkettet. Fügen Sie es dann <style>vor dem Laden der Seite in ein Tag im Kopf ein.

Die folgende Funktion entfernt Kommentare und minimiert die übergebenen CSS. Es wird in Verbindung mit der nächsten Funktion gepaart.

<?php
function minifyCSS($string)
{
    // Minify CSS and strip comments

    # Strips Comments
    $string = preg_replace('!/\*.*?\*/!s','', $string);
    $string = preg_replace('/\n\s*\n/',"\n", $string);

    # Minifies
    $string = preg_replace('/[\n\r \t]/',' ', $string);
    $string = preg_replace('/ +/',' ', $string);
    $string = preg_replace('/ ?([,:;{}]) ?/','$1',$string);

    # Remove semicolon
    $string = preg_replace('/;}/','}',$string);

    # Return Minified CSS
    return $string;
}
?>

Sie rufen diese Funktion im Kopf Ihres Dokuments auf.

<?php
function concatenateCSS($cssFiles)
{
    // Load all relevant css files

    # concatenate all relevant css files
    $css = '';
    foreach ($cssFiles as $cssFile)
    {
        $css = $css . file_get_contents("$cssFile.css");
    }

    # minify all css
    $css = minifyCSS($css);
    echo "<style>$css</style>";
}
?>

Fügen Sie die Funktion concatenateCSS()in Ihren Dokumentenkopf ein. Übergeben Sie ein Array mit den Namen Ihrer Stylesheets mit dem Pfad IE : css/styles.css. Sie müssen die Erweiterung nicht hinzufügen, .cssda sie in der obigen Funktion automatisch hinzugefügt wird.

<head>
    <title></title>
    <?php
    $stylesheets = array(
        "bootstrap/css/bootstrap.min", 
        "css/owl-carousel.min", 
        "css/style"
        );
    concatenateCSS( $stylesheets );
    ?>
</head>
Adam Joseph Looze
quelle
1
Ich denke, es wäre viel besser, den Inhalt Ihres CSS nur manuell zu "minimieren", als ausgewählte Stylesheets zu durchlaufen und sie jeder Seite hinzuzufügen. file_get_contents()Ist auch erheblich langsamer als die Verwendung von cURL.
Connor Simpson
1
Dies ist eine schlechte Idee, die verhindert, dass der Browser-Cache verwendet wird.
Reformiert