Untertitel klebten am Bildrand, und ihr Zeilenabstand blieb gross
Zwei Fehler, die sich gegenseitig verstärkt haben.
**Der Zeilenabstand kam nicht mit.** `::cue { font-size }` ändert die
Schrift, nicht die Zeilenhöhe — die rechnet der Browser weiter aus seiner
eigenen Grösse. Bei 50 Prozent stand deshalb winziger Text mit dem
Abstand von grossem darunter; zwischen zwei Zeilen klaffte eine dritte.
`line-height` als Vielfaches der eigenen Grösse hält das Verhältnis.
**Und sie sassen ganz unten.** Ohne Angabe setzt der Browser jede
Einblendung an den unteren Rand des Videos. Dort liegt bei uns die
Bedienleiste — bei zwei Zeilen verschwand die untere darunter. Die
Unterkante sitzt jetzt bei neunzig Prozent der Videohöhe.
Gestellt wird das am `VTTCue`, nicht über CSS: `::cue` gestaltet den
Text, aber nicht seinen Platz. `lineAlign: "end"` ist dabei der Punkt —
damit meint `line` die Unterkante. Ohne ihn stünde ein zweizeiliger
Untertitel wieder tiefer als ein einzeiliger, also genau der Fall, um den
es ging.
Eine Einblendung, die ihre Stelle selbst mitbringt, behält sie:
Schilder und Aufschriften stehen dort, wo sie im Bild stehen.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
c5ab200846
commit
dbd66592a6
@@ -8,6 +8,7 @@ import {
|
||||
GROESSE_GROESST, GROESSE_KLEINST, GROESSE_SCHRITT, HINTERGRUENDE, SCHRIFTFARBEN,
|
||||
stilAnwenden, stilGeaendert, stilLesen, stilSchreiben, stilVorgabe,
|
||||
type Untertitelstil,
|
||||
einblendungenAusrichten,
|
||||
} from './untertitelstil';
|
||||
import { icons, icon } from './icons';
|
||||
|
||||
@@ -864,6 +865,14 @@ export function spieler(anfrage: Spieleranfrage): void {
|
||||
});
|
||||
menuesAuffrischen();
|
||||
|
||||
// **Auch hier, nicht nur beim Laden.** Wer eine Spur aus- und wieder
|
||||
// einschaltet, bekommt keine zweite `load`-Meldung — die Datei liegt
|
||||
// schon da. Ein zweiter Durchlauf über dieselben Einblendungen kostet
|
||||
// nichts.
|
||||
[...video.textTracks].forEach(t => {
|
||||
if (t.mode === 'showing') einblendungenAusrichten(t);
|
||||
});
|
||||
|
||||
// Geholt wird erst beim Einschalten: einen Untertitel aus einer grossen
|
||||
// Datei zu ziehen kostet den Server das Lesen der ganzen Datei, und die
|
||||
// meisten Spuren schaltet nie jemand ein.
|
||||
@@ -888,6 +897,9 @@ export function spieler(anfrage: Spieleranfrage): void {
|
||||
// steht ohnehin in `label`.
|
||||
if (s.language?.length === 2) t.srclang = s.language;
|
||||
t.dataset.spur = String(s.index);
|
||||
// **Erst wenn die Datei geladen ist, gibt es Einblendungen.** Vorher
|
||||
// ist `track.cues` leer, und ein Ausrichten liefe ins Nichts.
|
||||
t.addEventListener('load', () => einblendungenAusrichten(t.track));
|
||||
video.appendChild(t);
|
||||
});
|
||||
if (untertitel !== null) untertitelWaehlen(untertitel);
|
||||
|
||||
Reference in New Issue
Block a user