Установка максимальной длины символа в CSS


182

Я делаю адаптивный сайт для школы, и мой вопрос:

Как установить максимальную длину символов в предложениях (с CSS) на моем веб-сайте (например, 75 символов), чтобы при большом экране предложения не превышали 75 символов.

Я пробовал максимальную ширину, но это портит мой макет. Я использую flexbox и медиа-запросы, чтобы сделать его отзывчивым.


1
Если вы используете textareaили для них есть свойство inputмаксимальной длины ( maxlength="50"это в HTML), или вам придется использовать Javascript. Также я думаю, что неправильно прочитал это, установка ширины заставит предложение перейти к следующей строке, когда оно достигнет конца. Это поведение по умолчанию.
Ruddy

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
Это влияет на ширину абзаца, а не на длину предложения. И 200px может быть любым символом (это зависит даже от того, много ли у вас символов I или W, а также от размера и размера шрифта).
Юкка К. Корпела

Вы правы в этом. Проверьте, что Paulie_D ответ, кажется, правильный для вашего решения
Vangel Tzo

@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
Это было реализовано в любых браузерах? Кажется, не работает для меня вообще. Изменить: все еще проект dev.w3.org/csswg/css-values/#lengths
Репа

Я думаю, что я пойду с вашим ответом, я думаю, что это будет то же самое, если я установлю max-width: 30em; Это достаточно близко для меня. Спасибо!
Sharif1111

Не уверен насчет таблиц совместимости в MDN ... но этот ( chмодуль) не работает (как и ожидалось) для меня в Chrome 50, IE11 или FF45 ?!
MrWhite

Да, у меня тот же результат, что и у @ w3dk. Я просто установил heightи overflow:hidden. Мне действительно понравился многоточие, но я смог заставить его работать, только если я установил white-space:no-wrap. В моем случае текст может обернуться, но не превысить определенный предел символов в своем контейнере.
Chris22

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

48

Попробуйте это для усечения символов после установки максимальной ширины. Я использовал 75ч в этом случае

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

Мы будем использовать webkit css для этого. Короче говоря, WebKit - это движок рендеринга веб-браузера HTML / CSS для Safari / Chrome. Это может зависеть от браузера, так как каждый браузер поддерживается механизмом рендеринга для рисования веб-страницы HTML / CSS.


1
текст также должен быть моноширинным, сейчас вы усекаете
Фабрицио Кальдеран

Лучший ответ здесь. Тем более, что вы даже упоминаете многострочное усечение;) Кстати, если вы используете многострочную опцию, вы можете использовать также и 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-зажим :

     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 -broken-865413f16e5


4

С CSS это невозможно, вам придется использовать Javascript для этого. Хотя вы можете установить ширину p до 30 символов, следующие буквы будут автоматически уменьшаться, но, опять же, это будет не так точно и будет меняться, если символы заглавными.


1
лучше вам нужно проверить ответ @ VangelTzo
Бенджамин

Вы совершенно правы, Жан-Люк, @VangelTzo - это обходной путь, но он вообще не обеспечивает никакого контроля над cout.
Гийом Фе

Это правильный ответ - вы не можете настроить количество символов в 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, Concetetur Adipiscing Elit. Proin nisi ligula, dapibus a volutpat sit amet, mattis et ...

Jsfiddle


2
Привет, добро пожаловать на ТАК! Я отредактировал ваш ответ, добавив код к телу. Для дальнейшего использования, пожалуйста, укажите свой код в ответе рядом с указанием ссылки на jsfiddle!
Ненавижу

это лучший ответ, потому что он также учитывает высоту, а не только ширину. Хорошая работа!
Grasper

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 Grid Ответ

Посмотреть полностью рабочий код на 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. ;)
Будет

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

Попробуйте мое решение с 2 различными способами.

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