2011-12-01 21 views
12

Specyfikacja CSS stwierdza, że ​​wysokość linii powinna być zastosowana do tekstu przez podzielenie określonej wartości przez dwa i zastosowanie wyniku powyżej i poniżej linii tekstu.Tradycyjna linia wiodąca i wysokość linii CSS

Różni się to znacznie od tradycyjnego rozumienia wiodącego, co zwykle oznacza, że ​​odstępy są "dodawane" tylko powyżej linii tekstu. (Wiem, że to nie jest w 100% poprawne, ponieważ faktycznie wysokość linii nie dodaje miejsca, ale ustawia wysokość linii, jednak w ten sposób prostsze jest opisanie problemu).

Rozważmy następujący przykład znaczników:

<!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> 

Jeśli line-height była równa tradycyjnego rozumienia prowadzącej, to odległość między <h1> i pierwszym <p> byłaby równa odległości między <p> „s, ponieważ tej odległości jest zdefiniowany przez prowadzącego. Tak jednak nie jest.

natomiast odstęp między <p> s pozostaje spójna (p's line-height - p's font-size = 15 - 13 = 2pt), odległość między <h1> i pierwszym <p> jest inna, jest to równoznaczne z (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.

Można to łatwo zauważyć gołym okiem, jeśli powyższy znacznik jest przetwarzany za pomocą przeglądarki.

Problem polega na tym, że tradycyjny sposób utrzymywania pionowego rytmu wizualnego na stronie polega na ustawianiu wiodących elementów w wielokrotnościach prowadzących. Ta metoda nie ma zastosowania w CSS, jak pokazano powyżej.

mam 3 pytania:

  1. Czy moje rozumienie line-height, prowadząc i ich różnice są prawidłowe?
  2. Czy istnieje sposób na utrzymanie rytmu pionowego za pomocą CSS (poprzez naśladowanie tradycyjnego prowadzenia z CSS czy nie)?
  3. (Pytanie dodatkowe) Jakie było uzasadnienie utworzenia linii o wysokości tak różnej od wiodącej?

AKTUALIZACJA: dziękuję bardzo za twój wkład! Należy pamiętać, że zaproponował własne rozwiązanie i byłbym bardzo wdzięczny za wszelkie komentarze na jej temat: https://stackoverflow.com/a/8335230/710356

Odpowiedz

1

porządku, to wydaje się działać lepiej niż inne moje rozwiązania. Nadal wykorzystuje dodatkowe wewnętrzne elementy blokowe <span>. Sztuczka polega na ustawieniu elementu blokowego na line-height na 1 i dopasowaniu zakresu line-height przęsła, przy jednoczesnym anulowaniu go z góry i dołu margin s. Zauważ, że wymaga to ustawienia wyświetlacza na inline-block.

Jednak ustawienie marginesów (tak, aby przerwa między wierszami między <h1> i <p>) staje się dość trudne i wymaga trochę matematyki. Sądzę więc, że próba zastosowania tradycyjnego podejścia typograficznego w prowadzeniu jest zbyt czasochłonna w CSS, aby faktycznie zostać wykorzystana w pracy programisty.

W każdym razie, oto ostateczny kod:

<!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. Tak
  2. Tak. Nie jest to bardzo proste, ale przy użyciu position:relative; można dostać rzeczy w kolejce poprawnie, na przykład:

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

    Oto work-in-progress demo

  3. Ludzie, którzy zaprojektowane CSS nie są typografowie. Prawdopodobnie nie było to zamierzone.

  4. Odpowiedź bonusowa: Here is a talk autorstwa Jonathana Hoeflera na temat problemów z projektowaniem typu dla sieci i ograniczeń CSS.
+0

Dzięki! Wygląda jednak na to, że wersja demo, z którą się łączysz, jest pustym plikiem gif. Ponadto nie widzę żadnych wartości ujemnych w kodzie. – sbichenko

+0

Przepraszam, poprawiłem link i zapamiętałem, że nie użyłem ujemnych wartości. :-) – bookcasey

+0

Nie musisz używać pozycjonowania, aby utrzymać pionowy rytm w rzeczywistości. Można tego dokonać, zapewniając spójną wysokość linii (w stosunku do rozmiaru czcionki) i dolny margines. – joshnh

0

Dodaję własną odpowiedź, ale nie oznaczam jej jako "zaakceptowaną", ponieważ właśnie wymyśliłem tę metodę i nie sprawdziłem jej wystarczająco dokładnie. Jest również dość niechlujny pod względem czytelności znaczników.

Sztuką jest owinąć każdy element, do którego chcemy zastosować nasz nagłówek w <span> tag i ustaw <span>'s właściwości CSS vertical-align do albo middle lub sub (wytwarzają one nieco inne wyniki, a nie jestem pewien, albo dlaczego lub jak dokładnie są one różne) i line-height do 0. Wynik jest bardzo zbliżony do tego, co jest potrzebne, więc odległość między <h1> i <p> w powyższym przykładzie staje się prawie prawidłowa (nie całkiem, podobno), to jest równa wysokości linii <p>. Nie jestem dobry z CSS, więc nie jestem pewny, jak to wpłynie na ogólny układ, czy jest on akceptowalny do używania takich hacków i czy byłby przyjazny dla wielu przeglądarek. Byłbym wdzięczny, gdybyś skomentował moje rozwiązanie.

Przykład znaczników:

<!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

Minusem tego jest łatwość konserwacji i semantyka. Czy nie byłoby miło, gdyby CSS zaoferował nam więcej opcji! – joshnh

+0

Wypróbuj SASS lub Compass – sarink

0

Zdaję sobie sprawę, ten wątek jest stary, ale ja też miałem ten problem. Jeśli chcesz uzyskać ten sam efekt typograficzny, co edytory dokumentów tekstowych, takie jak Microsoft Word, istnieje specjalny przypadek dotyczący wysokości linii 1.

Zamiast wysokości linii: 1; put line-height: normal ;. Pozostałe wartości wysokości linii pozostają takie same (1,5 pozostaje jako 1,5 itd.).