Съкращаване на дълги низове с CSS: възможно ли е вече?

Има ли някакъв добър начин за съкращаване на текст с обикновен HTML и CSS, така че динамичното съдържание да може да се побере в оформление с фиксирана ширина и височина?

Съкращавам от страната на сървъра по логическа ширина (т.е. сляпо предположен брой знаци), но тъй като „w“ е по-широк от „i“, това обикновено е неоптимално и също изисква от мен да предположа отново (и да продължа да променям) броя на знаците за всяка фиксирана ширина. В идеалния случай отрязването ще се случи в браузъра, който знае физическата ширина на изобразения текст.

Открих, че IE има свойство text-overflow: ellipsis, което прави точно това, което искам, но трябва да е между браузъри. Това свойство изглежда (донякъде?) стандартно, но не се поддържа от Firefox. Намерих различни заобиколни решения въз основа на overflow: hidden, но те или не показвай многоточие (искам потребителят да знае, че съдържанието е съкратено) или го показвай през цялото време (дори ако съдържанието не е съкратено).

Някой има ли добър начин за поставяне на динамичен текст във фиксирано оформление или съкращаването от страна на сървъра по логическа ширина е толкова добро, колкото смятам да получа за сега?


person Sam Stokes    schedule 29.04.2009    source източник
comment
2014: вижте актуален отговор stackoverflow.com/questions/802175/   -  person Adrien Be    schedule 18.08.2014
comment
свързано: Прилагане на многоточие към многоредов текст   -  person Michael Benjamin    schedule 24.10.2015
comment
Възможен дубликат на Вмъкване на многоточие (...) в HTML таг, ако твърде широко съдържание   -  person Naeem Shaikh    schedule 15.02.2016


Отговори (5)


Актуализация: text-overflow: ellipsis вече се поддържа от Firefox 7 (издаден на 27 септември 2011 г.). Ура! Първоначалният ми отговор следва като исторически запис.

Джъстин Максуел има CSS решение за различни браузъри. Той обаче идва с недостатъка, че не позволява текстът да бъде избран във Firefox. Разгледайте неговата публикация като гост в блога на Matt Snider за пълни подробности относно как работи това.

Обърнете внимание, че тази техника също предотвратява актуализирането на съдържанието на възела в JavaScript с помощта на свойството innerHTML във Firefox. Вижте края на тази публикация за заобиколно решение.

CSS

.ellipsis {
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
    -o-text-overflow: ellipsis;
    -moz-binding: url('assets/xml/ellipsis.xml#ellipsis');
}

ellipsis.xml съдържание на файла

<?xml version="1.0"?>
<bindings
  xmlns="http://www.mozilla.org/xbl"
  xmlns:xbl="http://www.mozilla.org/xbl"
  xmlns:xul="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
>
    <binding id="ellipsis">
        <content>
            <xul:window>
                <xul:description crop="end" xbl:inherits="value=xbl:text"><children/></xul:description>
            </xul:window>
        </content>
    </binding>
</bindings>

Актуализиране на съдържанието на възела

За да актуализирате съдържанието на възел по начин, който работи във Firefox, използвайте следното:

var replaceEllipsis(node, content) {
    node.innerHTML = content;
    // use your favorite framework to detect the gecko browser
    if (YAHOO.env.ua.gecko) {
        var pnode = node.parentNode,
            newNode = node.cloneNode(true);

        pnode.replaceChild(newNode, node);
    }
};

Вижте публикацията на Matt Snider за обяснение как работи това.

person Simon Lieschke    schedule 09.07.2009
comment
Това е страхотно, благодаря, че го посочихте! Текстът, който не може да се избира, и ограниченията за това какво съдържание може да влезе в съкратения div са жалко, но като цяло това изглежда като добро решение. - person Sam Stokes; 09.07.2009
comment
Единственото истинско разочарование, което изпитвам, е, че интервалите се изобразяват като , така че отстъпът не е наистина осъществим... =/ - person Matchu; 11.08.2009
comment
И аз се сблъсках със същия проблем. Не мога да повярвам, че Firefox все още не поддържа това под някаква форма. - person mcjabberz; 24.08.2009
comment

Друг вариант е да използвате WebViewClient;

webview.setWebViewClient(new MyWebViewClient ());

private class MyWebViewClient extends WebViewClient {
@Override
public void onReceivedHttpAuthRequest(WebView view,
        HttpAuthHandler handler, String host, String realm) {

    handler.proceed("[email protected]", "mypassword");

}
}
- person Rajat; 10.04.2010
comment
Документацията на Microsoft за text-overflow не показва поддръжка за option елементи (вижте раздела Отнася се за на msdn.microsoft.com/en-us/library/ms531174(VS.85).aspx). - person Simon Lieschke; 10.04.2010
comment
Само предупреждаваме, че XUL хакът в момента не работи във Firefox 4.0 (който е в процес на разработка към момента на писане). Ще държа хората в течение. bugzilla.mozilla.org/show_bug.cgi?id=312156#c94 - person Simon Lieschke; 22.09.2010
comment

Първо може да се наложи да извикате recv с &m_vbuffer[0]. Относно клонирането на вектор, използвайте copy().

#include <algorithm>
...

vector<char> m_vcopy;
m_vcopy.reserve(m_vbuffer.size());
copy(m_vbuffer.begin(), m_vbuffer.end(), m_vcopy.begin());

Имайте предвид обаче, че елементът не трябва да бъде референтен. :)

