css ellipsis บนบรรทัดที่สอง


208

CSS text-overflow: ellipsisในบรรทัดที่สองเป็นไปได้ไหม ฉันหามันไม่เจอในเน็ต

ตัวอย่าง:

สิ่งที่ฉันต้องการเป็นเช่นนี้:

I hope someone could help me. I need 
an ellipsis on the second line of...

แต่สิ่งที่เกิดขึ้นคือ:

I hope someone could help me. I ... 

3
AFAIK จุดไข่ปลาจะปรากฏขึ้นและตัดข้อความที่ส่วนท้ายของความกว้างขององค์ประกอบ มันจะไม่ไหลไปยังบรรทัดถัดไป ทางออกที่ดีที่สุดที่นี่คือการใช้สคริปต์เซิร์ฟเวอร์หรือฝั่งไคลเอ็นต์ซึ่งตัดข้อความโดยอัตโนมัติตามจำนวนอักขระที่ต้องการจากนั้นผนวกจุดไข่ปลาต่อท้าย ฉันเดาว่าสคริปต์ฝั่งไคลเอ็นต์จะดีกว่าซึ่งจะช่วยให้คุณยังคงมีข้อความต้นฉบับทั้งหมดหากคุณต้องการ
FarligOpptreden

นี่เป็นคำถามที่คล้ายกัน: stackoverflow.com/questions/3922739/…
Evgeny

tl; dr: เป็นไปได้เฉพาะใน webkit
Evgeny

สิ่งที่ฉันเข้าใกล้ที่สุดเพื่อบรรลุเป้าหมายนี้คือการเพิ่มองค์ประกอบ 'หลอก' สำหรับจุดไข่ปลาและวางมันลงในบรรทัดหลังจากองค์ประกอบที่มีข้อความ แต่จุดไข่ปลาหายไปถ้าข้อความองค์ประกอบยาวเกินไปดังนั้นคุณจะต้องตัดแต่งข้อความเพื่อให้ความน่าเชื่อถือนี้
Jonathan

คำตอบ:


105

ข้อกำหนดสำหรับtext-overflow: ellipsis;การทำงานเป็นรุ่นหนึ่งบรรทัดของwhite-space( pre, nowrapฯลฯ ) ซึ่งหมายความว่าข้อความจะไม่ถึงบรรทัดที่สอง

Ergo เป็นไปไม่ได้ใน CSS บริสุทธิ์

แหล่งที่มาของฉันเมื่อฉันกำลังมองหาสิ่งเดียวกันแน่นอนตอนนี้: http://www.quirksmode.org/css/textoverflow.html (Quirksmode ftw!)

แก้ไขหากเทพเจ้า CSS ที่ดีจะนำhttp://www.w3.org/TR/css-overflow-3/#max-linesมาใช้เราสามารถใช้ CSS บริสุทธิ์fragments(ใหม่) และmax-lines(ใหม่) นอกจากนี้ยังมีข้อมูลเพิ่มเติมเกี่ยวกับhttp://css-tricks.com/line-clampin/

แก้ไข 2 WebKit / Blink มีline-clamp: -webkit-line-clamp: 2จะใส่จุดไข่ปลาในบรรทัดที่ 2


9
การเฝ้าดู แต่ดูเหมือนว่าเทพยังไม่ได้อยู่กับเรา: caniuse.com/#search=max-lines
แดเนียล

1
วิธีการบรรลุคุณสมบัติข้างต้นที่มี saas? @Rudie
Bhoomi Bhalani

144

สิ่งนี้ควรใช้กับเบราว์เซอร์ webkit :

overflow: hidden;
text-overflow: ellipsis;
display: -webkit-box;
-webkit-line-clamp: 3;
-webkit-box-orient: vertical;

1
โปรดทราบว่าในฐานะที่เป็นความคิดเห็นนี้ -webkit-line-clamp ไม่เคารพการมองเห็น: ซ่อนอยู่ bugs.webkit.org/show_bug.cgi?id=45399
เควิน

1
เฮ้ - ดูดี แต่ไม่ได้ผลสำหรับฉัน มันก็ทำให้ '...' ที่รับสายยึด แต่ส่วนที่เหลือตัดไม่ได้ของข้อความ (แม้จะมี attr พื้นที่สีขาว)
lemoid

