Определение ширины печатной строки веб-приложением - PullRequest
7 голосов
/ 29 августа 2008

В моем (PHP) веб-приложении у меня есть часть моего сайта, которая хранит историю последних поисков. Самые последние запросы отображаются в боковом окне. Если текст запроса слишком длинный, я усекаю его и показываю эллипсы. Например: «Мой очень длинный запрос ...»

В настоящее время я усекаюсь после определенного количества символов. Поскольку шрифт не является монотипным, запрос всех I является более узким, чем запрос всех W. Я бы хотел, чтобы все они были примерно одинаковой ширины до эллипсов. Есть ли способ получить приблизительную ширину результирующей строки, чтобы эллипсы для любой заданной строки имели примерно одинаковое количество пикселей с начала? У CSS есть способ? Есть ли PHP? Будет ли это лучше обрабатываться JavaScript?

Ответы [ 5 ]

7 голосов
/ 29 августа 2008

Вот еще один пример, и вам не нужно жить без многоточия!

<html>
<head>

<style>
div.sidebox {
    width: 25%;
}

div.sidebox div.qrytxt {
    height: 1em;
    line-height: 1em;
    overflow: hidden;
}

div.sidebox div.qrytxt span.ellipsis {
    float: right;
}
</style>


</head>

<body>

<div class="sidebox">
    <div class="qrytxt">
        <span class="ellipsis">&hellip;</span>
        Some long text which will arbitrarily be cut off at whatever word fits best but will have an ellipsis at the end.
    </div>
    <div class="qrytxt">
        <span class="ellipsis">&hellip;</span>
        Some more long text which will arbitrarily be cut off at whatever word fits best but will have an ellipsis at the end.
    </div>
    <div class="qrytxt">
        <span class="ellipsis">&hellip;</span>
        Short text. Fail!
    </div>
</body>

</html>

В этом есть один недостаток: если текст достаточно короткий, чтобы его можно было полностью отобразить, эллипсы также будут отображаться.

[ПРАВКА: 26.06.2009]

По предложению Power-Coder я немного пересмотрел это. На самом деле есть только два изменения: добавление doctype (см. Примечания ниже) и добавление атрибута display: inline-block в .qrytxt DIV. Вот как это выглядит сейчас ...

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
    <style>
        div.sidebox 
        {
            width: 25%;
        }

        div.sidebox div.qrytxt
        {
            height: 1em;
            line-height: 1em;
            overflow: hidden;
            display: inline-block;
        }

        div.sidebox div.qrytxt span.ellipsis
        {
            float: right;
        }
</style>
</head>

<body>
    <div class="sidebox">
        <div class="qrytxt">
            <span class="ellipsis">&hellip;</span>
            Some long text which will arbitrarily be cut off at whatever word fits best but will have an ellipsis at the end.
        </div>

        <div class="qrytxt">
            <span class="ellipsis">&hellip;</span>
            Some more long text which will arbitrarily be cut off at whatever word fits best but will have an ellipsis at the end.
        </div>

        <div class="qrytxt">
            <span class="ellipsis">&hellip;</span>
            Short text. FTW
        </div>
    </div>
</body>
</html>

Примечания:

  • Просмотр в IE 8.0, Opera 9, FF 3

  • A doctype требуется для IE, чтобы display: inline-block работал правильно.

  • Если переполнение .qrytxt DIV происходит в длинном слове, между многоточием и последним видимым словом будет большой разрыв. Вы можете увидеть это, просмотрев пример и изменив ширину вашего браузера с небольшими приращениями. (это, вероятно, существовало и в оригинальном примере, я просто, возможно, тогда не заметил)

Опять же, несовершенное решение только для CSS. Javascript может быть единственной вещью, которая может получить идеальный эффект.

[ПРАВКА: 27.06.2009]

Вот еще одна альтернатива, которая использует специфичные для браузера расширения.

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">

<html>
<head>
    <style>
        div.sidebox 
        {
            width: 26%;
        }

        div.sidebox div.qrytxt
        {
            height: 1em;
            line-height: 1em;
            overflow: hidden;
            text-overflow:ellipsis;
            -o-text-overflow:ellipsis;
            -ms-text-overflow:ellipsis;
            -moz-binding:url(ellipsis-xbl.xml#ellipsis);
            white-space:nowrap;
        }
    </style>
</head>

<body>
    <div class="sidebox">
        <div class="qrytxt">
            Some long text which will arbitrarily be cut off at whatever word fits best but will have an ellipsis at the end.
        </div>

        <div class="qrytxt">
            Some more long text which will arbitrarily be cut off at whatever word fits best but will have an ellipsis at the end.
        </div>

        <div class="qrytxt">
            Short text. FTW
        </div>
    </div>
</body>
</html>

Обратите внимание, что для работы приведенного выше примера необходимо создать файл xml, на который ссылается правило -moz-binding, ellipsis-xbl.xml . Он должен содержать следующий xml:

<?xml version="1.0" encoding="UTF-8"?>
  <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>
4 голосов
/ 04 сентября 2008

Вы также можете довольно легко использовать немного JavaScript:

document.getElementByID("qrytxt").offsetWidth;

даст вам ширину элемента в пикселях и даже работает в IE6. Если вы добавляете диапазон, содержащий эллипсы, в конец каждого запроса, можно использовать простой логический тест в JavaScript с небольшим количеством манипуляций с CSS, чтобы при необходимости скрыть / показать их.

2 голосов
/ 26 июня 2009

PHP следует полностью исключить из-за того факта, что, хотя есть функция, предназначенная для измерения шрифтов, http://www.php.net/imageftbbox, у PHP нет способа узнать, имеет ли посетитель минимальный размер шрифта. настройка, превышающая ожидаемый размер шрифта.

2 голосов
/ 29 августа 2008

@ Роберт

что, если вы поместите эллипсы в div с низким z-index, чтобы при перемещении влево (для более коротких линий) они покрывались фоновым изображением или чем-то еще?

Я знаю, что это довольно глупо, но стоит попробовать, верно?

edit Другая идея: определить положение div, содержащего эллипсы, с помощью javascript, и, если он не сдвинут полностью, скрыть его?

2 голосов
/ 29 августа 2008

Есть ли у CSS способ?

нет

Нет

Есть ли PHP?

нет

Нет

-

Для этого вам нужно получить метрики шрифта для каждого символа и применить их ко всем вашим буквам в вашей строке. Хотя вы можете сделать это, используя на сервере библиотеку для рисования / рендеринга, например ImageMagick, на самом деле это не сработает, потому что разные браузеры в разных ОС по-разному отображают шрифты.

Даже если бы это сработало, вы бы не захотели это сделать, потому что для рендеринга также потребовалось бы вечное время. Ваш сервер сможет выдавать 1 страницу в секунду (если это так) вместо нескольких тысяч.

Если вы можете жить без трейлинга ..., тогда вы можете подделать его, используя теги div и css overflow: hidden, например:

.line_of_text {
    height:1.3em;
    line-height:1.3em;
    overflow:hidden;
}

<div class="line_of_text"> Some long text which will arbitrarily be cut off at whatever word fits best</div>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...