Określ szerokość w * znakach *


108

Korzystając z czcionki o stałej szerokości , chciałbym określić szerokość elementu HTML w znakach .

Jednostka "em" ma być szerokością znaku M, więc powinienem móc jej użyć do określenia szerokości. To jest przykład:

<html>
  <head>
    <style>
      div {
        font-family: Courier;
        width: 10em;
      }
    </style>
  </head>
  <body>
    <div>
      1 3 5 7 9 1 3 5 7 9 1
    </div>
  </body>
</html>

Wynik nie jest tym, czego chciałem, ponieważ wiersz przeglądarki pęka po kolumnie 15, a nie 10:

1 3 5 7 9 1 3 5
7 9 1

(Wynik w Firefoksie i Chromium, oba w Ubuntu.)

Artykuł Wikipedii mówi, że „em” nie zawsze ma szerokość M, więc zdecydowanie wygląda na to, że jednostce „em” nie można ufać.


Uważam, że „en” jest również legalną szerokością; jest to szerokość cyfry w typografii. To może działać lepiej dla Ciebie.
Pete Wilson

6
Właściwość „em” używa rozmiaru lub wysokości czcionki, a nie szerokości liter. @Pete: Nie, zobacz wartości i jednostki CSS poziom 3 .
animuson

O ile nie używasz czcionki o stałej szerokości, różne znaki mają różne szerokości. Dlatego funkcjonalnie niemożliwe jest ustawienie szerokości pod względem liczby wyświetlanych znaków.
Emily


„To pytanie nadal wymaga 4 głosów od innych użytkowników na zamknięcie” - Hej, to moje pytanie! Pozwól mi to zamknąć!
Martin Vilcans,

Odpowiedzi:


23

1em to wysokość litery M, a nie szerokość. To samo dotyczy ex, czyli wysokości x. Mówiąc bardziej ogólnie, są to wysokości wielkich i małych liter.

Szerokość to zupełnie inna kwestia ....

Zmień powyższy przykład na

<div>
    <span>1</span> 3 5 7 9 1 3 5 7 9 1
</div>

a zauważysz, że szerokość i wysokość przęsła są różne. W przypadku czcionki o rozmiarze 20 pikseli w przeglądarce Chrome rozpiętość wynosi 12 x 22 piksele, gdzie 20 pikseli to wysokość czcionki, a 2 piksele to wysokość linii.

Ponieważ em i ex nie są tutaj przydatne, możliwą strategią dla rozwiązania opartego tylko na CSS byłoby

  1. Utwórz element zawierający tylko & nbsp;
  2. Niech sam się dostosuje
  3. Umieść swój element DIV wewnątrz i
  4. Spraw, aby był 10 razy większy niż otaczający element.

Jednak nie udało mi się tego zakodować. Wątpię też, żeby to naprawdę było możliwe.

Ta sama logika mogłaby jednak zostać zaimplementowana w Javascript. Używam tutaj wszechobecnego jQuery:

<html>
  <head>
    <style>
      body { font-size: 20px; font-family: Monospace; }
    </style>
    <script 
      type="text/javascript" 
      src ="https://ajax.googleapis.com/ajax/libs/jquery/1.7.0/jquery.min.js">
    </script>
  </head>
  <body>
    <div>1 3 5 7 9 1 3 5 7 9 1</div>
    <script>
      $('body').append('<div id="testwidth"><span>&nbsp;</span></div>');
      var w = $('#testwidth span').width();
      $('#testwidth').remove();
      $('div').css('width', (w * 10 + 1) + 'px');       
    </script>
  </body>
</html> 

+1 w (w * 10 + 1) służy do rozwiązywania problemów z zaokrąglaniem.


1
Liczyłem na czyste rozwiązanie CSS, które jest możliwe tylko wtedy, gdy znasz stosunek wysokości do szerokości znaku (patrz stackoverflow.com/questions/1255281/ ... ). Przyjmuję to jako odpowiedź, ponieważ wydaje się, że jest to solidne rozwiązanie.
Martin Vilcans,

1em nie jest wysokością M zgodnie z odpowiedziami tutaj graphicdesign.stackexchange.com/questions/4035/ ... znak powinien być bliżej 1em.
Sogartar

1
Sogartar, dla wyjaśnienia: we właściwej typografii 1 em jest rzeczywiście szerokością (jak również wysokością em) znaku o stałej szerokości. Jednak to jest „właściwa typografia” i mamy wielu ludzi, którzy latają nocą, tworząc pliki czcionek, które nie są zgodne z regułami typograficznymi - szczególnie w przypadku czcionek internetowych. Celem mojego komentarza nie jest (tylko) zrzędliwa duma. Chodzi mi o to: test, test, test. (A potem przetestuj jeszcze trochę.)
Parapluie

219

ch jednostka

Jednostka, której szukasz, to ch. Według dokumentów MDN :

ch: Reprezentuje szerokość, a dokładniej miarę zaawansowania, glifu „0” (zero, znak Unicode U + 0030) w elemencie font.

Jest obsługiwany w aktualnych wersjach głównych przeglądarek ( caniuse ).

Przykład

pre {
    width: 80ch; /* classic terminal width for code sections */
}

3
Istnieje również przestrzeń cyfrowa, która jest dokładnie „równa szerokości jednej cyfry”, jak opisano w artykule Wikipedii dotyczącym przestrzeni (interpunkcja) . Jego wartość Unicode to U + 2007 i można ją wprowadzić w HTML za pomocą &#x2007;lub &#8199;. Jest funkcjonalnie równoważny z chjednostką CSS, ale chociaż nie jest szeroko obsługiwany, może być używany jako obejście w HTML (brzydki hack, ale powinien działać).
waldyrious

2
Właściwie, zgodnie z tym problemem dotyczącym chromu , Chrome obsługuje go od wersji 27, więc w tej chwili najnowsze wersje wszystkich głównych przeglądarek (IE, Chrome i Firefox) obsługują jednostkę ch :)
waldyrious

2
Należy zwrócić uwagę, że rozmiar znaku to rozmiar glifu „0” w czcionce elementu. Jeśli oczekują większych znaków takich jak „m” lub „W” może warto rozważyć rozszerzenie lub posiadające odpowiednio go rozszerzać w miarę potrzeb (np stackoverflow.com/questions/7168727/... )
user420667

1
Tak, żadnych problemów z czcionkami o stałej szerokości.
Willege

2
IE11 obsługuje to źle. stackoverflow.com/questions/17825638/…
aleha
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.