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); }); });