Giới hạn độ dài văn bản ở n dòng bằng CSS


515

Có thể giới hạn độ dài văn bản thành các dòng "n" bằng CSS (hoặc cắt nó khi tràn theo chiều dọc).

text-overflow: ellipsis; chỉ hoạt động cho văn bản 1 dòng.

văn bản gốc:

Ultrices natoque mus mattis, aliquam, cras in pellentesque
tincidunt elit purus speechus, vel ut aliquet, Elementum nunc
nunc rhoncus placerat urna! Ngồi yên đi! Út penatibus turpis
mus tincidunt! Dapibus sed aenean, magna sagittis, lorem velit

đầu ra mong muốn (2 dòng):

Ultrices natoque mus mattis, aliquam, cras in pellentesque
tincidunt elit purus speechus, vel ut aliquet, Elementum ...


1
Chỉ cần một lưu ý: dấu chấm lửng tràn văn bản không được hỗ trợ trên Firefox, xem bugzilla.mozilla.org/show_orms.cgi?id=312156
Joril

8
dường như ai đó đã thoát khỏi nó bằng cách chỉ css mobify.com/dev/multiline-ellipsis-in-pure-css
Gaurav Shah

không hoạt động trên IE10. Nó hoạt động vào 11.
user2060451

@GauravShah Cảm ơn bạn. Nó cũng hoạt động trên IE10. Hầu hết các giải pháp ở đây không phải là trình duyệt chéo.
dùng2060451

Câu trả lời:


655

Có một cách để làm điều đó bằng cú pháp kẹp dòng không chính thức và bắt đầu với Firefox 68, nó hoạt động trong tất cả các trình duyệt chính.

body {
   margin: 20px;
}

.text {
   overflow: hidden;
   text-overflow: ellipsis;
   display: -webkit-box;
   -webkit-line-clamp: 2; /* number of lines to show */
   -webkit-box-orient: vertical;
}
<div class="text">
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aliquam consectetur venenatis blandit. Praesent vehicula, libero non pretium vulputate, lacus arcu facilisis lectus, sed feugiat tellus nulla eu dolor. Nulla porta bibendum lectus quis euismod. Aliquam volutpat ultricies porttitor. Cras risus nisi, accumsan vel cursus ut, sollicitudin vitae dolor. Fusce scelerisque eleifend lectus in bibendum. Suspendisse lacinia egestas felis a volutpat.
</div>

Trừ khi bạn quan tâm đến người dùng IE, không cần phải làm gì line-heightmax-heightdự phòng.


3
ví dụ, với kích thước phông chữ nhất định cho chiều cao dòng, bạn cũng có thể thấy một phần của dòng tiếp theo với căn chỉnh văn bản: biện minh, dấu chấm lửng không ở cuối dòng cuối cùng, nhưng chồng lấp văn bản ở vị trí, nó sẽ là, nếu văn bản được căn chỉnh sang trái
Matus

3
Đây là fiddle: jsfiddle.net/csYjC/1122 khi tôi đang chuẩn bị, tôi phát hiện ra rằng một phần của dòng cuối cùng chỉ hiển thị khi có phần đệm
Matus

Chà, không ai nói rằng ma thuật đen chỉ phi tiêu chuẩn webkit này sẽ hoạt động hoàn hảo mọi lúc. Bạn có thể sử dụng phần đệm trên một số khác, có thể là cha mẹ, container. Viết văn bản trong thẻ <p> có ý nghĩa hoàn hảo: jsfiddle.net/csYjC/1129
Evgeny

2
Lưu ý rằng, như nhận xét này, -webkit-line-Kẹp không tôn trọng khả năng hiển thị: ẩn. Điều này làm tôi mất vài giờ để gỡ lỗi. Đây là một báo cáo lỗi hỗ trợ: bug.webkit.org/show_orms.cgi?id=45399 .
Kevin

3
Nếu bạn gặp vấn đề với -webkit-box-orient: vertical;việc bị ẩn khi biên dịch scss, hãy thử điều này /* autoprefixer: ignore next */ -webkit-box-orient: vertical;
Salam

109

Những gì bạn có thể làm là như sau:

.max-lines {
  display: block;/* or inline-block */
  text-overflow: ellipsis;
  word-wrap: break-word;
  overflow: hidden;
  max-height: 3.6em;
  line-height: 1.8em;
}
<p class="max-lines">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc vitae leo dapibus, accumsan lorem eleifend, pharetra quam. Quisque vestibulum commodo justo, eleifend mollis enim blandit eu. Aenean hendrerit nisl et elit maximus finibus. Suspendisse scelerisque consectetur nisl mollis scelerisque.</p>

