2008-08-29 35 views
7

Trong ứng dụng web (PHP) của tôi, tôi có một phần của trang web lưu giữ lịch sử tìm kiếm gần đây. Các truy vấn gần đây nhất được hiển thị trong hộp bên. Nếu văn bản truy vấn quá dài, tôi cắt ngắn và hiển thị hình elip. Ví dụ: "Truy vấn rất dài của tôi là ..."Xác định chiều rộng của chuỗi in bằng webapp

Hiện tại, tôi cắt ngắn sau một số ký tự nhất định. Vì phông chữ không phải là kiểu mẫu, nên truy vấn của tất cả tôi là hẹp hơn so với truy vấn của tất cả các chữ W. Tôi muốn tất cả chúng đều có chiều rộng tương tự trước hình elip. Có cách nào để có được chiều rộng gần đúng của chuỗi kết quả sao cho các dấu ba chấm cho bất kỳ chuỗi nhất định nào sẽ xuất hiện trong cùng một số pixel từ đầu? CSS có cách nào không? Có PHP không? Điều này sẽ được xử lý tốt hơn bằng JavaScript?

Trả lời

7

Đây là một mất vào nó và bạn không cần phải sống mà không có dấu chấm lửng!

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

Có một lỗ hổng với điều này, nếu văn bản đủ ngắn để được hiển thị đầy đủ, các dấu ba chấm vẫn sẽ được hiển thị.

[EDIT: 6/26/2009]

Theo đề xuất của Power-Coder, tôi đã sửa đổi điều này một chút. Thực sự chỉ có hai thay đổi, việc bổ sung doctype (xem ghi chú bên dưới) và bổ sung thuộc tính display: inline-block trên số .qrytxt DIV. Đây là những gì nó trông giống như bây giờ ...

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

Ghi chú:

  • xem trong IE 8.0, Opera 9, FF 3

  • Một doctype là cần thiết cho IE để có được display: inline-block để hoạt động chính xác.

  • Nếu tràn của DIV xảy ra trên một từ dài, sẽ có khoảng cách rộng giữa dấu ba chấm và từ hiển thị cuối cùng. Bạn có thể thấy điều này bằng cách xem ví dụ và thay đổi kích thước chiều rộng trình duyệt của bạn theo từng bước nhỏ. (điều này có thể đã tồn tại trong ví dụ ban đầu, tôi chỉ có thể không nhận thấy nó sau đó)

Vì vậy, một giải pháp CSS không hoàn hảo. Javascript có thể là điều duy nhất có thể có được hiệu ứng hoàn hảo.

[EDIT: 6/27/2009]

Đây là một giải pháp thay thế khác sử dụng tiện ích mở rộng cụ thể của trình duyệt.

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

Lưu ý rằng để cho ví dụ trên để làm việc, bạn phải tạo file xml tham chiếu bởi sự cai trị moz-ràng buộc, ellipsis-xbl.xml. Đó là nên chứa xml sau:

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

Tôi thích câu trả lời này, chúng ta nên xem xét cập nhật nó với giải pháp cho vấn đề văn bản ngắn. Tôi sẽ xem những gì tôi có thể làm. –

+0

Tôi đã thêm một giải pháp thay thế. Tuy nhiên, không hoàn hảo: ( –

+1

Đây là hai suy nghĩ bổ sung. Đầu tiên, sử dụng & hellip; cho dấu chấm lửng, "..." không giống như "...". Thứ hai, tại sao tất cả các nhịp nổi để bắt đầu? Bạn có thể để trình duyệt thêm dấu chấm lửng vào div hoàn toàn tự động khi cần thiết (bằng cách chỉ định tràn văn bản: dấu chấm lửng cho IE, -o-text-overflow: dấu ba chấm cho Opera và sử dụng giải pháp moz-binding cho FF) –

2

CSS có cách nào không?

Không

Liệu PHP?

Không

-

Để làm điều đó bạn phải có được các số liệu font cho từng nhân vật, và áp dụng chúng vào tất cả các chữ của bạn trong chuỗi của bạn. Trong khi bạn có thể làm điều này bằng cách sử dụng một thư viện vẽ/vẽ như ImageMagick trên máy chủ, nó sẽ không thực sự hoạt động vì trình duyệt khác nhau trên các phông chữ render của hệ điều hành khác nhau.

Thậm chí nếu nó đã hoạt động, bạn sẽ không muốn làm điều đó, bởi vì nó cũng sẽ mất mãi mãi để hiển thị. Máy chủ của bạn sẽ có thể đẩy 1 trang mỗi giây (nếu có) thay vì vài nghìn.

Nếu bạn có thể sống mà không có dấu ..., sau đó bạn có thể độc đáo giả nó bằng cách sử div thẻ và css overflow: hidden, như thế này:

.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

gì xảy ra nếu bạn đặt elip trong một div với mức thấp z-index để khi nó di chuyển sang bên trái (đối với dòng ngắn hơn) họ nhận được che đậy bởi hình nền hay gì đó?

nó khá hacky Tôi biết, nhưng hey đáng thử phải không?

chỉnh sửa Một ý tưởng khác: xác định vị trí của div chứa dấu ba chấm với javascript và nếu nó không được đẩy hết, hãy ẩn nó?

4

Bạn cũng có thể khá dễ dàng sử dụng một chút javascript:

document.getElementByID("qrytxt").offsetWidth; 

sẽ cung cấp cho bạn chiều rộng của một phần tử bằng pixel và thậm chí làm việc trong IE6. Nếu bạn nối thêm một khoảng có chứa dấu ba chấm vào cuối mỗi truy vấn, một phép thử logic đơn giản trong JavaScript với một chút thao tác CSS có thể được sử dụng để ẩn/hiện chúng khi cần.

2

PHP không được xem xét hoàn toàn do thực tế là mặc dù có chức năng được thiết kế để đo phông chữ, http://www.php.net/imageftbbox, không có cách nào để PHP biết liệu khách truy cập có thiết lập kích thước phông chữ tối thiểu hay không so với kích thước phông chữ được mong đợi của bạn.

Các vấn đề liên quan