Ustawienie maksymalnej długości znaków w CSS

181

Tworzę responsywną stronę internetową dla szkoły, a moje pytanie brzmi:

Jak ustawić maksymalną długość znaków zdań (z CSS) na mojej stronie (np. 75 znaków), że gdy mam bardzo duży ekran, zdania nie będą przekraczać 75 znaków.

Próbowałem maksymalnej szerokości, ale to popsuło mój układ. Korzystam z Flexboksa i zapytań o media, aby reagować.

Sharif1111
źródło
1
Jeśli używasz textarealub inputistnieje dla nich maksymalna długość ( maxlength="50"jest to w HTML) właściwość lub będziesz musiał użyć Javascript. Myślę też, że źle to odczytałem, ustawienie szerokości spowoduje, że zdanie spadnie do następnego wiersza, gdy dotrze do końca. To jest zachowanie domyślne.
Rumiany
2
Spójrz na to: stackoverflow.com/questions/20552957/… - to elipsa CSS, może ci pomóc
Darren Sweeney,
Chociaż nie możesz użyć do tego samego CSS, możesz ograniczyć liczbę znaków wyświetlanych za pomocą CSS, jak sugerował Darren. Musisz ustawić kontener tekstu na spację: bez zawijania, przepełnienie tekstu: elipsa i przepełnienie: ukryte. Następnie po prostu ustaw rozmiar swojego pojemnika.
Patrick Lyver,
1
Co masz na myśli, ustalając taki limit? Co powinno się stać, gdy zostanie przekroczone? Co rozumiesz przez „zdanie”? To nie jest koncepcja CSS. Jak zamierzasz rozpoznawać lub oznaczać zdania? Czy rzeczywiście masz na myśli długość linii ? Jeśli tak, to z czym masz problem? Zwykle tekst jest zawijany automatycznie, chyba że wykonasz specjalne czynności, aby temu zapobiec.
Jukka K. Korpela,

Odpowiedzi:

254

Zawsze możesz użyć metody obcinania, ustawiając max-widthi przepełnienie w ellipsisten sposób

p {
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
  max-width: 200px;
}

Przykład: http://jsfiddle.net/3czeyznf/

W przypadku obcinania wielu linii spójrz na flexrozwiązanie. Przykład z obcięciem w 3 rzędach.

p {
  overflow: hidden;
  display: -webkit-box;
  -webkit-line-clamp: 3;
  -webkit-box-orient: vertical;
}

Przykład: https://codepen.io/srekoble/pen/EgmyxV

Vangel Tzo
źródło
1
Dzięki, rozumiem użycie elipsy, ale nie rozumiem, jak to rozwiązuje mój problem. Myślę, że elipsa jest odpowiednia, gdy ekran się zmniejsza, ale gdy staje się większy, chcę go odciąć przy 75 znakach. więc jak pisze @ Jean-luc, jest to możliwe tylko z javascript? przepraszam, jestem nowy w kodowaniu
Sharif1111,
Możesz zobaczyć, jakie miejsce ma 75 znaków, zgodnie z typografią i ustawić maksymalną szerokość zgodnie z tym. Niestety nie można ustawić właściwości CSS, aby skracać zdanie według znaków. Alternatywnie można użyć metody przycinania elastycznego z tą korzyścią, że można określić metodę przycinania według wierszy.
Vangel Tzo,
1
Wpływa to na szerokość akapitu, a nie na długość zdania. A 200px może być po prostu wszystkim pod względem znaków (to nawet zależy od tego, czy masz dużo I, czy dużo W, a także od czcionki i rozmiaru czcionki).
Jukka K. Korpela
Masz rację co do tego. Sprawdź, czy odpowiedź Pauliego wydaje się być odpowiednia dla twojego rozwiązania
Vangel Tzo,
@VangelTzo To jest tylko dla jednej linii. Czy można to zrobić dla wielu linii? Dzięki
Biswas,
108

Istnieje „wartość długości” CSS wynosząca ch.

Z MDN

Ta jednostka reprezentuje szerokość, a ściślej miarę wyprzedzenia, glifu „0” (zero, znak Unicode U + 0030) w czcionce elementu.

Może to przybliżać to, czego szukasz.

p {
  overflow: hidden;
  max-width: 75ch;
}
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Deserunt rem odit quis quaerat. In dolorem praesentium velit ea esse consequuntur cum fugit sequi voluptas ut possimus voluptatibus deserunt nisi eveniet!Lorem ipsum dolor sit amet, consectetur
  adipisicing elit. Dolorem voluptates vel dolorum autem ex repudiandae iste quasi. Minima explicabo qui necessitatibus porro nihil aliquid deleniti ullam repudiandae dolores corrupti eaque.</p>

