2011-01-28 8 views
11

Załóżmy, że tekst przedstawia się następująco na stronie HTML (tylko jedno słowo zbyt długi, aby zmieścić się na jednej linii):Jak mogę uniknąć jednego słowa na ostatnim wierszu z CSS?

Lorem ipsum dolores amet foo 
bar 

Jak można uniknąć z CSS, że ostatnie słowo w ostatnim wierszu i wymusić dwa (lub więcej)?

Lorem ipsum dolores amet 
foo bar 

Odpowiedz

19

Nie sądzę, że można to zrobić w czystym CSS.

Trzeba by albo umieścić non-breaking space w między ostatnimi dwoma słowami:

foo bar 

lub umieścić dwa ostatnie słowa na span:

<span style="white-space: nowrap">foo bar</span> 
+4

+1. Tego rodzaju rzeczy mogą być zautomatyzowane całkiem łatwo przy pomocy małego javascriptu. – keithjgrant

2

nie może być Sporządzono przy użyciu CSS, ale Shaun Inman napisał bardzo przydatny fragment Javascript, aby pomóc w tym jakiś czas temu:

http://www.shauninman.com/archive/2006/08/22/widont_wordpress_plugin

Jest to wtyczka do Wordpressa, ale w okolicy jest mnóstwo klonów innych niż Wordpress.

+0

Ten post Shaun pochodzi z 2006 roku, trochę stary, według mnie, na którym można polegać. – bart

+3

Wiek nie ma znaczenia - jest to bardzo prosty wzorzec Javascript, który działał, gdy został opracowany i działa do dnia dzisiejszego. –

+2

Nie rozumiem, dlaczego ta odpowiedź została odrzucona.Pomimo tego, że ma kilka lat, kod Shaun jest nadal bardzo istotny. Wydaje się trochę absurdalne, aby zignorować ważność czegoś tylko ze względu na jego wiek. –

3

prostu napisał tę zależność wolne JS fragment, który rozwiąże ten problem bardzo

https://github.com/ajkochanowicz/BuddySystem

Zasadniczo jest to kod źródłowy

var buddySystem=function(e){var n=[],r=[] 
n=e.length?e:n.concat(e),Array.prototype.map.call(n,function(e){var n=String(e.innerHTML) 
n=n.replace(/\s+/g," ").replace(/^\s|\s$/g,""),r.push(n?e.innerHTML=n.replace(new RegExp("((?:[^ ]*){"+((n.match(/\s/g)||0).length-1)+"}[^ ]*) "),"$1&nbsp;"):void 0)})} 

i można wdrożyć go, wykonując tę ​​

objs = document.getElementsByClassName('corrected'); 
buddySystem(objs); 

Teraz nigdy nie będziesz mieć sam dla każdego tagu z klasą corrected.

Możesz także użyć jQuery, jeśli chcesz.

$(".corrected").buddySystem()

sprawdzić link do wszystkich możliwości.

+0

Jak mogę to rozwiązanie zastąpić nie tylko ostatnią spację, ale wszystkie spacje między dwoma lub więcej ostatnimi słowami? – TheStoryCoder

+1

@TheStoryCoder Zamów moje rozwiązanie powyżej. Dodałem do niego link do JS Fiddle. – Jack

4

Nie sądzę, że można to zrobić tylko w CSS, ale właśnie to wymyśliłem, aby rozwiązać problem z jednym słowem w linii. Zastąpi on ostatnie n spacjami bez łamania dla wszystkich dopasowanych elementów.

https://jsfiddle.net/jackvial/19e3pm6e/2/

function noMoreLonelyWords(selector, numWords){ 

     // Get array of all the selected elements 
     var elems = document.querySelectorAll(selector); 
     var i; 
     for(i = 0; i < elems.length; ++i){ 

     // Split the text content of each element into an array 
     var textArray = elems[i].innerText.split(" "); 

     // Remove the last n words and join them with a none breaking space 
     var lastWords = textArray.splice(-numWords, numWords).join("&nbsp;"); 

     // Join it all back together and replace the existing 
     // text with the new text 
     var textMinusLastWords = textArray.join(" "); 
     elems[i].innerHTML = textMinusLastWords + " " + lastWords; 
     } 
    } 

    // Goodbye lonely words 
    noMoreLonelyWords("p", 3); 
1

Jeśli obsługa JavaScript jest opcją, można użyć typogr.js, a JavaScript "typogrify" realizacji. Ten konkretny filtr nosi nazwę Widont.

<script src="https://cdnjs.cloudflare.com/ajax/libs/typogr/0.6.7/typogr.min.js"></script> 
<script> 
document.body.innerHTML = typogr.widont(document.body.innerHTML); 
</script> 
</body> 
+0

Zastanawiam się, czy ma jakiś związek z wtyczką do WordPressa o tej samej nazwie. (Oba są słabo nazwane - te rzeczy * wcale nie są * wdowami.) – BoltClock

+0

Wygląda jak typogryzowanie, ponieważ cytuje implementację Shaun Inman jako oryginał, więc ... Chyba wiem, do kogo skierować palec. – BoltClock

Powiązane problemy