Zrobiłem zdjęcie na to pytanie, aby było łatwiejsze do zrozumienia.
Czy można utworzyć wielokropek o <div>
stałej szerokości i wielu liniach?
Wypróbowałem kilka wtyczek jQuery tu i tam, ale nie mogę znaleźć tego, którego szukam. Jakieś rekomendacje? Pomysły?
javascript
jquery
html
css
Edward
źródło
źródło
Odpowiedzi:
Tylko krótki podstawowy pomysł.
Testowałem z następującymi znacznikami:
I CSS:
Zastosowanie tego jQuery przyniesie pożądany rezultat:
Wielokrotnie próbuje usunąć ostatnie słowo z tekstu, aż osiągnie żądany rozmiar. Z powodu przepełnienia: ukryty; proces pozostaje niewidoczny i nawet przy wyłączonym JS wynik pozostaje „wizualnie poprawny” (oczywiście bez „…”).
Jeśli połączysz to z rozsądnym obcięciem po stronie serwera (co pozostawi tylko niewielki narzut), to będzie działać szybciej :).
Ponownie, nie jest to kompletne rozwiązanie, tylko pomysł.
AKTUALIZACJA: Dodano demo jsFiddle .
źródło
li
a wewnątrz każdego z nich jest.block
i a.block h2
i muszę zastosować to doh2
środka,.block
ale nie mogłem zmusić go do pracy. Czy jest inaczej, jeśli jest ich więcej niż jeden.block h2
?height*3
o kilka pikseli. Łatwym rozwiązaniem jest po prostu dodanie kilku pikseli dodivh
while
wierszu:if(!$p.text().match(/\W*\s(\S)*$/)) break;
while ((upper-lower)>1) {let middle=((lower+upper)/2)|0 /*|0 is quick floor*/; if (test(words.slice(0,middle)+'...')) {lower=middle;} else {upper=middle;}}
. Jak znalazł @KrisWebDev, będziesz chciał również sprawdzić jedno wielkie słowo.Wypróbuj wtyczkę jQuery.dotdotdot .
źródło
Biblioteki JavaScript do „blokowania linii”
Zwróć uwagę, że „zaciskanie linii” jest również określane jako „elipsa na bloku wielu linii” lub „pionowa elipsa”.
github.com/BeSite/jQuery.dotdotdot
github.com/josephschmitt/Clamp.js
Oto kilka innych, których jeszcze nie zbadałem:
Rozwiązania CSS do mocowania przewodów
Istnieje kilka rozwiązań CSS, ale najprostsze zastosowania,
-webkit-line-clamp
które mają słabą obsługę przeglądarki . Zobacz demo na żywo na jsfiddle.net/AdrienBe/jthu55v7/Wiele osób dołożyło wszelkich starań, aby to się stało, używając tylko CSS. Zobacz artykuły i pytania na ten temat:
Co bym polecił
Nie komplikuj. Jeśli nie masz dużo czasu, aby poświęcić się tej funkcji, wybierz najprostsze i przetestowane rozwiązanie: prosty CSS lub dobrze przetestowaną bibliotekę javascript.
Wybierz coś wymyślnego / złożonego / wysoce spersonalizowanego, a zapłacisz za to cenę w przyszłości.
Co robią inni
Zanikanie, tak jak robi to Airbnb, może być dobrym rozwiązaniem. Prawdopodobnie jest to podstawowy CSS połączony z podstawowym jQuery. Właściwie wydaje się bardzo podobny do tego rozwiązania w CSSTricks
Aha, a jeśli szukasz inspiracji projektowych:
źródło
W HTML nie ma takiej funkcji i jest to bardzo frustrujące.
Opracowałem bibliotekę, aby sobie z tym poradzić.
Sprawdź moją witrynę, aby znaleźć zrzut ekranu, samouczek i łącze do pobrania.
źródło
Czyste rozwiązanie JS oparte na rozwiązaniu bažmegakapy i pewne porządki uwzględniające ludzi, którzy próbują podać wysokość / maksymalną wysokość mniejszą niż linia elementu Wysokość:
źródło
Mam rozwiązanie, które działa dobrze, ale zamiast wielokropka używa gradientu. Zaletą jest to, że nie musisz wykonywać żadnych obliczeń JavaScript i działa to w przypadku kontenerów o zmiennej szerokości, w tym komórek tabel. Używa kilku dodatkowych elementów div, ale jest bardzo łatwy do zaimplementowania.
http://salzerdesign.com/blog/?p=453
Edycja: Przepraszamy, nie wiedziałem, że link nie wystarczy. Rozwiązaniem jest umieszczenie elementu DIV wokół tekstu i nadanie mu stylu, aby kontrolować przepełnienie. Wewnątrz elementu div umieść kolejny element div z gradientem „zanikania”, który można utworzyć za pomocą CSS lub obrazu (dla starego IE). Gradient przechodzi od koloru przezroczystego do koloru tła komórki tabeli i jest nieco szerszy niż wielokropek. Jeśli tekst jest długi i przepełniony, przechodzi pod element div „fade” i wygląda na „wyblakły”. Jeśli tekst jest krótki, zanikanie jest niewidoczne, więc nie ma problemu. Oba kontenery można dostosować, aby wyświetlać jeden lub wiele wierszy, ustawiając wysokość kontenera jako wielokrotność wysokości wiersza tekstu. Element div „fade” można ustawić tak, aby obejmował tylko ostatnią linię.
źródło
Oto prosty sposób CSS, aby to osiągnąć: http://www.mobify.com/blog/multiline-ellipsis-in-pure-css/
Oto podsumowanie:
źródło
Możesz używać
-webkit-line-clamp
property zdiv
.-webkit-line-clamp: <integer>
co oznacza ustawienie maksymalnej liczby wierszy przed obcięciem zawartości, a następnie wyświetlenie wielokropka(…)
na końcu ostatniej linii.źródło
Oto proste rozwiązanie JavaScript, którego możesz użyć w mgnieniu oka:
Możesz się nim bawić w polu kodowym poniżej. Spróbuj zmienić rozmiar czcionki w panelu CSS i dokonaj niewielkiej zmiany w panelu HTML (np. Dodaj gdzieś dodatkową spację), aby zaktualizować wyniki. Niezależnie od rozmiaru czcionki, środkowy akapit powinien być zawsze obcinany do liczby wierszy w drugim parametrze przekazanym do limitLines ().
Codepen: http://codepen.io/thdoan/pen/BoXbEK
źródło
EDYCJA: Przeszedł przez Shave, który jest wtyczką JS, która naprawdę dobrze wykonuje wielowierszowe obcinanie tekstu na podstawie podanej maksymalnej wysokości. Używa wyszukiwania binarnego, aby znaleźć optymalny punkt przerwania. Zdecydowanie warte zbadania.
ORYGINALNA ODPOWIEDŹ:
Musiałem wymyślić waniliowe rozwiązanie JS dla tego problemu. W przypadku, nad którym pracowałem, musiałem dopasować długą nazwę produktu do ograniczonej szerokości i ponad dwiema liniami; w razie potrzeby obcinane wielokropkiem.
Użyłem odpowiedzi z różnych postów SO, aby ugotować coś, co pasowało do moich potrzeb. Strategia jest następująca:
Przykład kodu:
PS:
PPS: Właśnie zdałem sobie sprawę, że jest to bardzo podobne do podejścia sugerowanego przez @DanMan i @ st.never. Sprawdź fragmenty kodu, aby zapoznać się z przykładem implementacji.
źródło
Bardzo proste rozwiązanie javascript. Elementy Div muszą być stylizowane np .:
I JS:
źródło
Nie jest to dokładna odpowiedź na pytanie, ale natknąłem się na tę stronę, próbując zrobić coś bardzo podobnego, ale chcąc dodać link do „zobacz więcej”, a nie tylko prostą wielokropek. To jest funkcja jQuery, która doda link „więcej” do tekstu, który przepełnia kontener. Osobiście używam tego z Bootstrapem, ale oczywiście będzie działać bez.
Aby użyć, umieść tekst w kontenerze w następujący sposób:
Po dodaniu poniższej funkcji jQuery wszystkie elementy div, które są większe niż wartość Adjustheight, zostaną obcięte i dodane zostanie łącze „Więcej”.
Na tej podstawie, ale zaktualizowane: http://shakenandstirredweb.com/240/jquery-moreless-text
źródło
Wspomniana wtyczka dotdotdot jQuery działa dobrze z angular :
Odpowiedni znacznik wyglądałby tak:
źródło
Demo czystego JS (bez jQuery i pętli 'while')
Kiedy szukałem rozwiązania problemu wielowierszowego wielokropka, zdziwiłem się, że nie ma dobrego bez jQuery. Istnieje również kilka rozwiązań opartych na pętli „while”, ale myślę, że nie są one skuteczne i niebezpieczne ze względu na możliwość wpadnięcia w nieskończoną pętlę. Więc napisałem ten kod:
źródło
Może dość późno, ale używając SCSS możesz zadeklarować taką funkcję jak:
I używaj go jak:
Który obetnie tekst do jednej linii i wiedząc, że ma 1,4 jego wysokości. Oczekiwany wynik to chrome do renderowania
...
na końcu i FF z pewnym chłodnym zanikaniem na końcuFirefox
Chrom
źródło
W odpowiedzi Adrien Be znalazłem to krótkie rozwiązanie zawierające tylko CSS :
Od marca 2020 r. Obsługa przeglądarek wynosi 95,3% i nie jest obsługiwana w IE i Opera Mini. Działa na Chrome, Safari, Firefox i Edge.
źródło
Prawdopodobnie nie możesz tego zrobić (obecnie?) Bez czcionki o stałej szerokości, takiej jak Courier. W przypadku czcionki o stałej szerokości każda litera zajmuje tę samą przestrzeń w poziomie, więc prawdopodobnie można policzyć litery i pomnożyć wynik przez bieżący rozmiar czcionki w ems lub exs. Następnie wystarczyłoby sprawdzić, ile liter mieści się w jednym wierszu, a następnie podzielić.
Alternatywnie, w przypadku czcionek bez stałej liczby znaków, możesz utworzyć mapowanie dla wszystkich możliwych znaków (np. I = 2px, m = 5px), a następnie wykonać obliczenia. Ale dużo brzydkiej pracy.
źródło
Aby rozwinąć rozwiązanie @ DanMan: w przypadku, gdy używane są czcionki o zmiennej szerokości, można użyć średniej szerokości czcionki. Wiąże się to z dwoma problemami: 1) tekst ze zbyt wieloma literami W byłby przepełniony, a 2) tekst ze zbyt dużą liczbą znaków I zostałby wcześniej obcięty.
Możesz też przyjąć najgorsze podejście i użyć szerokości litery „W” (która moim zdaniem jest najszersza). To usuwa problem 1 powyżej, ale nasila problem 2.
Innym podejściem mogłoby być: pozostawienie
overflow: clip
w div i dodanie sekcji wielokropka (może innego div lub obraz) zfloat: right; position: relative; bottom: 0px;
(niesprawdzone). Sztuczka polega na tym, aby obraz pojawił się nad końcem tekstu.Możesz również wyświetlić obraz tylko wtedy, gdy wiesz, że będzie przepełniony (powiedzmy po około 100 znakach)
źródło
overflow: clip
? A czego można się spodziewać po tym CSSfloat
?W przypadku tego kodu nie ma potrzeby stosowania dodatkowego opakowującego elementu div, jeśli element ma wysokość ograniczoną stylem max-height.
Zapisuje również oryginalny tekst w atrybucie danych, który może być wyświetlany przy użyciu tylko stylów, np. po najechaniu myszą:
źródło
W moim scenariuszu nie mogłem uruchomić żadnej z wyżej wymienionych funkcji, a także musiałem powiedzieć funkcji, ile wierszy ma pokazać, niezależnie od rozmiaru czcionki lub rozmiaru kontenera.
Oparłem rozwiązanie na wykorzystaniu Canvas.measureText metody (whic stanowi HTML5 funkcja) jak wyjaśniono tutaj przez Domi , więc nie jest całkowicie cross-browser.
Możesz zobaczyć, jak to działa na tych skrzypcach .
To jest kod:
A kod HTML do użycia wyglądałby tak:
Kod do uzyskania rodziny czcionek jest dość prosty iw moim przypadku działa, ale w przypadku bardziej złożonych scenariuszy może być konieczne użycie czegoś podobnego do tych linii .
Również w moim przypadku mówię funkcji, ile wierszy ma użyć, ale możesz obliczyć, ile wierszy ma zostać wyświetlonych zgodnie z rozmiarem kontenera i czcionką.
źródło
Stworzyłem wersję, która pozostawia nienaruszony kod HTML. przykład jsfiddle
jQuery
CSS
przykład jsfiddle
źródło
Napisałem komponent kątowy, który rozwiązuje problem. Dzieli dany tekst na elementy span. Po wyrenderowaniu usuwa wszystkie przepełnione elementy i umieszcza elipsę zaraz po ostatnim widocznym elemencie.
Przykład użycia:
Demo Stackblitz: https://stackblitz.com/edit/angular-wfdqtd
Składnik:
źródło
Tutaj zrobiłem kolejną bibliotekę z szybszym algorytmem. Proszę sprawdzić:
https://github.com/i-ahmed-biz/fast-ellipsis
Aby zainstalować za pomocą altany:
Aby zainstalować za pomocą npm:
Mam nadzieję, że ci się podoba!
źródło
Nie jesteś pewien, czy tego właśnie szukasz, używa minimalnej wysokości zamiast wysokości.
źródło
Wystarczy bardzo prosta funkcja.
Dyrektywa:
Widok:
źródło
iiiiiiiiii
vsMMMMMMMMMM
(chociaż obecna czcionka nie jest tak widoczna: D).