3
คุณอาจต้องเพิ่มoverflow: hiddenเพื่อใช้งานได้
Robert

สิ่งนี้จะไม่ทำงานใน Firefox เว็บคิทไม่รองรับเครื่องยนต์ตุ๊กแก
ZetaPR

นี่ควรเป็นคำตอบที่ยอมรับได้ คุณไม่ต้องการให้ช่องว่างภายในใด ๆ ที่ด้านล่างขององค์ประกอบที่คุณใช้นี้กับทั้งสองเพราะคุณสามารถได้รับส่วนที่เหลือของการแอบดูข้อความ
Tr1stan

34

ตามที่คนอื่นได้ตอบไปแล้วโซลูชัน CSS ที่แท้จริงนั้นไม่มี มีความเป็นjQueryปลั๊กอินที่มีความง่ายต่อการใช้งานก็จะเรียกว่าdotdotdot มันใช้ความกว้างและความสูงของตู้คอนเทนเนอร์เพื่อคำนวณว่ามันต้องการตัดทอนและเพิ่มจุดไข่ปลาหรือไม่

$("#multilinedElement").dotdotdot();

นี่คือjsFiddle


ปลั๊กอินนี้ยังมียูทิลิตี้อื่น ๆ มากมายเช่นการเพิ่มลิงก์ "อ่านเพิ่มเติม" มันยังสามารถแยก URIs และ HTML มาร์กอัป หาดี!
Martin Andersson

2
ฉันลอง jQuery dotdotdot 1.7.3 สำหรับร้านค้าอีคอมเมิร์ซเพื่อ จำกัด ชื่อผลิตภัณฑ์ในหน้าหมวดหมู่กริดกับสองบรรทัด หลังจากการทดสอบอย่างละเอียดเราตัดสินใจที่จะไม่ไปกับปลั๊กอินนี้เพราะบางครั้งหลังจากกะ - รีเฟรชเค้าโครงหน้าหมวดหมู่จะไม่ทำงาน YMMV ในที่สุดเราก็ไปกับโซลูชันวานิลลา JS ที่ง่ายมาก: หาก clientHeight องค์ประกอบของชื่อผลิตภัณฑ์น้อยกว่า scrollHeight ของมันให้ตัดทอนข้อความที่ขอบเขตที่กำหนดไว้ล่วงหน้าและผนวก "... " บางครั้งชื่อผลิตภัณฑ์บางอย่างอาจสั้นเกินไปเนื่องจากขอบเขตที่กำหนดไว้ล่วงหน้า แต่มีเสถียรภาพมาก
thdoan

1
Easty นำไปใช้และทำงานได้อย่างสวยงาม ขอบคุณ!
Rachel S

แม้ว่ามันจะทำงานได้ดี แต่น่าเสียดายที่มันมีปัญหาด้านประสิทธิภาพ หากโครงการของคุณต้องใช้การรีหลายจุดให้พิจารณาตัวเลือกอื่น นอกจากนี้ยังเป็นการเสนอราคาจากที่เก็บ: "เนื่องจากไม่สามารถปรับปรุงประสิทธิภาพได้ปลั๊กอินนี้จึงไม่ได้รับการดูแลรักษาอีกต่อไป"
boyomarinov

