::after CSS für meine Bilder zeigt keine Wirkung, was mache ich nur falsch?

window frame 1149166 1920
Bildquelle: Pixabay, Free-Photos

Hier ist das CSS

img {
    position: relative;
    display: block;
}

img::after {
    content: "" 
    display: block;
    position: absolute;
    bottom: -10px;
    top: -10px;
    right: -10px;
    left: -10px;
    border-left: 10px solid rgba(0, 0, 0, 0.3);
    border-top: 10px solid rgba(0, 0, 0, 0.3);
    border-right: 10px solid rgba(0, 0, 0, 1);
    border-bottom: 10px solid rgba(0, 0, 0, 1);
}

Bei so genannten Replaced Elements, wozu auch Bilder gehören, haben ::before und ::after keine Wirkung.

Eigenschaften von Replaced Elements

Das sind zum Beispiel img iframe, textarea embed, video oder Formular-Elemente. Ein Replaced Element ist ein Element dessen Inhalt sich im HTML-Kontext aus seinen Definitionsparametern definiert und nicht alleine durch seine Auszeichnung. Die Auszeichnung ist nur dafür zuständig zu definieren was es ist. Erscheinungsbild und Größe definieren sich erst mit der Ressource, zum Beispiel durch die Angabe von Höhe und Breite als Attribute (zum Beispiel iframes, Bilder), oder browserspezifische Vorgaben (zum Beispiel Formularelemente).

Einige Werte können durch CSS-Angaben modifiziert werden, andere nicht. Die meisten HTML-Elemente sind Non-replaced

Workaround

Bilder zum Beispiel mit einem Span, Div oder Link zu umgeben, und ::before und / oder ::after darauf beziehen, umgeht die Einschränkung.

.imglink img {
    display: block;/* verhindert unteren Abstand zwischen Rahmen und Bild */
}

.imglink {
    position: relative;
    display: inline-block;/* sorgt dafür, dass der Link das Bild vollständig umgibt , und damit auch der Rahmen es tut */
}

.imglink::after {
    content: "" /* für Pseudoelemente zwingend */
    display: block;
    position: absolute;
    bottom: -10px;
    top: -10px;
    right: -10px;
    left: -10px;
    border-left: 10px solid rgba(0, 0, 0, 0.3);
    border-top: 10px solid rgba(0, 0, 0, 0.3);
    border-right: 10px solid rgba(0, 0, 0, 1);
    border-bottom: 10px solid rgba(0, 0, 0, 1);
}
post image 13821 2017 08 jpg

Wenn das Pseudoelement allerdings nur den einen Zweck erfüllen soll die Rahmendimension über die volle Breite hinausragen zu lassen, kann CSS calc die Anforderung ebenfalls erfüllen. Der Bildbreite die doppelte Rahmendicke in Pixel hinzufügen, das Bild relativ positionieren, und links und rechts mit dem Minuswert der Rahmenbreite „hinausrücken“.

img {
    position:relative;
    right:-10px;
    left:-10px;
    width: calc(100% + 20px); /* ggf. max-width berücksichtigen */
    border-top: 10px solid rgba(0, 0, 0, 0.3);
    border-right: 10px solid rgba(0, 0, 0, 1);
    border-bottom: 10px solid rgba(0, 0, 0, 1);
    border-left: 10px solid rgba(0, 0, 0, 0.3);
}
post image 13821 2017 08 jpg

Bitte Kommentarfunktion nicht für Supportanfragen nutzen. Dem kann hier nicht entsprochen werden. Die Angabe einer E-Mail-Adresse und eines Namens ist nicht erforderlich. Einen (Spitz)-Namen zu nennen wäre aber doch nett.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Hinweis: Sowohl angegebener Name als auch E-Mail-Adresse (beides ist optional, dafür werden alle Kommentare vor Veröffentlichung geprüft) werden dauerhaft gespeichert. Du kannst jeder Zeit die Löschung Deiner Daten oder / und Kommentare einfordern, direkt über dieses Formular (wird nicht veröffentlicht, und im Anschluss gelöscht), und ich werde das umgehend erledigen. – Mit hinterlassenen Kommentaren hinterlegte IP-Adressen werden nach zwei Monaten automatisch gelöscht

publicly queryable