2016-09-25 3 views
7

Meine Frage ist im Grunde die gleiche wie diese, aber „line-height“ mit „Zeichenabstand“ ersetzen: When a relative line-height is inherited, it is not relative to the element's font-size. Why? And how do i make it relative?Ist es möglich, Buchstabenabstand relativ zur Schriftgröße zu haben und richtig zu erben?

Mein Anwendungsfall ist wie folgt:

body { 
    font-size: 18px; 
    letter-spacing: 1.2em; /* I would like letter-spacing to be relative to the font-size across the document, at least until I override it */ 
} 

.small { 
    font-size: 14px; 
    /* letter-spacing is 1.2em of 18px instead of 14px */ 
} 

Ich weiß, dass der Grund, Es funktioniert nicht, dass der berechnete Wert und nicht der angegebene Wert vererbt wird. Daher muss ich die letter-spacing jedes Mal neu eingeben, wenn sich die font-size ändert. Aber ich hoffe, dass es etwas Ähnliches gibt wie Unitless Werte in line-height arbeiten.

Klar, ich kann dies tun:

* { 
    letter-spacing: 1.2em; 
} 

Aber dann kann ich nicht auf die Kaskaden an einem Element zu stoppen, wie ich in der Lage wäre, mit line-height:

body { 
    font-size: 18px; 
    line-height: 1.5; 
} 

.normal-line-height { 
    line-height: normal; 
    /* all the descendants of this element will have a normal line-height */ 
} 

Ich meine, SURE Ich könnte das immer tun ...

Aber es ist immer noch nicht so elegant, wie ich möchte. Ich denke nicht, dass es eine elegante Lösung für dieses Problem gibt, aber ich frage, ob ich etwas verpasse.

+0

vielleicht Medienabfragen verwenden? – user3791775

+0

@ user3791775 Ich versuche zu verstehen, wie Medienabfragen helfen können, dieses Problem zu lösen, und ich kann nicht. Kannst du bitte etwas ausarbeiten? – benface

+0

Ich glaube nicht, dass es einen Weg gibt, das eleganter zu machen ... aber für so etwas Einfaches ist es nicht wirklich wichtig. Anstatt '*' [könnten Sie den Buchstabenabstand für jedes Element festlegen] (https://jsbin.com/tacebi/edit?html,css,output). Elegant? Nein. Praktisch? Ja. – misterManSam

Antwort

3

CSS Variablen nicht weit unterstützt, aber würde der Trick:

body { 
 
    font-size: 18px; 
 
    --spacing: 1.2em; 
 
} 
 
.normal-letter-spacing { /* No need to select `.normal-letter-spacing *` */ 
 
    --spacing: normal; 
 
} 
 
body * { 
 
    letter-spacing: var(--spacing); 
 
} 
 
.small { 
 
    font-size: 14px; 
 
}
<div> 
 
    <p>Lorem ipsum</p> 
 
    <p class="small">Lorem ipsum</p> 
 
</div> 
 
<hr /> 
 
<div class="normal-letter-spacing"> 
 
    <p>Lorem ipsum</p> 
 
    <p class="small">Lorem ipsum</p> 
 
</div>

Sie arbeiten, weil Der Wert von custom property berechnet den angegebenen Wert:

berechneter Wert: angegebener Wert mit substituierten Variablen (siehe aber Prosa für „ungültige Variablen“)

daher, im Gegensatz zu, was mit letter-spacing geschieht, 1.2em ist nicht auf eine absolute Länge umgewandelt.

Dann können Sie allen Elementen den Wert --spacing als Wert von letter-spacing mitteilen. So wird 1.2em lokal in Bezug auf die Schriftgröße jedes Elements aufgelöst.

Im Gegensatz zu * { letter-spacing: 1.2em; } setzt diese Methode --spacing: 1.2em nur einmal in der body und lässt sie durch Vererbung propagieren. Wenn Sie diesen Wert in einem Teilbaum ändern möchten, müssen Sie daher nur --spacing im Stammverzeichnis überschreiben. Sie müssen nicht den gesamten Teilbaum auswählen.

+2

"Sicher kann ich das tun: * {letter-spacing: 1.2em;}" Sie tun nur das Gleiche, aber bewegen den Wert auf eine benutzerdefinierte Eigenschaft ... aus irgendeinem Grund. – BoltClock

+0

Ich muss allerdings überprüfen, wie sich benutzerdefinierte Requisiten in Bezug auf die Vererbung verhalten. Eine Sekunde. – BoltClock

+0

@BoltClock Ich habe geklärt, warum ich denke, das ist besser als '* {letter-spacing: 1.2em; } '. – Oriol

0

Ich würde versuchen, REM über EM zu verwenden, um Ihre Beziehung mit einem Wert einzufrieren, der root (body) font-size wäre. Sie müssten sich später nicht um Änderungen der Schriftgröße kümmern.

Wenn Sie rems in mehr Orten verwenden möchten, würde ich empfehlen, alle Klassen an einem Ort zu organisieren, so dass Sie nicht viel Problem mit der Wartung haben würden. Es wäre auch eine gute Idee, es als eine Utility-Klasse zu halten wie

.txt-spacing-big { letter-spacing: 2rem; } 
.txt-spacing-medium { letter-spacing: 1rem; } 
+3

Rems werden genau wie ems ausgewertet, sie basieren nur auf der Schriftgröße des Stammelements und nicht auf dem übergeordneten Element. Außerdem ist das Wurzelelement kein Körper, sondern HTML. Und die ganze Prämisse der Frage ist, dass der Autor möchte, dass der Buchstabenabstand relativ zur Schriftgröße des aktuellen Elements ist, nicht eine einzige konstante Größe, die auf der Wurzel definiert ist, so dass dies das Problem überhaupt nicht adressiert. – BoltClock

+0

Vielen Dank für Ihre Antwort, aber BoltClock hat Recht. – benface

+0

Scheint, ich habe einen ganz wichtigen Punkt hier verpasst. Thx for heads up @BoltClock –

Verwandte Themen