1
นอกจากนี้มันจะไม่ทำงานหากข้อความเปลี่ยนแปลงแบบไดนามิกหลังจากโหลด :(
Dejell

34

ฉันพบว่าคำตอบของ Skeep นั้นไม่เพียงพอและต้องการoverflowสไตล์ด้วย:

overflow: hidden;
text-overflow: ellipsis;
-webkit-line-clamp: 2;
display: -webkit-box;
-webkit-box-orient: vertical;

18

หากมีคนใช้ SASS / SCSS และสะดุดกับคำถามนี้ - บางที mixin นี้อาจช่วยได้:

@mixin line-clamp($numLines : 1, $lineHeight: 1.412) {
  overflow: hidden;
  text-overflow: -o-ellipsis-lastline;
  text-overflow: ellipsis;
  display: block;
  /* autoprefixer: off */
  display: -webkit-box;
  -webkit-line-clamp: $numLines;
  -webkit-box-orient: vertical;
  max-height: $numLines * $lineHeight + unquote('em');
}

สิ่งนี้จะเพิ่มจุดไข่ปลาในเบราว์เซอร์ webkit ที่เหลือก็แค่ตัดมันทิ้ง


1
ใช้น้อยฉันต้องเปลี่ยน/* autoprefixer: off */เป็น/*! autoprefixer: off */อย่างอื่น-webkit-box-orient: vertical;ถูกลบออกหลังจากการรวบรวมซึ่งหมายความว่าจุดไข่ปลาที่ไม่เคยแสดง
นาธาน

18

เพียงใช้ตัวหนีบเส้นสำหรับเบราว์เซอร์ที่รองรับ (เบราว์เซอร์ที่ทันสมัยที่สุด) และถอยกลับไปที่ 1 บรรทัดสำหรับรุ่นเก่า

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


    @supports (-webkit-line-clamp: 2) {
      overflow: hidden;
      text-overflow: ellipsis;
      white-space: initial;
      display: -webkit-box;
      -webkit-line-clamp: 2;
      -webkit-box-orient: vertical;
    }
  }

1
พื้นที่สีขาว: เริ่มต้น; ช่วยฉันด้วย
James

10

ช่างน่าละอายที่คุณไม่สามารถทำให้มันเกินสองบรรทัดได้! มันจะยอดเยี่ยมถ้าองค์ประกอบนั้นเป็นบล็อคการแสดงผลและตั้งค่าความสูงเป็น 2em หรือบางอย่างและเมื่อข้อความล้นก็จะแสดงจุดไข่ปลา!

สำหรับซับเดี่ยวคุณสามารถใช้:

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

สำหรับหลายบรรทัดบางทีคุณอาจใช้ Polyfill เช่น jQuery autoellipsis ซึ่งอยู่ใน github http://pvdspek.github.com/jquery.autoellipsis/


ปลั๊กอินนั้นหนักเกินไปสำหรับสิ่งที่ทำ อายุ 5 ปี แทนที่จะใช้dotdotdotกล่าวถึงในโพสต์อื่น
adi518

10

ฉันไม่ใช่มืออาชีพ JS แต่ฉันคิดหาวิธีที่คุณสามารถทำได้

HTML:

<p id="truncate">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi elementum consequat tortor et euismod. Nam commodo consequat libero vel lobortis. Morbi ac nisi at leo vehicula consectetur.</p>

จากนั้นด้วย jQuery คุณตัดทอนให้เหลือเฉพาะจำนวนอักขระ แต่ให้ใช้คำสุดท้ายเช่นนี้:

// Truncate but leave last word
var myTag = $('#truncate').text();
if (myTag.length > 100) {
  var truncated = myTag.trim().substring(0, 100).split(" ").slice(0, -1).join(" ") + "…";
  $('#truncate').text(truncated);
}

ผลลัพธ์จะเป็นดังนี้:

Lorem ipsum dolor sit amet, consipetur adipiscing elit. ผ้า
ELEMENTUM consequat tortor et ...

หรือคุณสามารถตัดทอนให้เหลือเฉพาะจำนวนตัวอักษรดังนี้

// Truncate to specific character
var myTag = $('#truncate').text();
if (myTag.length > 15) {
  var truncated = myTag.trim().substring(0, 100) + "…";
  $('#truncate').text(truncated);
}

ผลลัพธ์จะเป็นดังนี้:

Lorem ipsum dolor sit amet, consipetur adipiscing elit. ผ้า
ELEMENTUM consequat tortor et euismod ...

หวังว่าจะช่วยหน่อย

นี่คือjsFiddle


7

นี่คือตัวอย่างที่ดีใน CSS บริสุทธิ์

.container{
  width: 200px;
}
.block-with-text {
  overflow: hidden;
  position: relative; 
  line-height: 1.2em;
  max-height: 3.6em;
  text-align: justify;  
  margin-right: -1em;
  padding-right: 1em;
}
.block-with-text+.block-with-text{
  margin-top:10px;
}
.block-with-text:before {
  content: '...';
  position: absolute;
  right: 0;
  bottom: 0;
}
.block-with-text:after {
  content: '';
  position: absolute;
  right: 0;
  width: 1em;
  height: 1em;
  margin-top: 0.2em;
  background: white;
}
<div class="container">


