Alle 42 CSS-Einheiten (CSS/HTML) auf einen Blick

Und ich dachte lange, ich wäre in HTML/CSS halbwegs auf einem brauchbaren Stand. Technisch, weniger als Designer. Nunja, seit flex wurde es ja auch nicht mehr wirklich komplizierter einfacher 😅

Jetzt bin ich bei einem debugging-Einsatz in einem ERP-Portal über die Einheit q gestolpert. Die Existenz von q und dessen Bedeutung waren mir bisher nicht bewusst.

Also habe ich natürlich angefangen zu lesen.

Was für ein 🐰🕳️

Es gibt 42 verschiedene Einheiten in CSS

Kein Scherz: Mittlerweile gibt es mit 42 (43, wenn man die Umrechnungsfaktoren mitzählt) ganz schön viele Größeneinheiten.

px, %, em, ex, cm, mm, in, pt, pc, vh, vw, rem, vmin, vmax, lvh, lvw, swh, svw, svb, svi, dvh, dvw, dvb, dvi, dvmin, dvmax, Q, cqw, cqh, cqi, cqb, cqmin, cqmax, ch, rch, lh, rlh, cap, rcap, ic, ric, rex

Einige davon klingen einleuchtend und sind recht nützlich, andere klinge für mich eher esoterisch … wie beispielweise das q 😉

px – Pixel, absolute Längeneinheit. Ein Pixel bei 96 dpi (Dots Per Inch) ist ~0,264mm groß, weil 96 Pixel in einen Zoll (25,4mm) passen

% – Prozentsatz, relative Einheit. Relativ zum umgebenden Element

em – Schriftgröße des lokalen Elements. Wenn man eine Schriftgröße von 12px verwendet, dann entspricht 1em = 12px

rem – Prinzipiell identisch zu em, aber von der Schriftgröße des Stammelements ausgehend

ex – Eine Länge, die relativ zur Höhe des kleinen Buchstaben „x“ in der aktuellen Schriftart des aktuellen Elements. Zum Beispiel: „font-size: 2ex;“. Hier würde ich gerne einen Anwendungsfall sehen …

cm – Absolut, Länge in Zentimetern

mm – Absolut, Länge in Millimetern

in – Absout, Länge in Zoll (1 Zoll = 2,54 cm)

pt – Absolut, Länge in Punkt (1pt = 1/72 Zoll)

pc – Absolut, Länge in Pica (1pc = 12pt)

vh – Relative Höhe als Prozentsatz der Ansichtsfensterhöhe, wobei 1vh genau 1% der Ansichtsfensterhöhe entspricht.

vw – Relative Länge als Prozentsatz der Ansichtsfensterbreite, wobei 1vw genau 1% der Ansichtsfensterbreite entspricht.

vmin – Relative Viewport-Einheit, die den Wert 1% der kleineren Dimension des Viewports darstellt. vmin wählt also zwischen der Viewport-Breite (vw) und der Viewport-Höhe (vh) den jeweils kleineren Wert – und bezieht sich darauf als Prozentangabe.

vmax – Relative Viewport-Einheit, die den Wert 1% der größeren Dimension des Viewports darstellt, wie vmin.

lvh – Die größtmögliche Viewport-höhe, während des Seitenladens. Steht für „Large Viewport Height“ und meint die maximale Höhe des Viewports, die ein Element einnehmen kann, wenn alle dynamischen Benutzeroberflächenelemente (Tastatur, Adressleiste, …) ausgeblendet sind. Sozusagen der „Innenraum“

lvw – Siehe lvh, nur in der Breite.

swh – Die kleinstmögliche Viewport-höhe, während des Seitenladens. Komplementör zu lvh

svw – Siehe swh, nur in der Breite.

svb – Die kleinste Viewportblockgröße, basierend auf der kleinsten Blockabmessung. Also die kleinste mögliche Größe des Viewports in Blockrichtung (in der Regel vertikal für die Höhe).

svi – Wie svb, nur für die inline-Größe.

dvh – Die dynamische Ansichtsfensterhöhe. Passt sich immer an, wenn die Höhe des Ansichtsfensters geändert wird (z.B. Resize oder einblenden der Tastatur).

dvw – Die dynamische Ansichtsfensterbreite. Passt sich immer an, wenn die Breite des Ansichtsfensters geändert wird (z.B. Resize oder einblenden der Tastatur).

