2011-12-01 19 views
12

La specifica CSS indica che l'altezza della riga deve essere applicata al testo dividendo il valore specificato per due e applicando il risultato sopra e sotto una riga di testo.Linea principale e altezza linea CSS

Questo varia in modo significativo dalla comprensione tradizionale del comando iniziale, che in genere significa che la spaziatura viene "aggiunta" solo sopra la riga di testo. (So ​​che questo non è corretto al 100%, perché in realtà l'altezza della linea non aggiunge spazio, ma imposta l'altezza della linea, tuttavia, in questo modo è più semplice descrivere il problema).

Consideriamo questo esempio marcatura:

<!DOCTYPE html> 
<html> 
    <head> 

    <style type="text/css"> 
    p 
     { 
     margin:0; 
     font-size: 13pt; 
     line-height: 15pt; 
     } 
    h1 
     { 
     margin:0; 
     font-size: 21pt; 
     line-height: 30pt; 
     } 
    </style> 

    </head> 
    <body> 

    <h1>Title</h1> 
    <p>Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s.</p> 
    <p>Many desktop publishing packages and web page editors now use Lorem Ipsum as their default model text, and a search for 'lorem ipsum' will uncover many web sites still in their infancy. Various versions have evolved over the years, sometimes by accident, sometimes on purpose (injected humour and the like).</p> 
    <p>It uses a dictionary of over 200 Latin words, combined with a handful of model sentence structures, to generate Lorem Ipsum which looks reasonable. The generated Lorem Ipsum is therefore always free from repetition, injected humour, or non-characteristic words etc.</p> 
    </body> 
</html> 

Se linea-altezza era uguale alla comprensione tradizionale di leader, allora la distanza tra <h1> e prima <p> sarebbe uguale alla distanza tra <p> 's, perché questa distanza è definito dal leader. Tuttavia, questo non è il caso.

Mentre rimane costante distanza tra <p> s (p's line-height - p's font-size = 15 - 13 = 2pt), la distanza tra la prima e <h1><p> è diverso: è uguale a (p's line-height - p's font-size)/2 + (h1's line-height - h1's font-size)/2 = (15 - 13)/2 + (30-21)/2 = 5.5pt.

Questo può essere facilmente notato a occhio nudo se il markup sopra viene elaborato con un browser.

Il problema è che il modo tradizionale di mantenere il ritmo visivo verticale su una pagina è impostare la conduzione di elementi in multipli di base di partenza. Questo metodo è inapplicabile nei CSS, come mostrato sopra.

ho 3 domande:

  1. è la mia comprensione della line-height, leader e le loro differenze sono corretti?
  2. C'è un modo per mantenere il ritmo verticale con i CSS (imitando i leader tradizionali con CSS o no)?
  3. (domanda bonus) Qual è stato il ragionamento alla base del fatto che l'altezza della linea è così diversa dalla guida?

AGGIORNAMENTO: grazie mille per il vostro contributo! Si prega di notare che ho suggerito la mia soluzione e sarei molto grato per qualsiasi commento su di essa: https://stackoverflow.com/a/8335230/710356

risposta

1

Va bene, questo sembra funzionare meglio di mia altra soluzione. Impiega ancora ulteriori <span> s all'interno di elementi di blocco. Il trucco consiste nell'impostare l'elemento di blocco line-height su 1 e regolare lo span line-height, ma anche annullarlo con l'alto e il basso margin s. Notare che ciò richiede che la visualizzazione sia impostata su inline-block.

