Signatur
Beschreibung
Das Interface CSSPageDescriptors steht für den Deklarationsblock einer @page-At-Regel. Es wird nicht selbst erzeugt. Man erhält es über die Eigenschaft style eines CSSPageRule-Objekts, das man wiederum in CSSStyleSheet.cssRules findet.
Weil es von CSSStyleDeclaration erbt, stehen alle bekannten Methoden zur Verfügung: getPropertyValue(), setProperty(), removeProperty() und cssText. Dazu kommen eigene Eigenschaften für die Deskriptoren, die in @page erlaubt sind. Es gibt sie jeweils in camelCase und mit Bindestrich:
margin,marginTop/margin-top,marginRight/margin-right,marginBottom/margin-bottom,marginLeft/margin-left: die Seitenrändersize: Seitengröße und Ausrichtung, z. B."A4 landscape"pageOrientation/page-orientation: dreht die Seite (upright,rotate-left,rotate-right)
Typische Einsatzfälle sind Web-Anwendungen mit Druckfunktion, z. B. Rechnungen, Berichte oder Etiketten. Dort sollen Papierformat und Ränder vor dem Aufruf von window.print() dynamisch angepasst werden, ohne ein neues Stylesheet zu laden.
Rückgabewert
CSSPageRule.style zurückgegeben und enthält die Deskriptoren der zugehörigen @page-Regel.Beispiele
@page-Regel finden und Deskriptoren auslesen
// Stylesheet mit einer @page-Regel anlegen
const style = document.createElement('style');
style.textContent = '@page { size: A4; margin: 2cm; }';
document.head.append(style);
const pageRule = [...style.sheet.cssRules]
.find((rule) => rule instanceof CSSPageRule);
const descriptors = pageRule.style;
console.log(descriptors.constructor.name);
console.log(descriptors.size);
console.log(descriptors.marginTop);
console.log(descriptors.getPropertyValue('margin-left'));
Druckformat vor dem Drucken dynamisch umstellen
const getPageRule = () => {
for (const sheet of document.styleSheets) {
try {
const rule = [...sheet.cssRules].find((r) => r instanceof CSSPageRule);
if (rule) return rule;
} catch {
// Fremd-Stylesheets (CORS) überspringen
}
}
// Keine Regel vorhanden: eine anlegen
const el = document.createElement('style');
document.head.append(el);
el.sheet.insertRule('@page {}');
return el.sheet.cssRules[0];
};
const printLandscape = () => {
const { style } = getPageRule();
style.size = 'A4 landscape';
style.margin = '1cm 1.5cm';
console.log(style.cssText);
window.print();
};
printLandscape();
Deskriptor per setProperty/removeProperty ändern
const el = document.createElement('style');
document.head.append(el);
el.sheet.insertRule('@page { margin: 25mm; }');
const { style } = el.sheet.cssRules[0];
style.setProperty('margin-bottom', '40mm'); // Platz für eine Fußzeile
console.log(style.marginBottom);
style.removeProperty('margin');
console.log(style.cssText === '');
// Wichtig · Fallstricke
Browser-Kompatibilität: Den eigenen Typ CSSPageDescriptors gibt es bisher nur in Firefox (ab Version 129). In Chromium-Browsern und Safari liefert CSSPageRule.style ein normales CSSStyleDeclaration. Dort funktionieren getPropertyValue() und setProperty() ebenfalls, die camelCase-Eigenschaften (z. B. pageOrientation) können aber fehlen. Deshalb möglichst nicht per instanceof CSSPageDescriptors prüfen, sondern die Methoden von CSSStyleDeclaration verwenden.
- Nur Deskriptoren, die in
@pageerlaubt sind, werden übernommen. Ungültige Eigenschaften wiecoloroder ungültige Werte werden stillschweigend ignoriert. - Wie gut
sizeundpage-orientationumgesetzt werden, hängt vom Browser ab. Oft kann der Druckdialog die Werte überschreiben. - Bei Stylesheets von fremden Origins löst der Zugriff auf
cssRuleseinenSecurityErroraus (CORS). Deshalb den Zugriff intry/catchkapseln. - Die Änderungen betreffen nur Druckausgabe und Druckvorschau, nicht die Darstellung auf dem Bildschirm.