Встановлення максимальної довжини символів у CSS


181

Я роблю чуйний веб-сайт для школи, і моє запитання:

Як я можу встановити на своєму веб-сайті максимальну довжину символів (за допомогою CSS) (наприклад, 75 символів), що коли у мене дуже великий екран, пропозиції не перевищуватимуть 75 символів.

Я спробував максимальну ширину, але це зіпсувало мою компоновку. Я використовую запити флешбоксу та медіа, щоб зробити його чутливим.


1
Якщо ви використовуєте textareaабо inputє maxlength="50"для них властивість максимальної довжини ( це в HTML), або вам доведеться використовувати Javascript. Також я думаю, що це неправильно прочитав, встановлення ширини змусить пропозицію перейти до наступного рядка, коли він потрапить у кінець. Це поведінка за замовчуванням.
Рудді

2
Погляньте на це: stackoverflow.com/questions/20552957/… - це еліпси CSS, це може допомогти вам
Даррен Суїні

Хоча ви не можете використовувати для цього лише CSS, ви можете обмежити кількість показів символів за допомогою CSS, як запропонував Даррен. Потрібно встановити текстовий контейнер на пробіл: без загортання, переповнення тексту: еліпсис та переповнення: приховано. Потім просто встановіть розмір контейнера.
Патрік Лівер

1
Що ви маєте на увазі, встановлюючи такий ліміт? Що має відбутися при його перевищенні? Що ви маєте на увазі під реченням? Це не концепція CSS. Як ви маєте намір розпізнати або позначити речення? Або ти насправді маєш на увазі довжину рядка ? Якщо ви це робите, у чому ваша проблема? Зазвичай текст загортається автоматично, якщо ви не робите спеціальних заходів для його запобігання.
Юкка К. Корпела

Відповіді:


254

Ви завжди можете використовувати метод усікання, встановивши а max-widthта переповнення ellipsisтаким чином

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

Приклад: http://jsfiddle.net/3czeyznf/

Для багаторядкового усікання розгляньте flexрішення. Приклад з усіченням на 3 ряди.

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

Приклад: https://codepen.io/srekoble/pen/EgmyxV


1
Дякую, я розумію використання еліпсису, але я не бачу, як це вирішує мою проблему. Я думаю, що еліпсис підходить тоді, коли екран стає меншим, але коли його стає більше, я хочу, щоб він вирізав його на 75 символів. так що @ Жан-Люк заявляє, що це можливо лише за допомогою JavaScript? вибачте, я новачок у кодуванні
Sharif1111

Ви можете побачити, який простір має 75 символів відповідно до вашої типографії, і встановити відповідно до цього максимальну ширину. На жаль, ви не можете встановити властивість CSS для усічення речення відповідно до символів. Крім того, ви можете скористатися методом "урізання" з тією перевагою, що ви можете вказати метод укорочення відповідно до рядків.
Вангель Цзо

1
Це впливає на ширину абзацу, а не на довжину речення. І 200 пікселів може бути будь-що що стосується символів (це навіть залежить від того, чи є у вас багато або багато W, а також від розміру та розміру шрифту).
Jukka K. Korpela

Ви маєте рацію з цього приводу. Перевірте, що відповідь Paulie_D, здається, є правильним для вашого рішення
Вангель Цзо

@VangelTzo Це лише для одного рядка. Чи можна це зробити для декількох рядків? Дякую
Biswas

108

Існує "значення довжини" CSS ch.

Від MDN

Ця одиниця представляє ширину, а точніше попередню міру гліфа '0' (нуль, символ Unicode U + 0030) у шрифті елемента.

Це може приблизно відповідати тому, що ви хочете.

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>


2
Чи реалізовано це будь-якими браузерами? Здається, це для мене зовсім не працює. Edit: Ще проект dev.w3.org/csswg/css-values/#lengths
ріпа

Я думаю, що я піду з вашою відповіддю, я думаю, це було б те саме, якби я встановив максимальну ширину: 30em; Її досить близько для мене. Дякую!
Sharif1111

Не впевнений у таблицях сумісності в MDN ... але, chздається, цей ( блок) не працює (як очікувалося) для Chrome 50, IE11 або FF45 ?!
MrWhite

Так, у мене такий же результат, як і @ w3dk. Я просто встановив heightі overflow:hidden. Мені подобалося еліпсис, але мені вдалося змусити його працювати, лише коли я встановив white-space:no-wrap. У моєму випадку текст може містити обертання, лише не перевищуючи певну межу символів у контейнері.
Chris22

