Signatur
Beschreibung
CSSPageRule ist die CSSOM-Darstellung einer @page-At-Regel. Mit @page legt man Eigenschaften der Druckseite (des „Seitenkastens“) fest, zum Beispiel size, margin oder page-orientation. Mit Pseudoklassen wie :first, :left, :right und :blank lassen sich einzelne Seiten gezielt ansprechen, benannte Seiten zusätzlich über die Eigenschaft page.
Objekte dieses Typs erzeugt man nicht selbst. Man bekommt sie über CSSStyleSheet.cssRules, wenn ein Stylesheet eine @page-Regel enthält. Die wichtigsten Eigenschaften sind:
selectorText(string, lesen und schreiben): der Seitenselektor, z. B.":first"oder"cover:left". Bei einer@page-Regel ohne Selektor ist der Wert eine leere Zeichenkette.style(CSSPageDescriptorsbzw.CSSStyleDeclaration, nur lesbar): die Deklarationen der Regel. Die einzelnen Werte kann man über dieses Objekt ändern.- Geerbt von
CSSGroupingRule:cssRules,insertRule()unddeleteRule()für verschachtelte Randbereich-Regeln wie@top-center. Geerbt vonCSSRule:cssText,parentRuleundparentStyleSheet.
Typische Einsatzfälle sind Druckansichten, die sich zur Laufzeit anpassen, etwa ein Umschalter zwischen Hoch- und Querformat oder frei einstellbare Seitenränder. Auch Werkzeuge, die Stylesheets auswerten oder umschreiben, arbeiten mit CSSPageRule.
Beispiele
Alle @page-Regeln eines Dokuments auflisten
// Sucht in allen Stylesheets nach @page-Regeln
const findPageRules = () => {
const result = [];
for (const sheet of document.styleSheets) {
let rules;
try {
rules = sheet.cssRules; // bei fremden Stylesheets ohne CORS wird ein SecurityError geworfen
} catch {
continue;
}
for (const rule of rules) {
if (rule instanceof CSSPageRule) result.push(rule);
}
}
return result;
};
for (const rule of findPageRules()) {
console.log(`Selektor: "${rule.selectorText}" | Rand: ${rule.style.margin}`);
}
@page-Regel zur Laufzeit einfügen und Querformat umschalten
// Eigenes Stylesheet für Druckeinstellungen anlegen
const style = document.createElement('style');
document.head.append(style);
const sheet = style.sheet;
const index = sheet.insertRule('@page { size: A4 portrait; margin: 20mm; }');
const pageRule = sheet.cssRules[index];
console.log(pageRule instanceof CSSPageRule); // true
const setLandscape = (landscape) => {
pageRule.style.setProperty('size', landscape ? 'A4 landscape' : 'A4 portrait');
};
setLandscape(true);
console.log(pageRule.cssText);
window.print();
Seitenselektor über selectorText ändern
const style = document.createElement('style');
style.textContent = '@page :first { margin-top: 50mm; }';
document.head.append(style);
const rule = style.sheet.cssRules[0];
console.log(rule.selectorText); // ":first"
// Der große obere Rand soll jetzt für alle linken Seiten gelten
rule.selectorText = ':left';
console.log(rule.selectorText);
console.log(rule.style.getPropertyValue('margin-top'));
// Wichtig · Fallstricke
- Vererbung: Nach der aktuellen Spezifikation erbt
CSSPageRulevonCSSGroupingRule, damit verschachtelte Randbereich-Regeln wie@top-leftmöglich sind. Ältere Browserversionen leiten sie direkt vonCSSRuleab. Dort fehlencssRulesundinsertRule()auf der Regel selbst. - Typ prüfen: Verwenden Sie
rule instanceof CSSPageRule. Der Vergleichrule.type === CSSRule.PAGE_RULE(Wert6) gilt als veraltet. style: Der Typ heißt in neueren ImplementierungenCSSPageDescriptors, in älterenCSSStyleDeclaration. Die MethodensetProperty()undgetPropertyValue()funktionieren mit beiden.- Unterstützung der Deskriptoren: Ob Deskriptoren wie
size,page-orientationoder Randbereich-Regeln tatsächlich wirken, ist je nach Browser verschieden. Safari und Firefox haben sie zum Teil erst spät eingeführt. Das Ergebnis sollte man immer in der Druckvorschau prüfen. - Ungültiger Selektor: Wird
selectorTextauf einen ungültigen Wert gesetzt, ignoriert der Browser die Zuweisung stillschweigend. Es gibt keine Fehlermeldung. - CORS: Der Zugriff auf
cssRulesvon Stylesheets anderer Herkunft ohne passende CORS-Header löst einenSecurityErroraus. Deshalb im Code mittry/catchabsichern.