2012-04-13 22 views
26

Czy istnieje sposób na wymuszenie za pomocą CSS czcionki o stałej szerokości?Wymuszanie czcionki o stałej szerokości w stałej szerokości przy użyciu CSS

Mam na myśli to, że używając czcionki o stałej czcionce, możesz zmusić przeglądarkę do renderowania każdego znaku o stałej szerokości?

+0

Przeglądarka nie kontroluje tego, to wszystko o czcionce . Więc nie, to niemożliwe. Co jest złego w używaniu czcionki o stałej szerokości? –

+3

Musi pasować do reszty typografii. –

Odpowiedz

0

Nie, chyba że jest to faktyczna czcionka jednoprzestrzenna.

2

Nie, nie ma sposobu na wymuszenie czegokolwiek w CSS. I nie ma nawet sposobu, aby zasugerować, że czcionka o stałej szerokości jest renderowana jako czcionka o stałej szerokości.

10

Nie można tego zrobić z CSS. Nawet jeśli można, to wynik będzie wyglądać straszne:

enter image description here

Jeśli naprawdę trzeba to zrobić, można użyć JavaScript zawinąć każdy indywidualny charakter w elemencie (lub po prostu zrobić to ręcznie):

function wrap_letters($element) { 
 
    for (var i = 0; i < $element.childNodes.length; i++) { 
 
     var $child = $element.childNodes[i]; 
 

 
     if ($child.nodeType === Node.TEXT_NODE) { 
 
      var $wrapper = document.createDocumentFragment(); 
 

 
      for (var i = 0; i < $child.nodeValue.length; i++) { 
 
       var $char = document.createElement('span'); 
 
       $char.className = 'char'; 
 
       $char.textContent = $child.nodeValue.charAt(i); 
 

 
       $wrapper.appendChild($char); 
 
      } 
 

 
      $element.replaceChild($wrapper, $child); 
 
     } else if ($child.nodeType === Node.ELEMENT_NODE) { 
 
      wrap_letters($child); 
 
     } 
 
    } 
 
} 
 

 
wrap_letters(document.querySelectorAll('.boxes')[0]); 
 
wrap_letters(document.querySelectorAll('.boxes')[1]);
.char { 
 
    outline: 1px solid rgba(255, 0, 0, 0.5); 
 
} 
 

 
.monospace .char { 
 
    display: inline-block; 
 
    width: 15px; 
 
    text-align: center; 
 
}
<h2 class="boxes">This is a title</h2> 
 
<h2 class="boxes monospace">This is a title</h2>

+3

To naprawdę wygląda ohydnie. – thirtydot

+0

Imo wygląda lepiej z wyrównaniem tekstu: http://jsfiddle.net/f7TPf/3/, ale wciąż jest dość odrażający –

+1

@Blender, Generalnie masz rację, ale są jednak przypadki, w których czcionka o stałej szerokości faktycznie dodaje szerokość czcionki atrybuty takie jak pogrubienie kursywą, a to może być złe, jeśli * potrzebujesz * je do wyrównania. Lucida Console to jedna z takich czcionek. To sprawia, że ​​używanie IDE jest bezużyteczne, jeśli chcesz, aby podświetlanie składni korzystało z pogrubienia, ponieważ Lucida Console 12pt jest grubsza o 1 piksel, gdy jest pogrubiona. Sprawia, że ​​niemożliwe jest wyrównywanie kodu poprzez spacje (za początkowymi białymi znakami w linii). Jedno IDE, które znalazłem, było na tyle sprytne, że miało pole wyboru, które blokowało pogrubioną grubość. –

8

Dlaczego nie myśleć nieszablonowo i wewnątrz tabeli poniżej:

<table cellpadding="0" cellspacing="0"> 
<tr><td>T</td><td>h</td><td>e</td><td></td><td>r</td><td>a</td><td>i</td><td>n</td><td></td><td>i</td><td>n</td><td></td><td>S</td><td>p</td><td>a</td><td>i</td><td>n</td><td></td><td>s</td><td>t</td><td>a</td><td>y</td><td>s</td></tr> 
<tr><td>m</td><td>a</td><td>i</td><td>n</td><td>l</td><td>y</td><td></td><td>i</td><td>n</td><td></td><td>t</td><td>h</td><td>e</td><td></td><td>p</td><td>l</td><td>a</td><td>i</td><td>n</td><td>s</td><td>.</td></tr> 
</table> 
+39

To jeszcze bardziej "w pudełku" (przepraszam, musiałem to zrobić) –

+32

Myślę, że powinniśmy teraz przedstawić ten pomysł. –

+20

Nie wdawajmy się w temat o tym ... – DSimon

1

Zrobiłem verry ładna rzecz czasami odliczanie:

html:

<div class="counter"> 
    <span class="counter-digit counter-digit-0">2</span> 
    <span class="counter-digit counter-digit-1">4</span> 
    <span class="counter-digit counter-digit-divider">/</span> 
    <span class="counter-digit counter-digit-2">5</span> 
    <span class="counter-digit counter-digit-3">7</span> 