Paulie_D
źródło
2
Czy zostało to zaimplementowane przez jakieś przeglądarki? Wydaje mi się, że w ogóle nie działa. Edycja: Nadal szkic dev.w3.org/csswg/css-values/#lengths
Turnip,
Myślę, że pójdę z twoją odpowiedzią, myślę, że byłoby tak samo, gdybym ustawił maksymalną szerokość: 30em; Jest dla mnie wystarczająco blisko. Dzięki!
Sharif1111,
Nie jestem pewien co do tabel zgodności w MDN ... ale to ( churządzenie) wydaje się nie działać (zgodnie z oczekiwaniami) w Chrome 50, IE11 lub FF45 ?!
MrWhite
Tak, mam taki sam wynik jak @ w3dk. Właśnie ustawiłem heighta overflow:hidden. Elipsa mi się podobała, ale udało mi się ją uruchomić tylko wtedy, gdy ustawię white-space:no-wrap. W moim przypadku tekst może się zawijać, po prostu nie może przekraczać określonego limitu znaków w kontenerze.
Chris22
1
Nie jestem pewien, dlaczego ma tak wiele głosów, ponieważ jest wyraźnie niekompletny i nie działa z dostarczonym kodem. Musisz dodaćwhite-space: nowrap;
Kevin M
47

Wypróbuj to w celu obcięcia znaków po ustawieniu go na maksymalną szerokość. W tym przypadku użyłem 75 kanałów

p {
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
    max-width: 75ch;
}
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin nisi ligula, dapibus a volutpat sit amet, mattis etc. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin nisi ligula, dapibus a volutpat sit amet, mattis etc.</p>

Aby obcinać multilinię, kliknij link.

Przykład: https://codepen.io/srekoble/pen/EgmyxV

Będziemy do tego używać css webkit. W skrócie WebKit to silnik renderujący przeglądarki HTML / CSS dla Safari / Chrome. Może to być specyficzne dla przeglądarki, ponieważ każda przeglądarka jest wspierana przez silnik renderujący do rysowania strony internetowej HTML / CSS.

VK Singh
źródło
1
tekst powinien być również monospacowy, teraz obcinasz
Fabrizio Calderan
Najlepsza odpowiedź tutaj. Zwłaszcza, że ​​wspomniałeś nawet o obcinaniu multilinii;) Nawiasem mówiąc, jeśli wybierasz opcję multilinii, możesz użyć również max-width:100%;opcji div otoki. Więc masz responsywne obcinanie.
xarlymg89
20

przykładowy kod:

.limited-text{
    white-space: nowrap;
    width: 400px;
    overflow: hidden;
    text-overflow: ellipsis;
}
<p class="limited-text">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Ut odio temporibus voluptas error distinctio hic quae corrupti vero doloribus optio! Inventore ex quaerat modi blanditiis soluta maiores illum, ab velit.</p>

    

Hossein Jafari
źródło
4

Z CSS nie jest to możliwe, w tym celu będziesz musiał użyć Javascript. Chociaż możesz ustawić szerokość p na maksymalnie 30 znaków, a kolejne litery będą automatycznie zmniejszane, ale znowu nie będzie to tak dokładne i będzie się różnić, jeśli znaki będą pisane wielkimi literami.

Jean-Luc
źródło
1
lepiej sprawdź odpowiedź @ VangelTzo
Benjamin,
masz rację Jean-Luc, @VangelTzo to obejście, ale w ogóle nie zapewnia żadnej kontroli.
Guillaume Fe
To jest prawidłowa odpowiedź - nie można dostosowywać liczby znaków w CSS. Musisz użyć JS.
serraosays
3

HTML

<div id="dash">
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin nisi ligula, dapibus a volutpat sit amet, mattis et dui. Nunc porttitor accumsan orci id luctus. Phasellus ipsum metus, tincidunt non rhoncus id, dictum a lectus. Nam sed ipsum a urna ac
quam.</p>
</div>

jQuery

var p = $('#dash p');
var ks = $('#dash').height();
while ($(p).outerHeight() > ks) {
  $(p).text(function(index, text) {
    return text.replace(/\W*\s(\S)*$/, '...');
  });
}

CSS

#dash {
  width: 400px;
  height: 60px;
  overflow: hidden;
}

#dash p {
  padding: 10px;
  margin: 0;
}

WYNIK

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin nisi ligula, dapibus a volutpat sit amet, mattis et ...

Jsfiddle

imtaher
źródło
2
Cześć, witamy w SO! Zredagowałem twoją odpowiedź, dodając kod do treści. W celu odniesienia się w przyszłości prosimy o podanie kodu w odpowiedzi obok linku do jsfiddle!
hatef
jest to najlepsza odpowiedź, ponieważ dotyczy również wysokości, a nie tylko szerokości. Dobra robota!
Grasper
1
Pytanie wymaga rozwiązania css.
dryleaf
1

Czyste rozwiązanie CSS do obcinania znaków wieloliniowych

Miałem podobny problem i znalazłem to doskonałe rozwiązanie tylko dla css z Hackingui.com . Możesz przeczytać artykuł w celach informacyjnych, ale poniżej znajduje się główny kod.

Przetestowałem to i działa idealnie. Mam nadzieję, że ktoś uzna to za przydatne przed wyborem JS lub opcji po stronie serwera

  /* styles for '...' */ 