<div class="block-with-text">
Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a
</div>

<div class="block-with-text">
Lorem Ipsum is simply dummy text of the printing and typesetting industry
</div>


<div class="block-with-text">
Lorem Ipsum is simply
</div>

</div>


ทางออกที่ดีงามเพียงแค่ตัดทอนข้อความแม้ว่าบรรทัดที่สองจะสั้นเกินไปที่จะถูกตัดทอน แต่ก็ยังยกนิ้วขึ้น
Amin

6

ฉันเคยใช้jQuery-condense-pluginมาก่อนซึ่งดูเหมือนว่ามันสามารถทำสิ่งที่คุณต้องการได้ ถ้าไม่มีมีปลั๊กอินต่าง ๆที่อาจเหมาะสมกับความต้องการของคุณ

แก้ไข: สร้างการสาธิต - โปรดทราบว่าฉันเชื่อมโยงjquery.condense.jsกับการสาธิตที่ใช้เวทมนตร์จึงให้เครดิตแก่ผู้เขียนปลั๊กอินอย่างเต็มที่ :)


4

มันเป็น CSS ที่ไม่ได้มาตรฐานซึ่งไม่ครอบคลุมใน CSS เวอร์ชั่นปัจจุบัน (Firefox ไม่รองรับ) ลองใช้ JavaScript แทน


4

วิธี CSS บริสุทธิ์ของการตัดแต่งข้อความหลายบรรทัดด้วยจุดไข่ปลา

ปรับความสูงของคอนเทนเนอร์ข้อความบรรทัดควบคุมเพื่อแยกโดย -webkit-line-clamp: 2;

.block-ellipsis {
  display: block;
  display: -webkit-box;
  max-width: 100%;
  height: 30px;
  margin: 0 auto;
  font-size: 14px;
  line-height: 1;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
  overflow: hidden;
  text-overflow: ellipsis;
}

3

ฉันเคยพบปัญหานี้มาก่อนและไม่มีวิธีแก้ปัญหา CSS ที่บริสุทธิ์

นั่นเป็นเหตุผลที่ฉันได้พัฒนาห้องสมุดขนาดเล็กเพื่อจัดการกับปัญหานี้ (ในหมู่อื่น ๆ ) ไลบรารีจัดเตรียมวัตถุเพื่อทำโมเดลและดำเนินการเรนเดอร์ข้อความระดับตัวอักษร ตัวอย่างเช่นคุณสามารถเลียนแบบ text-overflow: ellipsis ที่มีขีด จำกัด โดยพลการ (ไม่จำเป็นต้องมีหนึ่งบรรทัด)

อ่านเพิ่มเติมได้ที่http://www.samuelrossille.com/home/jstext.htmlสำหรับภาพหน้าจอบทแนะนำและลิงก์ dowload


3

หากใครก็ตามที่พยายามจะให้ line-clamp ทำงานใน flexboxมันเป็นเรื่องยากขึ้นเล็กน้อยโดยเฉพาะเมื่อคุณทดสอบการทรมานด้วยคำพูดยาว ๆ ความแตกต่างเพียงจริงในรหัสนี้ตัวอย่างข้อมูลที่มีในรายการเฟล็กซ์ที่มีข้อความที่ถูกตัดทอนและmin-width: 0; word-wrap: break-word;หมวกสำหรับhttps://css-tricks.com/flexbox-truncated-text/สำหรับข้อมูลเชิงลึก คำเตือน: นี่ยังคงเป็นเว็บคิทเท่าที่ฉันรู้

.flex-parent {
  display: flex;
}

.short-and-fixed {
  width: 30px;
  height: 30px;
  background: lightgreen;
}

.long-and-truncated {
  margin: 0 20px;
  flex: 1;
  min-width: 0;/* Important for long words! */
}

