В случае, когда текст не влезает в ширину блока, есть несколько вариантов его визуализации:
В trident, presto и webkit есть родная поддержка, которая включается следующим образом:
Gecko к сожалению поддерживает эллипсинг только для однострочных xul:label и xul:description. Кроме того, он поддерживает замечательную технологию xbl с помощью которой можно реализовать поддержку эллипсинга и для других элементов:
Тут два бинда: ellipsis включает эллипсинг, а none выключает. Подключаются они соответственно:
Когда мы включаем эллипсинг, создаётся «анонимный» элемент xul:label, который не видится обычными дом-методами, но располагается аккурат между исходным элементом и его детьми. К сожалению, xul:label укорачивает текст только если он задан через аттрибут value, поэтому приходится копировать в него текстовое содержимое из исходного элемента при каждом изменении дочернего поддерева.
Кроме того, приходится бороться с некоторыми особенностями:
Чтобы не заниматься копипастом и избежать возможных конфликтов, предлагаю заготовку css-правил:
А вот примеры её использования:
Попробовать прямо сейчас всего за 99.9 центов!
- Разрешить ему вылезать за пределы блока. В большинстве случаев смотрится весьма косячно.
- Обрезать текст по границе блока. То же смотрится некузяво.
- Обрезать и нарисовать скроллинг. Это вообще жуть какая-то.
- Обрезать и сделать плавное затухание к краю так чтобы места обрезания букв не было видно. Сложно применять в случае неоднородного фона. Приходится вручную прятать затухание, когда текст имеет ширину меньше или равную ширине блока.
- Укорачивать текст, вставляя вконце многоточие.
В trident, presto и webkit есть родная поддержка, которая включается следующим образом:
overflow: hidden;<br>text-overflow: ellipsis;<br>-o-text-overflow: ellipsis;
Gecko к сожалению поддерживает эллипсинг только для однострочных xul:label и xul:description. Кроме того, он поддерживает замечательную технологию xbl с помощью которой можно реализовать поддержку эллипсинга и для других элементов:
<?xml version="1.0"?><br><bindings xmlns="http://www.mozilla.org/xbl" xmlns:xul="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"><br><br><binding id="none"><br> <content><children/></content><br></binding><br><br><binding id="ellipsis"><br> <content><br> <xul:label crop="end"><children/></xul:label><br> </content><br> <implementation><br> <field name="label"> document.getAnonymousNodes( this )[ 0 ] </field><br> <field name="style"> this.label.style </field><br> <property name="display"><br> <getter> this.style.display </getter><br> <setter> if( this.style.display != val ) this.style.display= val </setter><br> </property><br> <property name="value"><br> <getter> this.label.value </getter><br> <setter> if( this.label.value != val ) this.label.value= val </setter><br> </property><br> <method name="update"><br> <body><br> var strings= this.textContent.split( /\s+/g )<br> if( !strings[ 0 ] ) strings.shift()<br> if( !strings[ strings.length - 1 ] ) strings.pop()<br> this.value= strings.join( ' ' )<br> this.display= strings.length ? '' : 'none'<br> </body><br> </method><br> <constructor> this.update() </constructor><br> </implementation><br> <handlers><br> <handler event="DOMSubtreeModified"> this.update() </handler><br> </handlers><br></binding><br><br></bindings>
Тут два бинда: ellipsis включает эллипсинг, а none выключает. Подключаются они соответственно:
-moz-binding: url( 'bindings.xml#ellipsis' );
-moz-binding: url( 'bindings.xml#none' );
Когда мы включаем эллипсинг, создаётся «анонимный» элемент xul:label, который не видится обычными дом-методами, но располагается аккурат между исходным элементом и его детьми. К сожалению, xul:label укорачивает текст только если он задан через аттрибут value, поэтому приходится копировать в него текстовое содержимое из исходного элемента при каждом изменении дочернего поддерева.
Кроме того, приходится бороться с некоторыми особенностями:
- Вручную нормализовывать пробелы.
- Скрывать xul:label когда у него пустое содержимое.
- Кроссбраузерно можно эллипсить только текст, принудительно вытянутый в одну строку.
- Внутри исходного элемента должен быть только текст, ибо мозилла всё-равно вырежет все тэги.
- В мозилле нельзя выделить текст, подвергшийся омноготочиванию.
Чтобы не заниматься копипастом и избежать возможных конфликтов, предлагаю заготовку css-правил:
.v-ellip, v\:ellip {<br> text-overflow: ellipsis;<br> -o-text-overflow: ellipsis;<br> -moz-binding: url( 'bindings.xml#ellipsis' );<br> white-space: nowrap;<br> overflow: hidden;<br> display: inline-block;<br> max-width: 100%;<br>}
А вот примеры её использования:
<body xmlns:v="urn:markup:visual"><br><br> <p><br> <a href="#"><v:ellip><!-- А тут ничего нет :-Р --></v:ellip></a><br> </p><br> <br> <p><br> <a href="#" class="v-ellip"> Какой-то текст </a><br> </p><br> <br> <p><v:ellip><br> Ооооочеееееееенььдлиииинноооооееееслооовоооо<br> Ееееещёёёёёёооооодноооооо<br> </v:ellip></p><br><br></body>
Попробовать прямо сейчас всего за 99.9 центов!