Как я могу имитировать переполнение текста: многоточие в Firefox? - PullRequest
19 голосов
/ 30 ноября 2009

У меня есть некоторый динамический текст, содержащийся в div, который установлен на то, что пользователь вводит в поле текстового поля. Если текст не помещается в элемент div, сейчас он просто обрезается по краю, и весь текст, который выходит за границы, не виден. Я хотел бы обрезать текст так, чтобы он помещался внутри рамки и имел многоточие (...) в конце. Например:

|----div width------|
 Here is some sample text that is too long.
 Here is some sam...

Очевидно, что в примере это просто, потому что кодовый тег использует шрифт фиксированной ширины, поэтому он так же прост, как и подсчет символов. У меня есть шрифт переменной ширины, поэтому, если они введут «WWWWWWWWWWW», он будет заполнен гораздо меньшим количеством символов, чем «................».

Какой лучший способ сделать это? Я нашел потенциальное решение для простого нахождения фактической ширины текста в пикселях здесь: http://www.codingforums.com/archive/index.php/t-100367.html

Но даже с таким методом немного неловко реализовать многоточие. Так что, если это 20 символов и я нахожу, что они не подходят, мне нужно будет усечь их до 19, добавить многоточие, а затем проверить, подходит ли оно снова. Затем обрежьте до 18 (плюс многоточие) и попробуйте снова. И опять. И снова ... пока не подойдет. Есть ли лучший способ?

РЕДАКТИРОВАТЬ: Я решил, основываясь на ответах, что мой оригинальный подход лучше, за исключением того, что я попытался улучшить решение по ссылке выше, не создавая отдельный элемент td просто для измерения, что выглядит как хак.

Вот мой код:

<div id="tab" class="tab">
    <div id="tabTitle" class="tabTitle">
        <div class="line1">user-supplied text will be put here</div>
        <div class="line2">more user-supplied text will be put here</div>
    </div>
</div>

И стили:

.tab {
padding: 10px 5px 0px 10px;
margin-right: 1px;
float: left;
width: 136px;
height: 49px;
background-image: url(../images/example.gif);
background-position: left top;
background-repeat: no-repeat;
}    

.tab .tabTitle {
    height: 30px;
width: 122px;
    overflow: hidden;
    text-overflow: ellipsis;
font-size: 12px;
font-weight: bold;
color: #8B8B8B;
}

.tab .tabTitle .line1, .tab .tabTitle .line2 {
    display:inline;
    width:auto;
}

и javascript, который обрезает и добавляет многоточие:

function addOverflowEllipsis( containerElement, maxWidth )
{
    var contents = containerElement.innerHTML;
    var pixelWidth = containerElement.offsetWidth;
    if(pixelWidth > maxWidth)
    {
        contents = contents + "…"; // ellipsis character, not "..." but "…"
    }
    while(pixelWidth > maxWidth)
    {
        contents = contents.substring(0,(contents.length - 2)) + "…";
        containerElement.innerHTML = contents;
        pixelWidth = containerElement.offsetWidth;
    }
}

Div'ы line1 и line2 передаются в функцию. Он работает в случае ввода одного слова, такого как «WWWWWWWWWWWWWWWWW», но не работает многострочный ввод «WWWWW WWWWW WWWWW», поскольку он просто добавляет разрывы строк и измеряет текст как ширину «WWWWW».

Можно ли как-то исправить это, не прибегая к копированию текста в скрытый измерительный элемент? Какой-нибудь способ установить стиль строки div, чтобы они не переносили текст?

Ответы [ 13 ]

11 голосов
/ 08 декабря 2009

Какой-нибудь способ задать стиль строки div, чтобы они не переносили текст?

Там у вас есть white-space: nowrap для. Да, это работает и в древних браузерах.

5 голосов
/ 17 августа 2010

Эта проблема должна работать и в Firefox.

HTML

<div class="ellipsis">Here goes too long text and when it is takes more than 200px in "end" of the text appears "..."</div>

CSS

.ellipsis{
width:200px;
text-overflow:ellipsis;
-o-text-overflow:ellipsis;
-moz-binding:url('bindings.xml#ellipsis');//issue for Firefox
}

bindings.xml

<bindings xmlns="http://www.mozilla.org/xbl" xmlns:xul="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
<binding id="none">
    <content><children/></content>
