Евгений Степанищев

Я — эксперт в области разработки веб-приложений и безопасности в интернете. Каждый месяц мой блог посещают около 90 тысяч человек. Работаю техническим директором в «Системах документооборота», занимаюсь электронным правительством.

Урезаем текст средствами CSS: concept proof

Возникла у меня на днях задача — обрезать текст средствами браузера с красивым многоточием, если текст не умещался. Обычно такую проблему решают через JavaScript, но мне пришло в голову сделать это средствами CSS, я даже сразу придумал откуда можно начать.

В «резиновом» контейнере заключаем текст, в его конце должен быть плавающий элемент, справа перекрывающий родительский слой и уходящий за его пределы. Когда строка умещается по ширине (и браузер не пытается её перенести), этот элемент перекрывает многоточие, которое идёт сразу за контейнером. Когда ширины контейнера перестаёт хватает, браузер пытается сделать перенос и переносит перекрывающий слой на следующую строку, многоточие «открывается».

CSS text cropping в «Сафари» (6.78КБ)

В качестве concept proof я накидал небольшой пример, который сразу заработал в «Опере» и «Сафари», FF2 и IE7 возможностями победнее, они не потянули, видимо, в них придётся убрать селектор «:after» и заменить всё тегами с троеточиями внутри.

Сам код:
<style type="text/css">
	body { background: white; color: black; font-family: Arial; font-size: 16px }

	div.crop { width: 100%; height: 20px; overflow: hidden; z-index: 1 }

	div.crop div { float: left; width: auto }

	div.crop:after     { content: '\2026'; position: relative; z-index: 2; background: white; margin-left: -16px }
	div.crop div:after { content: '\2026'; position: relative; z-index: 3; background: white; color: white }
</style>

<body>
<div class="crop"><div>Текст не умещается в контейнер, до того он длинный</div></div>
<div class="crop"><div>Текст не умещается в контейнер</div></div>
</body>
11 апреля 2008 17:39

FX Poster (blog.fxposter.org)
11 апреля 2008, 19:38

Ну, во первых в FF :after поддерживается. Относительно того, как оно работает - если текст короткий, то div.crop:after закроется div.crop div:after, так? А то я недопонял, как оно работает.

bolk (bolknote.ru)
11 апреля 2008, 20:01, ответ предназначен FX Poster (blog.fxposter.org):

Я не сказал, что он его не поддерживает. Он его не поддерживает на должном уровне. Так, чтобы это всё работало.

По по принципу работы — верно.

o4kapuk (o4kapuk.ru)
11 апреля 2008, 21:14, ответ предназначен bolk (bolknote.ru):

Стоит заметить, что Safari само по себе <a href="http://www.css3.info/preview/text-overflow/">поддерживает</a> text-overflow: ellipsis;

preprocessor (prepor.ru)
12 апреля 2008, 14:35

хыхы, а как же ужасный рендер шрифтов сафари? :)

bolk (bolknote.ru)
12 апреля 2008, 16:49, ответ предназначен preprocessor (prepor.ru):

А что с ним?

preprocessor (prepor.ru)
13 апреля 2008, 21:56, ответ предназначен bolk (bolknote.ru):

ну в смысле скриншот-то в сафари сделан. в нем скриншоты лучше выглядят или вы все таки на него перешли?

bolk (bolknote.ru)
13 апреля 2008, 23:15, ответ предназначен preprocessor (prepor.ru):

Зачем переходить на «Сафари»? Что в нём сделано лучше, чем в «Опере»?

Что было в данный момент открыто (а тестировал я в «Сафари» и «Опере»), то я и соскриншотил.

CEBEP (инкогнито)
16 августа 2010, 15:47

Это не работает если засунуть се в таблицу в тег td
<table>
<tr>
    <td >
<div class="crop"><div>Текст не умещается в контейнер, до того он длинный</div></div>
    </td>
</tr>
</table>

bolk (bolknote.ru)
16 августа 2010, 18:20, ответ предназначен CEBEP

Когда исправите, опубликуйте решение, пожалуйста.

bolk (bolknote.ru)
17 августа 2010, 00:36, ответ предназначен CEBEP

Странно, проверил в «Опере», работает в таблице.

Ваше имя или адрес блога (можно OpenID):

Текст вашего комментария, не HTML:

Кому бы вы хотели ответить (или кликните на его аватару)

Подсказка по написанию комментария

В комментариях можно применять следующую специальную разметку:

  • слово, обрамлённое в «звёздочки» выделяется *жирным*
  • ссылка становится ссылкой: http://bolknote.ru
  • ссылка в скобках также становится ссылкой, закрывающая скобка не захватывается: (http://bolknote.ru)
  • каждую строку цитаты следует начинать со знака «больше»:
    > это цитата
    > из двух строк
  • можно вставить картинку, залитую на один из сервисов: «Яндекс.Фотки», «Фликр» или «Пикплз». Для этого нужно вставить на страницу полный адрес вашей картинки на сервисе, он превратится в картинку:

    http://fotki.yandex.ru/users/bolknote/view/274311?page=3