CSS: Term und Definition.
Markieren eine Begriffs und Fähnchen mit Erklärung (fasst nur CSS)
Um einen Begriff mit Begriffserklärung in CSS zu erstellen, kann man den :focus Status verwenden. Mit TYPO3 in Kombination mit den CKeditor brauchte ich allerdings eine winzige jQuery-Funktion.
Ich möchte, das die Redaktion in TYPO3 die Begriffe und Erklärung im CK-Editor pflegen kann. Dafür muss ich meine config.yaml für der ckeditor anpassen. Ich erlaube zuerst span-Elemente mit Klassen:
processing:
allowTags:
– span
editor:
config:
extraAllowedContent:
– span[*]{*}(*)
Das muss ich ggf. auch noch in der contants-Datei machen:
styles.content.allowTags:= addToList(span)
Dann füge ich dem Editor zwei Stile hinzu: Einen für den Begriff und einen für die Erklärung:
editor:
config:
contentsCss:
– "../path/custom_ckeditor.css?v=7"
stylesSet: [
{ name: "Begriff", element: "b", attributes: {class: "term"}},
{ name: "Hinweisfähnchen", element: "span", attributes: {class: "definition"}},
]
Dadurch kann die Redaktion nun den Begriff und die Erklärung im CKEditor definieren. Damit zu sehen ist, was im Editor definiert ist, ergänze ich die Styles in der CSS-Datei, die ich unter contentsCss eingebunden habe:
b.term {font-weight:bold; blue}
b.term:after {
content: "i";
display: inline-flex;
width: 11px;
height: 11px;
font-size: 9px;
color: #ffffff;
background-color: #0066FF;
margin-left: 0;
border-radius: 50%;
line-height: 0;
text-align: center;
justify-content: center;
align-items: center;
font-family: ui-monospace;
position: relative;
top: -5px;
margin-right: 0.25rem;
}
span.definition {
border:1px solid #FF4200;
font-size: small;
z-index: 1000;
padding: 4px;
width: fit-content;
transition: all 0.3s;
box-shadow: 0px 0px 5px 0 rgba(0, 0, 0, 0.5);
border-radius: 5px 5px 5px 0;
}
Hier mein HTML im Frontend sieht dann so aus:
<p>Wenn das liebe Tal um mich dampft, und die hohe Sonne an der Oberfläche der undurchdringlichen <b class="term" tabindex="2"><strong>Finsternis</strong></b> <span class="definition">Wenn es voll krass echt dunkel ist.</span> meines Waldes ruht</p>
Dann fehlt noch das CSS (in diesem Fall als SASS) für das Frontend:
.term {
cursor: pointer;
transition: all 0.3s;
color: $color-04;
&:after {
content: "i";
display: inline-flex;
width: 15px;
height: 15px;
font-size: 13px;
color: #ffffff;
background-color: $color-04;'
margin-left: 0;
border-radius: 50%;
line-height: 0;
text-align: center;
justify-content: center;
align-items: center;
font-family: ui-monospace;
position: relative;
top: -13px;
}
&:focus{
color: $color-02;
background-color: $color-04;
transition: all 0.3s;
& + .definition {
max-width:300px;
transition: all 0.3s;
padding: 2px 10px;
font-size: $font-size-small;
transform: translate(-30%, -90%) scale(1);
}
&:after {
background-color: $color-02;
color: $color-04;
}
}
& + .definition {
display: inline-block;
max-width:0;
position: absolute;
overflow: hidden;
background-color: #ffffff;
border:1px solid $color-05;
border-radius: 5px 5px 5px 0;
font-size:0;
z-index: 1000;
padding: 0;
width:fit-content;
transition: all 0.3s;
transform: translate(0, 0) scale(0);
box-shadow: 0px 0px 5px 0 rgba(0,0,0,0.5);
}
}
Tja, und leider funktioniert es nicht. Warum? Weil <b> keinen :focus-State hat. Und dafür benötigen wir dann doch etwas Javascript/jQuery. Denn mit dem Anfügen des Attributs tabindex ist das Element mit der Tastatur ansteuerbar und erhält automatisch die Fähigkeit zu :focus-States. Damit man auch wirklich die Tastatur nutzen kann, um von Begriff zu Begriff zu springen, zählt meine Funktion die Vorkommen und setzt den tabindex entsprechend immer einen weiter:
$(document).ready(function () {
$('.term').each(function (index) {
$(this).attr('tabindex', index + 1);
});
});