.block-with-text {
  /* hide text if it more than N lines  */
  overflow: hidden;
  /* for set '...' in absolute position */
  position: relative; 
  /* use this value to count block height */
  line-height: 1.2em;
  /* max-height = line-height (1.2) * lines max number (3) */
  max-height: 3.6em; 
  /* fix problem when last visible word doesn't adjoin right side  */
  text-align: justify;  
  /* place for '...' */
  margin-right: -1em;
  padding-right: 1em;
}

/* create the ... */
.block-with-text:before {
  /* points in the end */
  content: '...';
  /* absolute position */
  position: absolute;
  /* set position to right bottom corner of block */
  right: 0;
  bottom: 0;
}

/* hide ... if we have text, which is less than or equal to max lines */
.block-with-text:after {
  /* points in the end */
  content: '';
  /* absolute position */
  position: absolute;
  /* set position to right bottom corner of text */
  right: 0;
  /* set width and height */
  width: 1em;
  height: 1em;
  margin-top: 0.2em;
  /* bg color = bg color under block */
  background: white;
}
Benny Thadikaran
źródło
1

Nowoczesna odpowiedź sieci CSS

Zobacz w pełni działający kod w CodePen . Biorąc pod uwagę następujący kod HTML:

<div class="container">
    <p>Several paragraphs of text...</p>
</div>

Możesz użyć siatki CSS, aby utworzyć trzy kolumny i powiedzieć kontenerowi, aby wziął maksymalną szerokość 70 znaków dla środkowej kolumny, która zawiera nasz akapit.

.container
{
  display: grid;
  grid-template-columns: 1fr, 70ch 1fr;
}

p {
  grid-column: 2 / 3;
}

Tak to wygląda (Checkout CodePen dla w pełni działającego przykładu):

wprowadź opis zdjęcia tutaj

Oto kolejny przykład, w którym możesz użyć minmax, aby ustawić zakres wartości. Na małych ekranach szerokość zostanie ustawiona na 50 znaków, a na dużych ekranach - na 70 znaków.

.container
{
  display: grid;
  grid-template-columns: 1fr minmax(50ch, 70ch) 1fr;
}

p {
  grid-column: 2 / 3;
}
Muhammad Rehan Saeed
źródło
1
Nie zdawałem sobie sprawy, że możesz użyć chna kolumnach. Śliczny.
Czy
Biorąc pod uwagę temat, całkiem słodko, że jest to identyfikator twojego pióra rrdOvr. ;)
Czy
1

Ten post dotyczy rozwiązania CSS, ale post jest dość stary, więc na wypadek, gdyby inni natknęli się na to i używali nowoczesnego frameworka JS, takiego jak Angular 4+, istnieje prosty sposób, aby to zrobić za pomocą Angular Pipes bez konieczności zadzieraj z CSS.

Prawdopodobnie istnieją również sposoby „React” lub „Vue”. Ma to na celu pokazanie, jak można to zrobić w ramach.

truncate-text.pipe.ts

/**
 * Helper to truncate text using JS in view only.
 *
 * This is pretty difficult to do reliably with CSS, especially when there are
 * multiple lines.
 *
 * Example: {{ value | truncateText:maxLength }} or {{ value | truncateText:45 }}
 *
 * If maxLength is not provided, the value will be returned without any truncating. If the
 * text is shorter than the maxLength, the text will be returned untouched. If the text is greater
 * than the maxLength, the text will be returned with 3 characters less than the max length plus
 * some ellipsis at the end to indicate truncation.
 *
 * For example: some really long text I won't bother writing it all ha...
 */
@Pipe({ name: 'truncateText' })
export class TruncateTextPipe implements PipeTransform {
  transform(value: string, ...args: any[]): any {
    const maxLength = args[0]
    const maxLengthNotProvided = !maxLength
    const isShorterThanMaximumLength = value.length < maxLength
    if (maxLengthNotProvided || isShorterThanMaximumLength) {
      return value
    }
    const shortenedString = value.substr(0, maxLength - 3)
    return `${shortenedString}...`
  }
}

app.component.html

<h1>{{ application.name | truncateText:45 }}</h1>
Łaskawy
źródło
0

Wypróbuj moje rozwiązanie na 2 różne sposoby.

<div class="wrapper">
      <p class="demo-1">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Ut odio temporibus voluptas error distinctio hic quae corrupti vero doloribus optio! Inventore ex quaerat modi blanditiis soluta maiores illum, ab velit.</p>
</div>

<div class="wrapper">
  <p class="demo-2">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Ut odio temporibus voluptas error distinctio hic quae corrupti vero doloribus optio! Inventore ex quaerat modi blanditiis soluta maiores illum, ab velit.</p>
</div>

.wrapper {
  padding: 20px;
  background: #eaeaea;
  max-width: 400px;
  margin: 50px auto;
}

.demo-1 {
  overflow: hidden;
  display: -webkit-box;
  -webkit-line-clamp: 3;
  -webkit-box-orient: vertical;
}

.demo-2 {
  overflow: hidden;
  white-space: nowrap;
  text-overflow: ellipsis;
  max-width: 150px;
}
Super Model
źródło