2008-08-29 2 views
7

In meiner (PHP) Webapp, habe ich einen Teil meiner Website, die einen Verlauf der letzten Suchen hält. Die letzten Abfragen werden in einer Seitenbox angezeigt. Wenn der Abfragetext zu lang ist, schneide ich ihn ab und zeige Ellipsen an. ZB: "Meine sehr lange Abfrage ist ..."Ermitteln der Breite einer gedruckten Zeichenfolge durch eine Webapp

Derzeit truncate ich nach einer bestimmten Anzahl von Zeichen. Da die Schriftart nicht ein Monotyp ist, ist eine Abfrage aller I's enger als eine Abfrage aller Ws. Ich möchte, dass alle vor den Ellipsen ungefähr die gleiche Breite haben. Gibt es eine Möglichkeit, um die ungefähre Breite der resultierenden Zeichenfolge zu erhalten, so dass die Ellipsen für eine beliebige Zeichenfolge in etwa der gleichen Anzahl von Pixeln von Anfang an auftreten? Hat CSS einen Weg? Ist PHP? Würde das besser mit JavaScript gehandhabt?

Antwort

7

Hier ist eine andere auf sie nehmen, und Sie müssen nicht zu Lebe ohne die Ellipse!

Es gibt einen Fehler mit diesem, wenn der Text kurz genug ist, um vollständig angezeigt zu werden, werden die Ellipsen immer noch angezeigt.

[EDIT: 2009.06.26]

Auf Anregung von Power Coder ich diese ein wenig überarbeitet. Es gibt wirklich nur zwei Änderungen, die Addition der doctype (siehe Hinweise unten) und die Hinzufügung des display: inline-block Attributs auf dem .qrytxt DIV. Hier ist, wie es jetzt aussieht ...

<!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> 

Hinweise:

  • gesehen in IE 8.0, Opera 9, FF 3

  • A doctype für IE erforderlich ist, erhalten die display: inline-block funktioniert ordnungsgemäß.

  • Wenn die .qrytxt DIV des Überlauf tritt auf einem langen Wort, es geht um eine große Lücke zwischen den drei Punkten und dem letzten sichtbaren Wort sein. Sie können dies sehen, indem Sie das Beispiel betrachten und die Größe Ihres Browsers in kleinen Schritten ändern. (das gab es wahrscheinlich auch im Original-Beispiel, ich habe es vielleicht gerade nicht bemerkt)

Also wieder eine unvollkommene CSS-Lösung. Javascript kann die einzige Sache sein, die den Effekt perfekt erhalten kann.

[EDIT: 2009.06.27]

Hier ist eine weitere Alternative, die Browser-spezifische Erweiterungen verwendet.

<!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> 

Beachten Sie, dass für das obige Beispiel, um zu arbeiten, können Sie die XML-Datei durch die -moz-binding Regel verwiesen erstellen müssen, Ellipsen-xbl.xml. Es ist sollte folgende xml enthalten:

<?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> 
+0

Ich mag diese Antwort, wir sollten es mit einer Problemumgehung für das Kurztext-Problem aktualisieren. Ich sehe was ich tun kann. –

+0

Ich habe eine Alternative hinzugefügt. Aber immer noch nicht perfekt :( –

+1

Hier sind zwei zusätzliche Gedanken. Erstens, verwenden Sie & hellip; für Auslassungspunkte, "..." ist nicht das gleiche wie "...". Zweitens, warum alle schwebenden Spannen beginnen mit? Sie können die lassen browser fügen Sie dem div bei Bedarf automatisch die Ellipse zum div hinzu (durch Angabe von text-overflow: Ellipse für IE, -o-text-overflow: Ellipse für Opera und Verwendung der -moz-Binding-Problemumgehung für FF). –

2

Hat CSS einen Weg?

Kein

Does PHP?

Kein

-

zu tun, dass Sie für jedes Zeichen die Fontmetriken erhalten müssten, und wenden sie in der Zeichenfolge auf alle Ihre Briefe. Während Sie dies tun könnten, indem Sie eine Zeichnungs-/Rendering-Bibliothek wie ImageMagick auf dem Server verwenden, würde es nicht wirklich funktionieren, da verschiedene Browser auf verschiedenen Betriebssystemen die Zeichensätze unterschiedlich darstellen.

Auch wenn es funktioniert, würden Sie es nicht tun wollen, weil es auch ewig dauern würde zu rendern. Ihr Server wäre in der Lage, 1 Seite pro Sekunde (wenn das) anstelle von mehreren tausend zu drücken.

Wenn Sie können, ohne den hinteren leben ..., dann können Sie gut fälschen mit div-Tags und CSS overflow: hidden, wie folgt aus:

.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> 
2

@ Robert

was ist, wenn Sie die Ellipsen in einem div mit einem niedrigen z-index gelegt, so dass, wenn es nach links bewegt (für kürzere Linien) bekommen sie vertuscht durch ein Hintergrundbild oder etwas?

es ist ziemlich hacky ich weiß, aber hey einen Versuch wert, oder?

bearbeiten Eine andere Idee: Bestimmen Sie die Position des div mit den Ellipsen mit Javascript und wenn es nicht ganz nach rechts geschoben wird, verstecken Sie es?

4

Sie können auch ganz einfach ein wenig Javascript verwenden:

document.getElementByID("qrytxt").offsetWidth; 

geben Ihnen die Breite eines Elements in Pixeln und arbeitet auch in IE6. Wenn Sie am Ende jeder Abfrage einen Bereich mit Ellipsen anfügen, kann ein einfacher logischer Test in JavaScript mit ein wenig CSS-Manipulation verwendet werden, um sie bei Bedarf zu verstecken oder anzuzeigen.

2

PHP sollte völlig außer Acht gelassen werden, denn obwohl es eine Funktion zum Messen von Fonts gibt, http://www.php.net/imageftbbox, gibt es für PHP keine Möglichkeit zu wissen, ob der Besucher eine minimale Schriftgröße hat, die größer ist als Ihre erwartete Schriftgröße.

Verwandte Themen