1
Не впевнений, чому за це стільки голосів, оскільки це явно неповно і не працює з наданим кодом. Вам потрібно додатиwhite-space: nowrap;
Кевін М

47

Спробуйте це для обрізання символів після встановлення його на максимальну ширину. Я використовував 75ch у цьому випадку

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>

Для багаторядкових транкінгування перейдіть за посиланням.

Приклад: https://codepen.io/srekoble/pen/EgmyxV

Для цього ми будемо використовувати css webkit. Коротше кажучи, WebKit - це система відображення веб-браузерів HTML / CSS для Safari / Chrome. Це може бути специфічно для веб-переглядача, оскільки кожен браузер підтримується механізмом візуалізації для малювання веб-сторінки HTML / CSS.


1
текст також повинен бути односкладним, зараз ви обрізаєте текст після 93 символів: codepen.io/anon/pen/bRELeb
Фабрізіо Кальдеран

Найкраща відповідь тут. Спеціально тому, що ви навіть згадуєте про багаторядкове обрізання;) До речі, якщо ви збираєтесь для мультилінійного варіанту, ви можете використовувати також і max-width:100%;div для обгортки. Таким чином, у вас є чуйний обріз
xarlymg89

20

приклад коду:

.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>

    


12

За допомогою Chrome ви можете встановити кількість рядків, що відображаються за допомогою " -webkit-line-clamp ":

     display: -webkit-box;
    -webkit-box-orient: vertical;
    -webkit-line-clamp: 3;  /* Number of lines displayed before it truncate */
     overflow: hidden;

Тож для мене це використання в розширенні, щоб воно було ідеальним, більше інформації тут: https://medium.com/mofed/css-line-clamp-the-good-the-bad-and-the-straight-up -розбита-865413f16e5


4

З CSS це неможливо, для цього доведеться використовувати Javascript. Хоча ви можете встановити ширину p до 30 символів, і наступні літери автоматично зійдуть, але знову це не буде настільки точним і буде змінюватися, якщо символи знаходяться з великої літери.


1
краще вам потрібно перевірити відповідь @ VangelTzo
Бенджамін

Ви абсолютно праві, Жан-Люк, @VangelTzo - це обхідний шлях, але взагалі не забезпечує контролю над кутом.
Гійом Фе

Це правильна відповідь - ви не можете змінити кількість символів у CSS. Вам потрібно використовувати 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;
}

РЕЗУЛЬТАТ

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

Jsfiddle


2
Привіт, ласкаво просимо до SO! Я відредагував вашу відповідь, додавши код до тіла. Для подальшого ознайомлення, будь ласка, включіть свій код у відповідь, поряд із тим, щоб надати посилання на jsfiddle!
hatef

це найкраща відповідь, оскільки вона також стосується висоти, а не лише ширини. Хороша робота!
Граспер

1
Питання задає рішення css.
dryleaf

1

Чисте рішення CSS для обрізання багаторядкових символів

У мене була подібна проблема, і я знайшов це відмінне рішення для CSS від Hackingui.com . Ви можете прочитати статтю для інформації, але нижче основний код.

Я перевірив це, і він працює чудово. Сподіваємось, хтось вважає це корисним перед тим, як вибрати варіант JS або на стороні сервера

  /* 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;
}

1

Сучасний відповідь сітки CSS

Перегляньте повністю працюючий код на CodePen . Враховуючи такий HTML:

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

Ви можете використовувати CSS Grid для створення трьох стовпців і наказати контейнеру взяти максимальну ширину 70 символів для середнього стовпця, який містить наш абзац.

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

p {
  grid-column: 2 / 3;
}

Ось як це виглядає (Checkout CodePen для повністю працюючого прикладу):

введіть тут опис зображення

Ось ще один приклад, коли ви можете використовувати minmax для встановлення діапазону значень. На маленьких екранах ширина буде встановлена ​​на 50 символів, а на великих - на 70 символів.

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

p {
  grid-column: 2 / 3;
}

1
Не зрозумів, що ти можеш використовувати chстовпці. Прекрасна.
Буде

Крім того, враховуючи тему, досить солодко, що ідентифікатор вашого пера rrdOvr. ;)
Will

1

Цей пост призначений для CSS-рішення, але він є досить старим, тому на всякий випадок, якщо інші натрапляють на це і використовують сучасний фреймворк JS, такий як Angular 4+, є простий спосіб зробити це через Angular Pipes без необхідності возитися з CSS.

Ймовірно, є також "Реагувати" або "Vue" способи зробити це. Це лише для того, щоб показати, як це можна зробити в рамках.

усікати-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>

0

Спробуйте моє рішення двома різними способами.

<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;
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.