trong đó max-height:= line-height:× <number-of-lines>trong em.


13
Đang hoạt động như tràn văn bản: clip, vì nó không hiển thị (...)
rishiAgar

Có vẻ là giải pháp tốt nhất có thể cho tôi, nhưng như @rishiAgar lưu ý không kết thúc bằng dấu chấm lửng. Tiếp tục hoạt động như clip.
David Carrigan

Tôi tin rằng bạn sẽ phải thêm các thuộc tính display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical;để làm cho dấu chấm lửng xuất hiện. Nhưng điều này sẽ chỉ hoạt động trong Chrome. Để biết giải pháp cũng hoạt động trên Firefox, hãy xem tại đây: stackoverflow.com/a/20595073/1884158 Và đây là một hướng dẫn hữu ích về chủ đề: css-tricks.com/line-clampin
modulitos

34

Giải pháp đa trình duyệt hoạt động

Vấn đề này đã gây khó chịu cho tất cả chúng ta trong nhiều năm.

Để giúp đỡ trong mọi trường hợp, tôi đã đưa ra cách tiếp cận CSS duy nhất và cách tiếp cận jQuery trong trường hợp các cảnh báo css là một vấn đề.

Đây là một giải pháp CSS duy nhất mà tôi đã đưa ra với nó hoạt động trong mọi tình huống, với một vài cảnh báo nhỏ.

Điều cơ bản là đơn giản, nó che giấu sự tràn của nhịp và đặt chiều cao tối đa dựa trên chiều cao của đường theo đề xuất của Eugene Xa.

Sau đó, có một lớp giả sau div có chứa dấu chấm lửng độc đáo.

Hãy cẩn thận

Giải pháp này sẽ luôn đặt dấu chấm lửng, bất kể nếu có nhu cầu.

Nếu dòng cuối cùng kết thúc bằng một câu kết thúc, bạn sẽ kết thúc bằng bốn dấu chấm ....

Bạn sẽ cần phải hài lòng với căn chỉnh văn bản hợp lý.

Dấu chấm lửng sẽ ở bên phải của văn bản, có thể trông cẩu thả.

Mã + Đoạn trích

jsfiddle

.text {
  position: relative;
  font-size: 14px;
  color: black;
  width: 250px; /* Could be anything you like. */
}

.text-concat {
  position: relative;
  display: inline-block;
  word-wrap: break-word;
  overflow: hidden;
  max-height: 3.6em; /* (Number of lines you want visible) * (line-height) */
  line-height: 1.2em;
  text-align:justify;
}

.text.ellipsis::after {
  content: "...";
  position: absolute;
  right: -12px; 
  bottom: 4px;
}

/* Right and bottom for the psudo class are px based on various factors, font-size etc... Tweak for your own needs. */
<div class="text ellipsis">
  <span class="text-concat">
Lorem ipsum dolor sit amet, nibh eleifend cu his, porro fugit mandamus no mea. Sit tale facete voluptatum ea, ad sumo altera scripta per, eius ullum feugait id duo. At nominavi pericula persecuti ius, sea at sonet tincidunt, cu posse facilisis eos. Aliquid philosophia contentiones id eos, per cu atqui option disputationi, no vis nobis vidisse. Eu has mentitum conclusionemque, primis deterruisset est in.

Virtute feugait ei vim. Commune honestatis accommodare pri ex. Ut est civibus accusam, pro principes conceptam ei, et duo case veniam. Partiendo concludaturque at duo. Ei eirmod verear consequuntur pri. Esse malis facilisis ex vix, cu hinc suavitate scriptorem pri.
  </span>
</div>

Phương pháp tiếp cận jQuery

Theo tôi đây là giải pháp tốt nhất, nhưng không phải ai cũng có thể sử dụng JS. Về cơ bản, jQuery sẽ kiểm tra bất kỳ phần tử .text nào và nếu có nhiều ký tự hơn var tối đa được đặt trước, nó sẽ cắt phần còn lại và thêm dấu chấm lửng.

Không có lời cảnh báo nào cho cách tiếp cận này, tuy nhiên ví dụ mã này chỉ nhằm thể hiện ý tưởng cơ bản - Tôi sẽ không sử dụng nó trong sản xuất mà không cải thiện nó vì hai lý do:

1) Nó sẽ viết lại html bên trong của elt .text. dù cần hay không. 2) Không có kiểm tra nào để kiểm tra xem html bên trong không có các phần tử lồng nhau - vì vậy bạn đang phụ thuộc rất nhiều vào tác giả để sử dụng chính xác .text.

Đã chỉnh sửa

Cảm ơn bạn đã bắt @markzzz

Mã & Đoạn

jsfiddle

setTimeout(function()
{
	var max = 200;
  var tot, str;
  $('.text').each(function() {
  	str = String($(this).html());
  	tot = str.length;
    str = (tot <= max)
    	? str
      : str.substring(0,(max + 1))+"...";
    $(this).html(str);
  });
},500); // Delayed for example only.
.text {
  position: relative;
  font-size: 14px;
  color: black;
  font-family: sans-serif;
  width: 250px; /* Could be anything you like. */
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<p class="text">
Old men tend to forget what thought was like in their youth; they forget the quickness of the mental jump, the daring of the youthful intuition, the agility of the fresh insight. They become accustomed to the more plodding varieties of reason, and because this is more than made up by the accumulation of experience, old men think themselves wiser than the young.
</p>

<p class="text">
Old men tend to forget what thought was like in their youth;
</p>
 <!-- Working Cross-browser Solution

This is a jQuery approach to limiting a body of text to n words, and end with an ellipsis -->


3
Giải pháp css của bạn không tốt lắm, vì sao trường hợp văn bản không bị tràn? nó cũng được hiển thị "..." ...
user5260143

Nhưng phiên bản jQuery cũng thêm dấu chấm nếu văn bản ngắn hơn: jsfiddle.net/o82opadm353
markzzz

@markzzz - cảm ơn vì điều đó, không biết tôi đã bỏ lỡ nó như thế nào :-) Tôi đã sửa đổi nó ngay bây giờ, nhưng đó không phải là thứ tôi sẽ sử dụng trong sản xuất mà không cần thêm một chút công việc. Nhưng ít nhất là ý tưởng cơ bản được đặt ra.
asimovwasright

1
Tôi thấy rằng giải pháp chỉ CSS có vẻ hoạt động tốt, nhưng chỉ khi bạn chỉ sử dụng các phép đo pixel. EM và tỷ lệ phần trăm khiến tôi gặp rắc rối. Và tôi đã thêm dấu chấm lửng dưới dạng <a> theo kiểu vào vị trí: tuyệt đối ở dưới cùng bên phải cho những ai muốn nhấp vào liên kết và đọc thêm. Trong trường hợp của tôi, tôi biết văn bản sẽ luôn tràn, vì vậy jQuery không cần thiết. Cảm ơn giải pháp CSS hữu ích!
Mentalist

30

Theo như tôi có thể thấy, điều này chỉ có thể được sử dụng height: (some em value); overflow: hiddenvà thậm chí sau đó nó sẽ không còn lạ mắt ...nữa.

Nếu đó không phải là một tùy chọn, tôi nghĩ rằng không thể xử lý trước một số máy chủ (khó khăn vì luồng văn bản không thể dự đoán một cách đáng tin cậy) hoặc jQuery (có thể nhưng có thể phức tạp).


16
Điều này dường như hoạt động cho bất kỳ kích thước phông chữ .mytext {overflow: hidden; chiều cao dòng: 1,2em; chiều cao tối đa: 2,4em; }
Peter

1
@Pedro vâng. Bạn có thể có thể chạy qua từng .mytextsử dụng jQuery, tìm hiểu xem nó có nhiều nội dung hơn hiển thị hay không và thêm ...thủ công. Theo cách đó, bạn tương thích với các máy khách không có JS và các máy khách có JS có thể có trang trí. Có thể đáng giá một câu hỏi riêng cho một Chuyên gia jQuery trả lời; thể có thể thực hiện tương đối dễ dàng
Pekka

15

Giải pháp từ chủ đề này là sử dụng plugin jquery dotdotdot . Không phải là một giải pháp CSS, nhưng nó cung cấp cho bạn rất nhiều tùy chọn cho các liên kết "đọc thêm", thay đổi kích thước động, v.v.


10

lớp CSS sau đây đã giúp tôi có được dấu chấm lửng hai dòng.

  .two-line-ellipsis {
        padding-left:2vw;
        text-overflow: ellipsis;
        overflow: hidden;
        width: 325px;
        line-height: 25px;
        display: -webkit-box;
        -webkit-line-clamp: 2;
        -webkit-box-orient: vertical;
        padding-top: 15px;
    }

