Signatur
Beschreibung
Die Eigenschaft containerName gehört zu einem CSSContainerRule-Objekt und liefert den Namen aus der Bedingung einer @container-Regel. Bei @container sidebar (min-width: 400px) { … } ist das der String "sidebar". Der Name bezieht sich auf ein Element, für das per container-name (oder über die Kurzschreibweise container) ein passender Name gesetzt ist.
Ist in der Regel kein Name angegeben, etwa bei @container (min-width: 400px), gibt die Eigenschaft einen leeren String zurück. Dann gilt die Abfrage für den nächstgelegenen Vorfahren, der ein Abfrage-Container ist.
Nützlich ist containerName vor allem beim Untersuchen von Stylesheets zur Laufzeit, zum Beispiel für Debug-Werkzeuge, Linter oder Theme-Editoren. Die Abfragebedingung selbst ohne den Namen steht in containerQuery, die vollständige Bedingung (Name und Abfrage) in conditionText.
Die Eigenschaft ist schreibgeschützt. Um den Namen zu ändern, muss man die Regel löschen und neu einfügen, zum Beispiel mit CSSStyleSheet.deleteRule() und insertRule().
Rückgabewert
@container-Regel oder "" (leerer String), wenn kein Name angegeben ist.Beispiele
Container-Namen aus einem erzeugten Stylesheet auslesen
const sheet = new CSSStyleSheet();
sheet.replaceSync(`
.layout { container: sidebar / inline-size; }
@container sidebar (min-width: 400px) {
.card { display: grid; }
}
`);
const rule = [...sheet.cssRules].find((r) => r instanceof CSSContainerRule);
console.log(rule.containerName);
console.log(rule.containerQuery);
console.log(rule.conditionText);
Regel ohne Namen ergibt einen leeren String
const sheet = new CSSStyleSheet();
sheet.replaceSync(`@container (max-width: 300px) { h2 { font-size: 1rem; } }`);
const [rule] = sheet.cssRules;
console.log(JSON.stringify(rule.containerName));
console.log(rule.containerName === '' ? 'unbenannter Container' : rule.containerName);
Alle Container-Abfragen der Seite nach Namen gruppieren
const groupContainerRules = () => {
const groups = new Map();
for (const sheet of document.styleSheets) {
let rules;
try {
rules = sheet.cssRules; // bei fremden Stylesheets ohne CORS: SecurityError
} catch {
continue;
}
for (const rule of rules) {
if (!(rule instanceof CSSContainerRule)) continue;
const name = rule.containerName || '(ohne Namen)';
if (!groups.has(name)) groups.set(name, []);
groups.get(name).push(rule.containerQuery);
}
}
return groups;
};
console.table([...groupContainerRules()].map(([name, queries]) => ({ name, queries: queries.join(' | ') })));
// Wichtig · Fallstricke
- Schreibgeschützt: Eine Zuweisung wie
rule.containerName = "x"wird ohne Fehlermeldung ignoriert, im Strict Mode löst sie einenTypeErroraus. Soll sich der Name ändern, muss die Regel neu eingefügt werden. - Leerer String statt
null: Ob eine Regel einen Namen hat, prüft man mitrule.containerName !== ""und nicht mit einem Vergleich aufnulloderundefined. - Nur eine Bedingung: Die Eigenschaft beschreibt den Namen bei einer Regel mit genau einer Container-Bedingung. Neuere Entwürfe der Spezifikation erlauben mehrere, durch Kommas getrennte Bedingungen. In diesem Fall zuverlässiger mit
conditionTextarbeiten. - Stylesheets von fremden Domains: Wenn ein Stylesheet von einer anderen Domain ohne CORS-Freigabe geladen wurde, löst schon der Zugriff auf
cssRuleseinenSecurityErroraus. Deshalb intry/catcheinschließen. - Kompatibilität:
CSSContainerRulegibt es seit Chrome 105 und Safari 16.containerNameundcontainerQuerykamen erst später hinzu (Chrome 111, Firefox 110, Safari 16.4). In älteren Browsern bleibt als Ausweg nur,conditionTextselbst zu zerlegen.