- person Simon Lieschke; 13.04.2011
comment
Работи страхотно! Не внедрих нещата на Firefox за моя проект, тъй като беше досадно. Майната им на потребителите на Firefox :) - person Sam Soffes; 11.05.2011
comment
text-overflow: ellipsis вече се поддържа от Firefox 7. Ура! - person Simon Lieschke; 28.09.2011
comment
Не работи за клетки от таблица, забелязах. Трябва да обвиете съдържанието в DIV и да приложите стила към DIV, а не към клетката на таблицата (поне в Chrome/Webkit). - person Simon East; 05.02.2012
comment
@Simon също вижте този отговор. - person Simon Lieschke; 07.02.2012

Март 2014 г.: Съкращаване на дълги низове с CSS: нов отговор с акцент върху поддръжката на браузър

Демо на http://jsbin.com/leyukama/1/ (използвам jsbin, защото поддържа стари версия на IE).

<style type="text/css">
    span {
        display: inline-block;
        white-space: nowrap;
        overflow: hidden;
        text-overflow: ellipsis;     /** IE6+, Firefox 7+, Opera 11+, Chrome, Safari **/
        -o-text-overflow: ellipsis;  /** Opera 9 & 10 **/
        width: 370px; /* note that this width will have to be smaller to see the effect */
    }
</style>

<span>Some very long text that should be cut off at some point coz it's a bit too long and the text overflow ellipsis feature is used</span>

CSS свойството -ms-text-overflow не е необходимо: то е синоним на CSS свойството text-overflow, но версии на IE от 6 до 11 вече поддържат CSS свойството text-overflow.

Успешно тестван (на Browserstack.com) на Windows OS, за уеб браузъри:

  • IE6 to IE11
  • Opera 10.6, Opera 11.1, Opera 15.0, Opera 20.0
  • Chrome 14, Chrome 20, Chrome 25
  • Safari 4.0, Safari 5.0, Safari 5.1
  • Firefox 7.0, Firefox 15

Firefox: както беше посочено от Саймън Лишке (в друг отговор), Firefox поддържа само свойството CSS за текстово препълване от Firefox 7 нататък (издаден на 27 септември 2011 г.).

Проверих два пъти това поведение във Firefox 3.0 и Firefox 6.0 (препълването на текст не се поддържа).

Ще са необходими някои допълнителни тестове на уеб браузъри на Mac OS.

Забележка: може да искате да покажете подсказка при задържане на мишката, когато се приложи многоточие, това може да стане чрез javascript, вижте тези въпроси: HTML text-overflow откриване на многоточие и HTML - как мога да покажа подсказка САМО когато многоточието е активирано

ресурси:

person Adrien Be    schedule 02.04.2014
comment
@chiragpatel опитайте сами, като редактирате тази демонстрация на живо jsbin.com/leyukama/1 - person Adrien Be; 05.09.2016
comment
За всеки, който се интересува, FF7‹ е 0,05% от потребителите на Firefox днес - person Tom Tom; 26.05.2017

Ако сте добре с решение на JavaScript, има добавка jQuery, която да прави това по начин на кръстосани браузъри - вижте http://azgtech.wordpress.com/2009/07/26/text-overflow-ellipsis-for-firefox-via-jquery/

person RichieHindle    schedule 29.04.2009
comment
Това определено е полезно, благодаря! Изглежда, че всички браузъри, с изключение на Firefox, поддържат свойството CSS, така че с този плъгин единствените хора, за които не би работил, са потребителите на Firefox, които са деактивирали Javascript - и така или иначе това е изящно влошаване. Имате ли представа какви са последиците за производителността? - person Sam Stokes; 29.04.2009
comment
Не, съжалявам... Не съм използвал кода в реалния живот, просто играх с демото. Би било лесно да вземете демонстрацията и да я изрежете и поставите сто пъти на една и съща страница. - person RichieHindle; 29.04.2009
comment
JavaScript truncate() (независимо дали е точков низ за jQuery или Prototype или каквото и да е друго) са само половинчато решение, защото не вземат предвид ширината на символа. Така че, ако искате да съкратите текст поради предварително дефинирано ограничено пространство, тези функции работят надеждно само когато използвате шрифтове с едно пространство. Всяко сериозно решение би трябвало да работи с глифове, а не с брой знаци. - person Matthias; 26.08.2009
comment
@Matthias: Може би кодът е актуализиран, откакто го тествахте, но току-що погледнах демонстрацията и тя работи перфектно с шрифт с променлива ширина. - person RichieHindle; 29.07.2010

Добре, Firefox 7 внедри text-overflow: ellipsis, както и text-overflow: "string". Окончателното издание е планирано за 2011-09-27.

person j.j.    schedule 09.07.2011

Друго решение на проблема може да бъде следният набор от CSS правила:

.ellipsis{
 white-space:nowrap;
 overflow:hidden;
}

.ellipsis:after{
  content:'...';
}

Единственият недостатък на горния CSS е, че той ще добави "..." независимо дали текстът препълва контейнера или не. И все пак, ако имате случай, в който имате куп елементи и сте сигурни, че съдържанието ще препълни, това ще бъде по-опростен набор от правила.

Моите два цента. Шапки долу за оригиналната техника на Джъстин Максуел

person Rajat    schedule 09.04.2010
comment
Проблемът с псевдо кода е, че ... все още се отрязва или скрива, ако текстът препълни. Надявах се, че ако текстът прелива, ще се погрижи ... да бъде показан. Явно не е така :( - person Antony; 22.03.2012
comment
@Antony Просто позиционирайте псевдо елемента: position: absolute; right: 0; (и не забравяйте position: relative върху истинския елемент, за да работи). Той обаче ще се припокрива с текста, така че може да искате да добавите и фонов цвят. - person last-child; 17.06.2013