</div> 

SCSS:

$digit-width: 18px; 
.counter { 

    text-align: center; 
    font-size: $digit-width; 

    position: relative; 

    width : $digit-width * 4.5; 
    margin: 0 auto; 
    height: 48px; 
} 
.counter-digit { 

    position: absolute; 
    top: 0; 
    width: $digit-width; 
    height: 48px; 
    line-height: 48px; 
    padding: 0 1px; 

    &:nth-child(1) { left: 0; text-align: right; } 
    &:nth-child(2) { left: $digit-width * 1; text-align: left;} 
    &:nth-child(3) { left: $digit-width * 2; text-align: center; width: $digit-width/2} // the divider (/) 
    &:nth-child(4) { left: $digit-width * 2.5; text-align: right;} 
    &:nth-child(5) { left: $digit-width * 3.5; text-align: left;} 
} 
2

Cóż, nie mówią używając tylko CSS. Można to zrobić za pomocą niewielkiej ilości Javascriptu, aby zawinąć każdą literę w span. Reszta jest w CSS ...

window.onload = function() { 
 
    const secondP = document.getElementById('fixed'); 
 
    const text = secondP.innerText; 
 
    const newText = text.split('').map(c => { 
 
    const span = `<span>${c}</span>`; 
 
    return span; 
 
    }).join(''); 
 
    secondP.innerHTML = newText; 
 
}
p { 
 
    position: relative; 
 
    border: 1px solid black; 
 
    border-radius: 1em; 
 
    padding: 1em; 
 
    margin: 3em 1em; 
 
} 
 

 
p::after { 
 
    content: attr(name); 
 
    display: block; 
 
    background-color: white; 
 
    color: green; 
 
    padding: 0 0.5em; 
 
    position: absolute; 
 
    top: -0.6em; 
 
    left: 0.5em; 
 
} 
 

 
#fixed span { 
 
    display: inline-block; 
 
    width: 1em; 
 
    text-align: center; 
 
}
<p id="variable" name="Variable Width">It might not look nice, but with a little Javascript, I can force a variable width font to act like a fixed-width font.</p> 
 
<p id="fixed" name="Fixed Width">It might not look nice, but with a little Javascript, I can force a variable width font to act like a fixed-width font.</p>

W ustępie z zwykłego tekstu, to wygląda okropnie, ale Istnieją przypadki, kiedy to ma sens. Czcionki ikon i symbole Unicode mogą korzystać z tej techniki.

Znalazłem to pytanie, próbując znaleźć rozwiązanie dla symboli Unicode, które przesuwały zwykły tekst w prawo, gdy zostały zastąpione innymi symbolami Unicode.

+0

tak straszne i równoważny efekt wizualny podczas dzielenia ciągu za pomocą wyśrodkowanych komórek tabeli lub bloków inline lub javascript. Istnieją jednak typograficznie poprawne sposoby poprawy renderowania w kolumnach danych tabelarycznych, szczególnie w przypadku liczb (patrz poniżej: brak sztuczek HTML, brak javascripts, tylko jedna właściwość CSS do zdefiniowania, a także prawdopodobnie inna właściwość CSS do wyrównania kropek dla niecałkowitych liczby zmiennej precyzji i zasięgu) –

3

Jeśli jest to dla cyfr wyrównaniu na stołach gdzie niektóre czcionki (z tradycyjnej typografii) czynią je domyślnie o zmiennej szerokości (np Segoe UI w Windows), należy spojrzeć na właściwości CSS:

font-variant-numeric: tabular-nums;

(to wyłącza domyślną wartość proportional-nums dla wariantu z odstępami numerycznymi)

Nie wymaga się javascriptu!Jest to najczystszy sposób na wyłączenie glifów o zmiennej szerokości w tych czcionkach i zmuszenie ich do używania cyfr tabelarycznych (zazwyczaj używa się w tych samych glifach w tej samej czcionce, ale ich początkowa i końcowa luka jest zwiększona, więc 10 cyfr od 0 do 9 będzie renderować na tej samej szerokości, jednak niektóre czcionki mogą unikać odstępu interdigit ze zmiennymi wizualnymi i nieznacznie poszerzają niektóre cyfry lub mogą dodawać szeryfki dolne do stopy cyfry 1.

Należy zauważyć, że to nie wyłącza zmiennej wysokości obserwowano Segoe UI (takich jak niektóre cyfry będzie wysokość x jak tylko małymi literami, inni będą musieli wznoszącym lub zjazdowe). te tradycyjne formy cyfrowe mogą być wyłączone z CSS zbyt korzystając

font-variant-numeric: lining-nums;

(ta wyłącza domyślne "Oldstyle-Nums" value for wariancie numeryczny-cyfrowego)

Można połączyć oba:

font-variant-numeric: tabular-nums lining-nums;

+0

Nie wiedziałem o tej własności CSS, dziękuję. Niestety, Edge i IE nie obsługują tego. – Blender

Powiązane problemy