Zastanawiam się, czy na przykład istnieje sposób zliczania wierszy wewnątrz elementu div. Powiedzmy, że mamy taki div:
<div id="content">hello how are you?</div>
W zależności od wielu czynników element div może mieć jeden, dwa, a nawet cztery wiersze tekstu. Czy jest jakiś sposób, aby skrypt się dowiedział?
Innymi słowy, czy automatyczne przerwy są w ogóle reprezentowane w DOM?
javascript
html
dom
buti-oxa
źródło
źródło
line-height
(który nie jest jawnie ustawiony) byłoby użyciewindow.getComputedStyle(element, null).getPropertyValue('line-height')
Jednym z rozwiązań jest umieszczenie każdego słowa w tagu span za pomocą skryptu. Następnie, jeśli wymiar Y danego znacznika rozpiętego jest mniejszy niż wymiar jego bezpośredniego poprzednika, to nastąpiło przerwanie wiersza.
źródło
Sprawdź funkcję getClientRects (), której można użyć do zliczenia liczby wierszy w elemencie. Oto przykład, jak go używać.
Zwraca obiekt DOM javascript. Liczbę linii można poznać, wykonując następujące czynności:
Może zwrócić wysokość każdej linii i więcej. Zobacz pełną gamę rzeczy, które może zrobić, dodając to do skryptu, a następnie przeglądając dziennik konsoli.
Chociaż należy zwrócić uwagę na kilka rzeczy, to działa tylko wtedy, gdy element zawierający element jest wbudowany, jednak możesz otoczyć zawierający element wbudowany elementem blokowym, aby kontrolować szerokość w następujący sposób:
Chociaż nie polecam twardego kodowania stylu w ten sposób. To tylko przykładowe cele.
źródło
Nie byłem zadowolony z odpowiedzi tutaj i innych pytań. Najwyższą ocenę odpowiedź nie bierze
padding
lubborder
pod uwagę, a zatem oczywiście ignorujebox-sizing
również. Moja odpowiedź łączy kilka technik tutaj i na innych wątkach, aby uzyskać rozwiązanie, które działa w moim stopniu.To nie jest idealne: gdy nie można było uzyskać żadnej wartości liczbowej dla
line-height
(np.normal
Lubinherit
), używa po prostufont-size
pomnożenia przez1.2
. Być może ktoś inny może zasugerować niezawodny sposób wykrywania wartości piksela w takich przypadkach.Poza tym był w stanie poprawnie obsłużyć większość stylów i przypadków, które mu rzuciłem.
jsFiddle do zabawy i testowania. Również poniżej.
źródło
Sklonuj obiekt kontenera, napisz 2 litery i oblicz wysokość. Zwraca to rzeczywistą wysokość z zastosowanymi wszystkimi stylami, wysokością linii itp. Teraz oblicz wysokość obiektu / rozmiar litery. W Jquery wysokość przewyższa wypełnienie, margines i obramowanie, świetnie jest obliczyć rzeczywistą wysokość każdej linii:
Jeśli używasz rzadkiej czcionki o różnej wysokości każdej litery, to nie działa. Ale działa ze wszystkimi zwykłymi czcionkami, takimi jak Arial, mono, komiks, Verdana itp. Przetestuj swoją czcionkę.
Przykład:
Wynik:
6 Lines
Działa we wszystkich przeglądarkach bez rzadkich funkcji poza standardami.
Sprawdź: https://jsfiddle.net/gzceamtr/
źródło
clone
→cloneNode
,hide
→style.visibility = "hidden"
,html('a<br>b')
→textContent='a\r\nb'
,appendTo('body')
→document.documentElement.appendChild
,height()
→getBoundingClientRect().height
Dla tych, którzy używają jQuery http://jsfiddle.net/EppA2/3/
źródło
$(selector).css('line-height');
, nie otrzymasz liczby z tej funkcji.Jestem przekonany, że teraz jest to niemożliwe. Tak było.
Implementacja getClientRects w IE7 zrobiła dokładnie to, czego chcę. Otwórz tę stronę w IE8, spróbuj ją odświeżyć, zmieniając szerokość okna i zobacz, jak odpowiednio zmienia się liczba wierszy w pierwszym elemencie. Oto kluczowe wiersze kodu JavaScript z tej strony:
Niestety dla mnie Firefox zawsze zwraca jeden prostokąt klienta na element, a IE8 robi to samo teraz. (Strona Martina Honnena działa dzisiaj, ponieważ IE renderuje ją w widoku zgodnym z IE; naciśnij F12 w IE8, aby grać w różnych trybach.)
To jest smutne. Wygląda na to, że po raz kolejny dosłowna, ale bezwartościowa implementacja specyfikacji Firefoksa wygrała z użyteczną wersją Microsoftu. A może brakuje mi sytuacji, w której nowy getClientRects może pomóc deweloperowi?
źródło
w oparciu o odpowiedź GuyPaddock z góry wydaje mi się, że to działa
sztuczka polega na tym, aby zwiększyć wysokość linii tak bardzo, że „połknie” wszelkie różnice w przeglądarce / systemie operacyjnym w sposobie renderowania czcionek
Sprawdziłem to z różnymi stylami i różnymi rozmiarami / rodzinami czcionek, jedyne, czego nie bierze pod uwagę (bo w moim przypadku nie miało to znaczenia), to dopełnienie - które można łatwo dodać do rozwiązania.
źródło
Nie, nie niezawodnie. Po prostu jest zbyt wiele nieznanych zmiennych
I tak dalej. Mam nadzieję, że pewnego dnia pojawi się taka metoda niezawodnego wykonania tego za pomocą JavaScript, ale do tego dnia masz pecha.
Nienawidzę tego typu odpowiedzi i mam nadzieję, że ktoś może mi udowodnić, że się mylę.
źródło
Powinieneś być w stanie podzielić ('\ n'). Długość i uzyskać podziały linii.
aktualizacja: to działa na FF / Chrome, ale nie na IE.
źródło
getClientRects
zwrócić prostokąty, klientów jak to i jeśli chcesz uzyskać linie, należy użyć funkcji follow jak toźródło
Znalazłem sposób na obliczenie numeru linii, kiedy tworzyłem edytor HTML. Podstawowa metoda jest taka:
W IE możesz wywołać getBoundingClientRects, zwraca on każdą linię jako prostokąt
W webkicie lub nowym standardowym silniku html zwraca on prostokąty klienta każdego elementu lub węzła, w tym przypadku możesz porównać każdy prostokąt, to znaczy każdy musi być największy, więc możesz zignorować te prostokąty, których wysokość jest mniejsza (jeśli góra prostokąta jest mniejsza od niego, a dół jest większy od niego, warunek jest prawdziwy).
zobaczmy więc wynik testu:
Zielony prostokąt to największy prostokąt w każdym rzędzie
Granicą zaznaczenia jest czerwony prostokąt
Niebieski prostokąt jest granicą od początku do zaznaczenia po rozwinięciu, widzimy, że może być większy niż czerwony prostokąt, więc musimy sprawdzić dół każdego prostokąta, aby ograniczyć go do dołu czerwonego prostokąta.
źródło
Wypróbuj to rozwiązanie:
Możesz zobaczyć to w akcji tutaj: https://jsfiddle.net/u0r6avnt/
Spróbuj zmienić rozmiar paneli na stronie (aby poszerzyć lub skrócić prawą stronę strony), a następnie uruchom go ponownie, aby zobaczyć, czy może wiarygodnie określić liczbę linii.
Ten problem jest trudniejszy, niż się wydaje, ale większość trudności pochodzi z dwóch źródeł:
Renderowanie tekstu jest zbyt niskie w przeglądarkach, aby można było o niego bezpośrednio zapytać z JavaScript. Nawet pseudoselektor CSS :: first-line nie zachowuje się tak, jak inne selektory (nie można go odwrócić, na przykład, aby zastosować styl do wszystkich linii oprócz pierwszej).
Kontekst odgrywa dużą rolę w obliczaniu liczby wierszy. Na przykład, jeśli wysokość linii nie została jawnie ustawiona w hierarchii elementu docelowego, możesz otrzymać „normalną” z powrotem jako wysokość linii. Ponadto element może być używany,
box-sizing: border-box
a zatem podlegać wypełnieniu.Moje podejście minimalizuje # 2 poprzez bezpośrednie przejęcie kontroli nad wysokością linii i uwzględnienie metody wymiarowania pudełka, co prowadzi do bardziej deterministycznego wyniku.
źródło
W niektórych przypadkach, na przykład w przypadku łącza obejmującego wiele wierszy w tekście nie wyjustowanym, można uzyskać liczbę wierszy i każdą współrzędną każdego wiersza, używając tego:
https://developer.mozilla.org/en-US/docs/Web/API/Element/getClientRects
To działa, ponieważ każda linia byłaby inna, nawet tak nieznacznie. Dopóki są, są rysowane przez mechanizm renderujący jako inny „prostokąt”.
źródło
Zgodnie z sugestią @BobBrunius 2010 stworzyłem to za pomocą jQuery. Bez wątpienia można to poprawić, ale może niektórym pomóc.
źródło
Możesz porównać wysokość elementu i wysokość elementu za pomocą
line-height: 0
źródło