5

Hiện tại bạn không thể, nhưng trong tương lai bạn sẽ có thể sử dụng text-overflow:ellipis-lastline. Hiện tại nó có sẵn với tiền tố nhà cung cấp trong Opera 10.60+: ví dụ


5
Điều đó không hoạt động đối với các chuỗi đa dòng, vì nó cũng yêu cầu thiết lập dấu vết trắng: nowrap. Xem ở đây .
Sebastian Noack

4

Tôi có một giải pháp hoạt động tốt nhưng thay vì dấu chấm lửng, nó sử dụng một gradient. Nó hoạt động khi bạn có văn bản động để bạn không biết liệu nó có đủ dài để cần một hình elip hay không. Ưu điểm là bạn không phải thực hiện bất kỳ tính toán JavaScript nào và nó hoạt động cho các thùng chứa có chiều rộng thay đổi bao gồm các ô của bảng và là trình duyệt chéo. Nó sử dụng một vài div phụ, nhưng nó rất dễ thực hiện.

Đánh dấu:

<td>
    <div class="fade-container" title="content goes here">
         content goes here
         <div class="fade">
    </div>
</td>

CSS:

.fade-container { /*two lines*/
    overflow: hidden;
    position: relative;
    line-height: 18px; 
    /* height must be a multiple of line-height for how many rows you want to show (height = line-height x rows) */
    height: 36px;
    -ms-hyphens: auto;
    -webkit-hyphens: auto;
    hyphens: auto;
    word-wrap: break-word;
}

.fade {
        position: absolute;
        top: 50%;/* only cover the last line. If this wrapped to 3 lines it would be 33% or the height of one line */
        right: 0;
        bottom: 0;
        width: 26px;
        background: linear-gradient(to right,  rgba(255,255,255,0) 0%,rgba(255,255,255,1) 100%);
}

bài đăng trên blog: http://salzerdesign.com/blog/?p=453

trang ví dụ: http://salzerdesign.com/test/fade.html


3
.class{
   word-break: break-word;
   overflow: hidden;
   text-overflow: ellipsis;
   display: -webkit-box;
   line-height: 16px; /* fallback */
   max-height: 32px; /* fallback */
   -webkit-line-clamp: 2; /* number of lines to show */
   -webkit-box-orient: vertical;
}

0

Tôi thực sự thích kẹp đường, nhưng chưa hỗ trợ cho firefox .. vì vậy tôi đi với một phép toán calc và chỉ che giấu phần tràn

.body-content.body-overflow-hidden h5 {
    max-height: 62px;/* font-size * line-height * lines-to-show(4 in this case) 63px if you go with jquery */
    overflow: hidden;
}
.body-content h5 {
    font-size: 14px; /* need to know this*/
    line-height:1,1; /*and this*/
}

bây giờ hãy nói rằng bạn muốn xóa và thêm lớp này thông qua jQuery bằng một liên kết, bạn sẽ cần phải có thêm một pixel để chiều cao tối đa của nó sẽ là 63 px, điều này là do bạn cần kiểm tra mỗi lần nếu chiều cao lớn hơn 62px, nhưng trong trường hợp 4 dòng, bạn sẽ nhận được sai true, do đó, một pixel phụ sẽ khắc phục điều này và nó sẽ không tạo thêm bất kỳ vấn đề nào

Tôi sẽ dán một coffeescript cho điều này chỉ là một ví dụ, sử dụng một vài liên kết được ẩn theo mặc định, với các lớp đọc nhiều hơn và không đọc, nó sẽ loại bỏ những cái mà tràn không cần nó và loại bỏ phần thân các lớp học

jQuery ->

    $('.read-more').each ->
        if $(this).parent().find("h5").height() < 63
             $(this).parent().removeClass("body-overflow-hidden").find(".read-less").remove()
             $(this).remove()
        else
            $(this).show()

    $('.read-more').click (event) ->
        event.preventDefault()
        $(this).parent().removeClass("body-overflow-hidden")
        $(this).hide()
        $(this).parent().find('.read-less').show()

    $('.read-less').click (event) ->
        event.preventDefault()
        $(this).parent().addClass("body-overflow-hidden")
        $(this).hide()
        $(this).parent().find('.read-more').show()