</binding>
<binding id="ellipsis">
    <content>
        <xul:label crop="end"><children/></xul:label>
    </content>
    <implementation>
        <field name="label">document.getAnonymousNodes(this)[0]</field>
        <field name="style">this.label.style</field>
        <property name="display">
            <getter>this.style.display</getter>
            <setter>if(this.style.display!= val)this.style.display=val</setter>
        </property>
        <property name="value">
            <getter>this.label.value</getter>
            <setter>if(this.label.value!=val)this.label.value=val</setter>
        </property>
        <method name="update">
            <body>
                var strings= this.textContent.split(/\s+/g)
                if(!strings[0])strings.shift()
                if(!strings[strings.length-1])strings.pop()
                this.value=strings.join('')
                this.display=strings.length?'':'none'
            </body>
        </method>
        <constructor>this.update()</constructor>
    </implementation>
    <handlers>
        <handler event="DOMSubtreeModified">this.update()</handler>
    </handlers>
</binding>
</bindings>
4 голосов
/ 30 ноября 2009

Если вы используете jQuery, есть отличный плагин , который я использую.

В качестве альтернативы, [этот пример] (404 НЕ НАЙДЕН!) Может работать в разных браузерах.

Любые вопросы, напишите мне в комментариях!

404 ссылка: http://www.hedgerwow.com/360/dhtml/text_overflow/demo2.php

3 голосов
/ 30 ноября 2009

Новая версия CSS (CSS3) должна включать text-overflow:ellipsis, что делает это за вас. В настоящее время он работает в IE версии 6 и выше, а также в Safari и Chrome. Он не поддерживается Firefox, так что это пока не очень полезный ответ, но стоит помнить, что в конечном итоге лучшим способом будет позволить CSS справиться с этим.

Черновик спецификации CSS3: http://www.w3.org/TR/2001/WD-css3-text-20010517/#text-overflow-props

Поддерживаемые браузеры: http://www.quirksmode.org/css/contents.html (прокрутите вниз до «переполнения текста» внизу)

1 голос
/ 13 июля 2010

Чтобы ответить только на один из вопросов, которые вы подняли:

Так что, если это 20 символов, и я нахожу что это не подходит, мне бы пришлось усечь до 19, добавить многоточие и затем проверьте, подходит ли он снова. затем обрезать до 18 (плюс многоточие) и Попробуйте снова. И опять. А также снова ... пока не подойдет. Есть ли лучше?

Гораздо более быстрый способ найти правильную длину - разрезать строку пополам, проверить, подходит ли она. Если это так: добавьте четверть оригинальной длины обратно, и если она не будет отрезана на четверть, проверьте это, чтобы убедиться, что она подходит. Повторите рекурсивно с 1/8, 1/16, 1/32, ... от первоначальной длины, пока это значение сложения / вычитания не станет меньше 1.

Это алгоритм поиска: для строк, которые длиннее нескольких слов, вы обычно можете сократить количество тестов, которые вам нужно выполнить в DOM, в 10 раз.

1 голос
/ 30 ноября 2009

Используйте text-overflow:ellipsis. Это не только для IE ... Большинство крупных браузеров могут сделать это.
Но если вы не можете , вот плагин jQuery для этого.

1 голос
/ 30 ноября 2009

Проще говоря, нет, нет лучшего способа без использования хаков.

Вы можете, например, использовать позицию position: absolute для позиционирования вашего «...» поверх фактического содержимого с параметром overflow: hidden, установленным в контейнере, и скрывать дополнительный диапазон только в том случае, если содержимое помещается контейнер. Это позволило бы вам запустить код усечения только один раз.

Лично я бы просто запустил расчет ширины пикселя несколько раз. Задание текста и чтение ширины - это быстрая операция, поэтому она не должна быть заметна.

0 голосов
/ 22 апреля 2011

О Firefox 4.0 и еще не реализованном text-overflow:ellipsis CSS-свойстве:

Эта ссылка дает частичное решение проблемы.

Выдает результат, аналогичный text-overflow:ellipsis, используя только CSS.

0 голосов
/ 08 марта 2011

Я изменил this.value=strings.join('') на this.value=strings.join(' ') с Binyamin в ответе, и у меня все получилось нормально!

0 голосов
/ 18 ноября 2010

с оперой:

-o-text-overflow:ellipsis;
...