dvb – Die dynamische Viewportblockgröße, also immer die (Innen-) Dimension des Viewport in Blockrichtung.

dvi – Wie dvb, nur für die inline-Größe.

dvmin – Dynamisch, der jeweils kleinere Wert von dvh oder dvw.

dvmax – Dynamsich, der jeweils größere Wert von dvh oder dvw.

Q – Absolut: steht genau für einen Viertelmillimeter (1q = 1/4mm = 0,25mm). Wenn jemand herausfindet, wofür das jemals (sinnvoll) genutzt wurde, freuen wir uns über einen Hinweis.

cqw – Die dynamische Container-Abfragebreite, jeweils relativ zur Breite des Abfragecontainers. Genauer: die Länge, die einem Prozent der Breite des nächstgelegenen Elements mit einem definierten Containerelement-Kontext entspricht. also ganz ähnlich wie die Viewport-Einheiten, aber auf den Container bezogen

cqh – Siehe cqw, nur relativ zur Höhe.

cqi – Siehe cqw, nur relativ zum inline-Element.

cqb – Siehe cqw, nur relativ zur Blockgröße.

cqmin – Die kleinste Viewportblockgröße aus cqi oder cqb, basierend auf dem umgebenden Container.

cqmax – Siehe cqmin, nur die größere.

ch – Relative Größe zur Höhe des Zeichens „0“ in der aktuellen Schriftart. Also wie ex, aber mit der Null als Basis

rch – Relative Größe (in ch) zum Stammelement

lh – Relative Größe zur Zeilenhöhe (Line-Height) des aktuellen Elements

rlh – Wie lh, nur relativ zum Wurzelelement

cap – Relativ zur Höhe der Großbuchstaben der aktuellen Schriftart

rcap – Wie cap, nur zum Wurzelelement

ic – Steht für das „Ideographische Zeichen 水“ und enthält (pseudo-dynamisch) als Basis die Breite des Schriftzeichens, das durch das CJK-Wasser-Ideogramm (U+6C34) im jeweiligen Element dargestellt wird

ric – Relativ zu 水 (wie ic), aber zum Wurzelelement

rex – Relativ zur ex-Einheit des Root-Elements. Beispiel: height: 2rex;

Wem das auch viel vorkommt: Willkommen im Club. Ganz besonders sei man in CSS (auch relativ und absolut gemischt) rechnen kann, erscheinen die zahlreichen Einheiten etwas überdimensioniert

Sinnloses Beispiel mit verschachtelten calc() Anweisungen:

calc((100% / 7ex) - (4q * 30ric)

1996 fing CSS (CSS Level1) mit 6 Einheiten an und wuchs nach und nach auf diese Monströsen 42. In einem ganz bestimmten Bereich ergeben die meisten auch Sinn. Die Meisten. Nicht alle.

IIS ARR (Reverse Proxy) Fehler 400 (Keycloak, Camunda, Visi …) weil „Ein möglicherweise gefährlicher Request.Path-Wert wurde vom Client (:) entdeckt.“

In einem IIS mit ARR der andere Web-Services hinter sich schützt, tritt (gehäuft in letzter Zeit) schon mal ein „unerwarteter“ Fehler 400 auf. Im Ereignisprotokoll gibt es auch einen (ernsthaft) hilfreichen Hinweis. Der Fehler tritt gehäuft bei Sites auf, die das Angular Framework verwenden.

Eventlog Anwendung, Quelle ASP.NET 4.0.<build>, Ereignis-ID (EventID) 1309,

Event code: 3005 
Event message: Es ist eine unbehandelte Ausnahme aufgetreten. 
 
Application information:
    Trust level: Full 
    Application Virtual Path: / 
    Application Path: C:\inetpub\<PATH> 
 
Exception information: 
    Exception type: HttpException 
    Exception message: Ein möglicherweise gefährlicher Request.Path-Wert wurde vom Client (:) entdeckt.
   bei System.Web.HttpRequest.ValidateInputIfRequiredByConfig()
   bei System.Web.HttpApplication.PipelineStepManager.ValidateHelper(HttpContext context)

Die Request URL enthält einen Doppelpunkt. Einen „gefährlichen“ Doppelpunkt!!1elf

Dass der Doppelpunkt „gefährlich“ ist, liegt grundsätzlich nicht am IIS, sondern an der RFC1738, die genau definiert, wie eine URL aussehen darf („Uniform Resource Locators“). Darin ist nämlich festgelegt, dass …

…only alphanumerics, the special characters „$-_.+!‘(), and reserved characters used for their *reserved purposes* may be used unencoded within a URL

Der Doppelpunkt („colon“) „:“ ist so ein reserviertes Zeichen. Die RFC wird sogar noch deutlicher: „it’s used after the protocol (http, https) and after the domain to specify a port.“

Natürlich lässt sich das Verhalten des IIS anpassen, um solche „illegalen“ Requests zu erlauben. Das sollte man aber zumindest mit seinen Security-Leuten absprechen, die Änderung ist nicht ganz ohne. Die „Lösung“ hier lädt nur die Waffe, wenn sich der Admin damit selber ins Knie schießt, ist das sein Problem 😉

Lösung

Die „richtige“ Lösung ist natürlich, in der Webseite (Web App, Service, was auch immer) korrekt zu serialisieren. Angular nutzt dazu den UrlSerializer router; richtig eingesetzt tritt der Fehler nicht auf.

Oft hat man als Admin „am anderen Ende“ aber keinen Einfluss auf die Entwicklung so einer App. Man kann daher in der Site-Konfiguration (web.config) auf dem IIS die Request-Filterung konfigurieren.

Das hier ist eine Beispiel-Konfiguration, die mehrere solcher „Eigenheiten“ umgeht.

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.web>

    <!-- Off=Debugausgaben in HTTP-Fehlern
         On=Gekuerzte Ausgavben (Produktivumgebung)
    -->
	<customErrors mode="Off" />

    <!--
        maxUrlLength: Lange Request URIs erlauben
        maxQueryStringLength: Lange Query-String (nach dem '?') erlauben
        relaxedUrlToFileSystemMapping: Dateisystemspfade (Doppelpunkte, \\?\) in URIs erlauben
        requestPathInvalidCharacters: Bestimmte Zeichen erlauben
    -->
	<httpRuntime
		maxUrlLength="10999"
		maxQueryStringLength="2097151"
		relaxedUrlToFileSystemMapping="true"
		requestPathInvalidCharacters="*,%,?,\,&amp;,&lt;,&gt;"
	/>
    </system.web>

    <system.webServer>
        <security>
            <!-- allowDoubleEscaping: \\ vor ? erlauben
             -->
            <requestFiltering allowDoubleEscaping="true">
                <requestLimits maxUrl="10999" maxQueryString="2097151" />
            </requestFiltering>
        </security>

WordPress SVG Upload erlauben („Du bist leider nicht berechtigt, diesen Dateityp hochzuladen“)

WordPress erlaubt in der Standardkonfiguration leider bis heute noch keine Verwendung von SVG-Bildern in der Mediathek. Versucht man eine SVG-Datei hochzuladen erscheint der Fehler „<Name>konnte nicht hochgeladen werden. Du bist leider nicht berechtigt, diesen Dateityp hochzuladen.“

Das hat natürlich auch einen Grund: SVGs sind ja XML-Dateien mit potenziell ausführbarem JS-Inhalt. Die „falsche“ SVG Datei könnte, genau wie eine „falsche“ JS oder HTM* Datei möglicherweise Schaden anrichten.

Unverständlicherweise gibt es bis heute aber noch keine „offizielle“ Möglichkeit, SVGs in seinem eigenen privaten Blog zu erlauben.

Lösung

In der functions.php des aktuell verwendeten Themes kann man den Filter einfach umgehen.

<?php
/* SVG erlauben - the old way */
function kb_svg ( $svg_mime ){
	$svg_mime['svg'] = 'image/svg+xml';
	return $svg_mime;
}
add_filter( 'upload_mimes', 'kb_svg' );

/* SVG erlauben - the new way (WP 4.7+) */
function kb_ignore_upload_ext($checked, $file, $filename, $mimes){
if(!$checked['type']){
	$wp_filetype = wp_check_filetype( $filename, $mimes );
	$ext = $wp_filetype['ext'];
	$type = $wp_filetype['type'];
	$proper_filename = $filename;

	if($type && 0 === strpos($type, 'image/') && $ext !== 'svg'){
		$ext = $type = false;
	}

	$checked = compact('ext','type','proper_filename');
}

return $checked;
}
add_filter('wp_check_filetype_and_ext', 'kb_ignore_upload_ext', 10, 4);
?>

Natürlich sollte das nicht so sein, ein Theme sollte nicht die Sicherheitsfunktion des WordPress-Systems verbiegen müssen. Leider ist das bisher der schnellste Weg für Admins um SVG-Grafiken zu erlauben.

Firefox zeigt keine SSL-Seiten an mit dem Fehler „ssl_error_weak_server_ephemeral_dh_key“

Problem

firefox_ssl_error_weak_server_ephemeral_dh_keyFirefox ab Version 39 zeigt viele SSL-gesicherte Seiten nicht mehr an und gängelt den erfahrenen Admin stattdessen mit dieser Meldung:

Fehler: Gesicherte Verbindung fehlgeschlagen

Ein Fehler ist während einer Verbindung mit foo.bar aufgetreten. SSL hat einen schwachen
kurzlebigen Diffie-Hellman-Schlüssel in der Handshake-Nachricht "Server-Schlüsselaustausch"
empfangen. (Fehlercode: ssl_error_weak_server_ephemeral_dh_key)

Das bedeutet, das die anzuzeigende Seite gegen die Logjam-Attacke auf SSL verwundbar ist. Im Prinzip soll der DH-Schlüsseltausch PFS liefern, in einigen Implementierungen ist das Protokoll allerdings angreifbar. Die notwendige Sicherheit auf dem initialen Schlüsselaustausch liefern nur Schlüssellängen von 512bits und mehr, die anzuzeigende Seite möchte aber weniger. Das betriff viele Fritz! Boxen („fritz.box“), Speedport-Router der Telekom („speedport.ip“) und ähnliche Geräte.

Blöderweise liefert viel Hardware und viele Infrastrukturkomponenten die jeweiligen Web-GUIs mit so einer SSL-Konfiguration aus. Dazu zählen EMC, Nimble, HP, IBM, NetAPP, Cisco und fast jeder andere. Da Firmware-Updates an solchen kritischen Punkten oft etwas länger brauchen, benötigen Admins hier eine Lösung (abgesehen von der Wwahl, Chrome oder Edge zu nutzen).

Lösung

firefox-sslv3-fehler-gesicherte-seitenFirefox hat SSLv3 zum Glück noch nicht verlernt, sondern nur dekativiert:

  1. „about:config“ in der Adresszeile öffnen (und Warnung wegklicken)
  2. Suche nach „security.ssl3.
  3. Die beiden Einträge „security.ssl3.dhe_rsa_aes“ zu 128 und 265bit mittels Doppelklick auf „false“ stellen.

WordPress und Word 2010 („Der Beitrag konnte nicht veröffentlicht werden“)

Wenn man einen Blogbeitrag aus Word veröffentlichen möchte und sich wundert warum trotz erfolgreicher Registrierung des WordPress-Kontos in Microsoft Word das Ganze nicht so recht funktionieren will („Der Beitrag konnte nicht veröffentlicht werden“) sollte man sich seine Office Templates in den Gruppenrichtlinien (GPO) nochmal genau anschauen. Die verursachende Einstellung dafür befindet sich unter Microsoft Word 2010 -> Word-Optionen -> Speichern ->Standarddateiformat. Word 2010 kann nur in WordPress veröffentlichen, wenn das Standard-Dateiformat nicht auf das alte Office-format geändert wurde. Ist das Standarddateiformat auf „*.doc“ eingestellt, wird in der lokalen Registry ein Eintrag gesetzt: REG_SZ „DefaultFormat“ mit dem Wert „doc“. Dieser befindet sich entweder unter: HKCUSoftwareMicrosoftOffice14.0WordOptions oder HKCUSoftwarePoliciesMicrosoftoffice14.0wordoptions Die Lösung: Entweder ändert man den Wert auf „*.docx“ direkt in der Registry (und schaltet die entsprechende Richtlinie ab), oder ändert seine GPO dementsprechend. Nach dem nächsten Word-Start passt schon alles. Danke an den Dariusz G. für den Schnipsel und die aufwändige Recherche dazu. Wir hoffen das dieser Artikel anderen Administratoren bei diesem fies zu suchenden Fehler weiterhilft.