Nhân tiện, đừng thêm đường kẹp vào cái này, nó sẽ đặt chiều cao thành 62px (đối với trường hợp này) và bạn sẽ không có sự bắt buộc ghê gớm
Alexis

0

Nếu bạn muốn tập trung vào từng letterbạn có thể làm như vậy, tôi đề cập đến câu hỏi này

Nếu bạn muốn tập trung vào từng wordbạn có thể làm như thế + không gian

Nếu bạn muốn tập trung vào từng wordbạn có thể làm như vậy + không có khoảng trống


-1

Mã ví dụ cơ bản, học mã rất dễ. Kiểm tra nhận xét CSS Kiểu.

table tr {
  display: flex;
}
table tr td {
  /* start */
  display: inline-block; /* <- Prevent <tr> in a display css */
  text-overflow: ellipsis;
  white-space: nowrap;
  /* end */
  padding: 10px;
  width: 150px; /* Space size limit */
  border: 1px solid black;
  overflow: hidden;
}
<table>
  <tbody>
    <tr>
      <td>
        Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla egestas erat ut luctus posuere. Praesent et commodo eros. Vestibulum eu nisl vel dui ultrices ultricies vel in tellus.
      </td>
      <td>
        Praesent vitae tempus nulla. Donec vel porta velit. Fusce mattis enim ex. Mauris eu malesuada ante. Aenean id aliquet leo, nec ultricies tortor. Curabitur non mollis elit. Morbi euismod ante sit amet iaculis pharetra. Mauris id ultricies urna. Cras ut
        nisi dolor. Curabitur tellus erat, condimentum ac enim non, varius tempor nisi. Donec dapibus justo odio, sed consequat eros feugiat feugiat.
      </td>
      <td>
        Pellentesque mattis consequat ipsum sed sagittis. Pellentesque consectetur vestibulum odio, aliquet auctor ex elementum sed. Suspendisse porta massa nisl, quis molestie libero auctor varius. Ut erat nibh, fringilla sed ligula ut, iaculis interdum sapien.
        Ut dictum massa mi, sit amet interdum mi bibendum nec.
      </td>
    </tr>
    <tr>
      <td>
        Sed viverra massa laoreet urna dictum, et fringilla dui molestie. Duis porta, ligula ut venenatis pretium, sapien tellus blandit felis, non lobortis orci erat sed justo. Vivamus hendrerit, quam at iaculis vehicula, nibh nisi fermentum augue, at sagittis
        nibh dui et erat.
      </td>
      <td>
        Nullam mollis nulla justo, nec tincidunt urna suscipit non. Donec malesuada dolor non dolor interdum, id ultrices neque egestas. Integer ac ante sed magna gravida dapibus sit amet eu diam. Etiam dignissim est sit amet libero dapibus, in consequat est
        aliquet.
      </td>
      <td>
        Vestibulum mollis, dui eu eleifend tincidunt, erat eros tempor nibh, non finibus quam ante nec felis. Fusce egestas, orci in volutpat imperdiet, risus velit convallis sapien, sodales lobortis risus lectus id leo. Nunc vel diam vel nunc congue finibus.
        Vestibulum turpis tortor, pharetra sed ipsum eu, tincidunt imperdiet lorem. Donec rutrum purus at tincidunt sagittis. Quisque nec hendrerit justo.
      </td>
    </tr>
  </tbody>
</table>


4
OP đang tìm kiếm một giải pháp nhiều dòng. Điều này chỉ hoạt động trên các dòng văn bản duy nhất.
asimovwasright

-11

Tôi đã tìm kiếm xung quanh cho điều này, nhưng sau đó tôi nhận ra, trang web của tôi sử dụng php !!! Tại sao không sử dụng chức năng cắt trên đầu vào văn bản và chơi với độ dài tối đa ....

Đây cũng là một giải pháp khả thi cho những người sử dụng php: http://ideone.com/PsTaI

<?php
$s = "In the beginning there was a tree.";
$max_length = 10;

if (strlen($s) > $max_length)
{
   $offset = ($max_length - 3) - strlen($s);
   $s = substr($s, 0, strrpos($s, ' ', $offset)) . '...';
}

echo $s;
?>

18
Bạn không thể sử dụng xử lý phía máy chủ một cách an toàn vì bạn không thể biết trước văn bản sẽ chiếm bao nhiêu dung lượng trong trang. Nó phụ thuộc vào kích thước phông chữ, cài đặt kích thước văn bản trình duyệt, mức thu phóng trình duyệt, v.v.
ermannob
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.