.long-and-truncated span {
  display: inline;
  -webkit-line-clamp: 3;
  text-overflow: ellipsis;
  overflow: hidden;
  display: -webkit-box;
  -webkit-box-orient: vertical;
  word-wrap: break-word;/* Important for long words! */
}
<div class="flex-parent">
  <div class="flex-child short-and-fixed">
  </div>
  <div class="flex-child long-and-truncated">
    <span>asdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasd</span>
  </div>
  <div class="flex-child short-and-fixed">
  </div>
</div>

http://codepen.io/AlgeoMA/pen/JNvJdx (เวอร์ชั่น codepen)


1

คำตอบทั้งหมดที่นี่ผิดพวกเขาขาดส่วนสำคัญความสูง

.container{
    width:200px;
    height:600px;
    background:red
}
.title {
        overflow: hidden;
        line-height: 20px;
        height: 40px;
        text-overflow: ellipsis;
        display: -webkit-box;
        -webkit-line-clamp: 2;
        -webkit-box-orient: vertical;
    }
<div class="container">
    <div class="title">this is a long text you cant cut it in half</div>
</div>

0

เมธอด css บริสุทธิ์บน -webkit-line-clamp ซึ่งทำงานบน webkit:

@-webkit-keyframes ellipsis {/*for test*/
    0% { width: 622px }
    50% { width: 311px }
    100% { width: 622px }
}
.ellipsis {
    max-height: 40px;/* h*n */
    overflow: hidden;
    background: #eee;

    -webkit-animation: ellipsis ease 5s infinite;/*for test*/
    /**
    overflow: visible;
    /**/
}
.ellipsis .content {
    position: relative;
    display: -webkit-box;
    -webkit-box-orient: vertical;
    -webkit-box-pack: center;
    font-size: 50px;/* w */
    line-height: 20px;/* line-height h */
    color: transparent;
    -webkit-line-clamp: 2;/* max row number n */
    vertical-align: top;
}
.ellipsis .text {
    display: inline;
    vertical-align: top;
    font-size: 14px;
    color: #000;
}
.ellipsis .overlay {
    position: absolute;
    top: 0;
    left: 50%;
    width: 100%;
    height: 100%;
    overflow: hidden;

    /**
    overflow: visible;
    left: 0;
    background: rgba(0,0,0,.5);
    /**/
}
.ellipsis .overlay:before {
    content: "";
    display: block;
    float: left;
    width: 50%;
    height: 100%;

    /**
    background: lightgreen;
    /**/
}
.ellipsis .placeholder {
    float: left;
    width: 50%;
    height: 40px;/* h*n */

    /**
    background: lightblue;
    /**/
}
.ellipsis .more {
    position: relative;
    top: -20px;/* -h */
    left: -50px;/* -w */
    float: left;
    color: #000;
    width: 50px;/* width of the .more w */
    height: 20px;/* h */
    font-size: 14px;

    /**
    top: 0;
    left: 0;
    background: orange;
    /**/
}
<div class='ellipsis'>
    <div class='content'>
        <div class='text'>text text text text text text text text text text text text text text text text text text text text text </div>
        <div class='overlay'>
            <div class='placeholder'></div>
            <div class='more'>...more</div>
        </div>
    </div>
</div>



-6

ฉันพบวิธีแก้ปัญหา แต่คุณจำเป็นต้องรู้ความยาวตัวอักษรคร่าวๆที่จะพอดีกับพื้นที่ข้อความของคุณจากนั้นเข้าร่วม ... กับพื้นที่ที่มาก่อน

วิธีที่ฉันทำคือ:

  1. สมมติความยาวอักขระคร่าวๆ (ในกรณีนี้ 200) และส่งผ่านไปยังฟังก์ชันพร้อมกับข้อความของคุณ
  2. แบ่งช่องว่างเพื่อให้คุณมีหนึ่งสายยาว
  3. ใช้ jQuery เพื่อให้ได้ช่องว่างชิ้นแรกหลังจากความยาวอักขระของคุณ
  4. เข้าร่วมส่วนที่เหลือ ...

รหัส:

truncate = function(description){
        return description.split('').slice(0, description.lastIndexOf(" ",200)).join('') + "...";           
}

นี่คือซอ - http://jsfiddle.net/GYsW6/1/

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.