Tuttavia, in realtà impostare i margini (in modo da effettuare un'interruzione di linea tra <h1> e <p>) diventa piuttosto difficile e richiede alcuni calcoli matematici. Quindi, immagino, provare a usare l'approccio tipografico tradizionale a condurre è troppo dispendioso in termini di tempo in CSS per essere effettivamente impiegato nel lavoro dello sviluppatore.

Comunque, ecco il codice finale:

<!DOCTYPE html> 
<html> 
    <head> 

     <style type="text/css"> 

     span.p 
      { 
      display:inline-block; 
      line-height: 32px; 
      } 

     span.h 
      { 
      display:inline-block; 
      line-height: 64px; 
      margin-top: -32px; 
      margin-bottom: -32px; 
      } 

     p 
      { 
      margin:0; 
      font-size: 26px; 
      line-height: 1; 
      } 
     h1 
      { 
      margin:0; 
      font-size: 42px; 
      line-height: 1; 
      } 
     </style> 

    </head> 
    <body> 

    <h1><span class="h">Molloy</span></h1> 
    <p><span class="p">Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s.</span></p> 
    <p><span class="p">Many desktop publishing packages and web page editors now use Lorem Ipsum as their default model text, and a search for 'lorem ipsum' will uncover many web sites still in their infancy. Various versions have evolved over the years, sometimes by accident, sometimes on purpose (injected humour and the like).</span></p> 
    <h1><span class="h">Lorem Ipsum is simply</span></h1> 
    </body> 
</html> 
5
  1. Sì. Non è molto semplice, ma utilizzando position:relative;, è possibile ottenere le cose per allineare correttamente, ad esempio:

    h2 { 
        font-size: 36px; 
        line-height: 48px; 
        position: relative; 
        top: 6px; 
    } 
    

    Qui è un work-in-progress demo

  2. Le persone che hanno progettato i CSS non sono tipografi. Probabilmente non era intenzionale.

  3. Risposta bonus: Here is a talk di Jonathan Hoefler sui problemi relativi alla progettazione del tipo per il Web e ai limiti del CSS.
+0

Grazie! Tuttavia, sembra che la demo a cui ti sei collegato sia un file gif vuoto. Inoltre, non vedo alcun valore negativo nel tuo codice. – sbichenko

+0

Spiacente, ho corretto il collegamento e ho ricordato che non ho usato valori negativi. :-) – bookcasey

+0

Non è necessario utilizzare il posizionamento per mantenere effettivamente il ritmo verticale. Può essere fatto assicurando un'altezza di riga coerente (relativa alla dimensione del carattere) e al margine inferiore. – joshnh

0

Aggiungo la mia risposta, ma non la contrassegno come "accettata", perché ho appena trovato questo metodo e non l'ho verificato abbastanza accuratamente. È anche abbastanza disordinato in termini di leggibilità del markup.

Il trucco è quello di avvolgere ogni elemento a cui vogliamo applicare la nostra rubrica in <span> tag, e impostare le proprietà CSS <span>'svertical-align a uno o middlesub (che producono risultati leggermente diversi, e non sono sicuro sia perché o come esattamente sono diversi) e line-height a 0. Il risultato è molto vicino a ciò che è necessario, quindi la distanza tra <h1> e <p> nell'esempio sopra diventa quasi corretta (non del tutto, apparentemente), vale a dire uguale all'altezza della linea <p>. Non sono molto bravo con i CSS, quindi non sono sicuro di come questo possa influenzare il layout generale, se sia accettabile l'utilizzo di tali hack e se questo fosse compatibile con i browser. Ti sarei grato se commentassi la mia soluzione.

Esempio di marcatura:

<!DOCTYPE html> 
<html> 
    <head> 

     <style type="text/css"> 

     span.lh 
      { 
      vertical-align: sub; 
      line-height:0 
      } 
     p 
      { 
      margin:0; 
      font-size: 26px; 
      line-height: 30px; 
      } 
     h1 
      { 
      margin:0; 
      font-size: 42px; 
      line-height: 60px; 
      } 
     </style> 

    </head> 
    <body> 

    <h1><span class="lh">Title</span></h1> 
    <p><span class="lh">Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s.</span></p> 
    <p><span class="lh">Many desktop publishing packages and web page editors now use Lorem Ipsum as their default model text, and a search for 'lorem ipsum' will uncover many web sites still in their infancy. Various versions have evolved over the years, sometimes by accident, sometimes on purpose (injected humour and the like).</span></p> 
    <h1><span class="lh">Lorem Ipsum is simply</span></h1> 
    </body> 
</html> 
+0

Lo svantaggio di questo è manutenibilità e semantica. Non sarebbe bello se il CSS ci offrisse altre opzioni! – joshnh

+0

Prova SASS o Compass – sarink

0

Mi rendo conto che questa discussione è vecchio, ma anche ho avuto questo problema. Se si desidera lo stesso effetto tipografico degli editor di documenti di testo, ad esempio Microsoft Word, esiste un caso speciale che coinvolge l'altezza della riga 1.

Anziché altezza riga: 1; metti altezza linea: normale ;. Gli altri valori di altezza della linea rimangono gli stessi (1,5 rimane di 1,5 ecc.).