İki satırda metin taşma üç nokta


117

Taşma zamanı geldiğinde (ebeveynin sınırlarının dışına çıkma) metni üç nokta (...) ile sonlandırmak için CSS kurallarının bir kombinasyonunu kullanabileceğinizi biliyorum.

Aynı efekti elde etmek, ancak metnin birden fazla satıra kaymasına izin vermek mümkün mü (sadece hayır demekten çekinmeyin)?

İşte bir demo .

div {
  width: 300px; 
  height: 42px; 
  overflow: hidden; 
  text-overflow: ellipsis; 
  white-space: nowrap;
}

Gördüğünüz gibi, metin div'in genişliğinden daha geniş olduğunda üç nokta ile bitiyor. Bununla birlikte, metnin ikinci bir satıra kayması ve devam etmesi için hala yeterli alan var. Bu, white-space: nowrapüç noktanın çalışması için gerekli olan ile kesintiye uğrar .

Herhangi bir fikir?

Not: JS çözümü yok, mümkünse saf CSS.


"Boşluk var" ı ne belirler? Yazı tipi yüksekliği dahil her şey ayarlanmış piksellerde mi? Bir son kullanıcı tarayıcısında yazı tipi boyutunu artırsa ne olur?
Joel Etherton


@JoelEtherton Sanırım tarayıcının karar vermesi bu kadar ve evet, benim durumumda her şey piksel cinsinden.
Tony Bogdanov

Bu iyi bir çözüm olabilir: stackoverflow.com/questions/6222616/…
ivy

Bu gerçekten güzel bir okuma hackingui.com/front-end/…
anandharshan

Yanıtlar:


31

BUNU gördünüz mü emin değilim , ancak Chris Coyier'in mükemmel CSS-Tricks.com'u bir süre önce buna bir bağlantı yayınladı ve tam olarak aradığınız şeyi gerçekleştiren saf bir CSS çözümü.

(CodePen'de Görüntülemek için Tıklayın)

HTML:

<div class="ellipsis">
    <div>
        <p>
            Call me Ishmael. Some years ago – never mind how long precisely – having
            little or no money in my purse, and nothing particular to interest me on
            shore, I thought I would sail about a little and see the watery part of the
            world. It is a way I have of driving off the spleen, and regulating the
            circulation. Whenever I find myself growing grim about the mouth; whenever it
            is a damp, drizzly November in my soul; whenever I find myself involuntarily
            pausing before coffin warehouses, and bringing up the rear of every funeral I
            meet; and especially whenever my hypos get such an upper hand of me, that it
            requires a strong moral principle to prevent me from deliberately stepping
            into the street, and methodically knocking people's hats off – then, I account
            it high time to get to sea as soon as I can.
        </p>
    </div>
</div>

CSS:

html,body,p {
    margin: 0;
    padding: 0;
    font-family: sans-serif;
}
.ellipsis {
    overflow: hidden;
    height: 200px;
    line-height: 25px;
    margin: 20px;
    border: 5px solid #AAA;
}
.ellipsis:before {
    content: "";
    float: left;
    width: 5px;
    height: 200px;
}
.ellipsis > *:first-child {
    float: right;
    width: 100%;
    margin-left: -5px;
}
.ellipsis:after {
    content: "\02026";
    box-sizing: content-box;
    -webkit-box-sizing: content-box;
    -moz-box-sizing: content-box;
    float: right;
    position: relative;
    top: -25px;
    left: 100%;
    width: 3em;
    margin-left: -3em;
    padding-right: 5px;
    text-align: right;
    background-size: 100% 100%;/* 512x1 image,gradient for IE9. Transparent at 0% -> white at 50% -> white at 100%.*/
    background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAgAAAAABCAMAAACfZeZEAAAABGdBTUEAALGPC/xhBQAAAwBQTFRF////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAAA////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wDWRdwAAAP90Uk5TgsRjMZXhS30YrvDUP3Emow1YibnM9+ggOZxrBtpRRo94gxItwLOoX/vsHdA2yGgL8+TdKUK8VFufmHSGgAQWJNc9tk+rb5KMCA8aM0iwpWV6dwP9+fXuFerm3yMs0jDOysY8wr5FTldeoWKabgEJ8RATG+IeIdsn2NUqLjQ3OgBDumC3SbRMsVKsValZplydZpZpbJOQco2KdYeEe36BDAL8/vgHBfr2CvTyDu8R7esU6RcZ5ecc4+Af3iLcJSjZ1ivT0S/PMs3LNck4x8U7wz7Bv0G9RLtHuEq1TbJQr1OtVqqnWqRdoqBhnmSbZ5mXapRtcJGOc4t2eYiFfH9AS7qYlgAAARlJREFUKM9jqK9fEGS7VNrDI2+F/nyB1Z4Fa5UKN4TbbeLY7FW0Tatkp3jp7mj7vXzl+4yrDsYoVx+JYz7mXXNSp/a0RN25JMcLPP8umzRcTZW77tNyk63tdprzXdmO+2ZdD9MFe56Y9z3LUG96mcX02n/CW71JH6Qmf8px/cw77ZvVzB+BCj8D5vxhn/vXZh6D4uzf1rN+Cc347j79q/zUL25TPrJMfG/5LvuNZP8rixeZz/mf+vU+Vut+5NL5gPOeb/sd1dZbTs03hBuvmV5JuaRyMfk849nEM7qnEk6IHI8/qn049hB35QGHiv0yZXuMdkXtYC3ebrglcqvYxoj1muvC1nDlrzJYGbpcdHHIMo2FwYv+j3QAAOBSfkZYITwUAAAAAElFTkSuQmCC);
    background: -webkit-gradient(linear,left top,right top,
        from(rgba(255,255,255,0)),to(white),color-stop(50%,white));
        background: -moz-linear-gradient(to right,rgba(255,255,255,0),white 50%,white);
        background: -o-linear-gradient(to right,rgba(255,255,255,0),white 50%,white);
        background: -ms-linear-gradient(to right,rgba(255,255,255,0),white 50%,white);
        background: linear-gradient(to right,rgba(255,255,255,0),white 50%,white);
    }

Tabii ki, saf bir CSS çözümü olmak, aynı zamanda oldukça karmaşık olduğu anlamına gelir, ancak temiz ve zarif bir şekilde çalışır. Javascript'in söz konusu olmadığını varsayacağım çünkü Javascript ile bunu başarmak çok daha kolay (ve tartışmalı olarak daha indirgenebilir).

Ek bir bonus olarak, tüm sürecin indirilebilir bir zip dosyası (eğer onu ve hepsini anlamak istiyorsanız), aynı zamanda bir SASS mixin dosyası da vardır, böylece süreci kolay bir şekilde katlayabilirsiniz.

Bu yardımcı olur umarım!

http://www.mobify.com/blog/multiline-ellipsis-in-pure-css/


Bir Android telefondaki Codepen bağlantınıza tıkladım ve Firefox'ta çalıştı. Hangi platformda / tarayıcıda çalışmıyor?
Dashard

uploady.com/#!/download/kAwBXv1CqXg/PU68wrP6QzGgydlS Chrome kullanıyorum ve önizlemede elips yok. Metin satırları eklemeye devam edin, hiçbir şey olmaz. Kaç satırdan sonra elips göstermeye başlayacak?
coding_idiot

Gönderdiğiniz yükleme bağlantısında, metin açıkça kapsayıcıdan henüz taşmamıştı. Sabit kabın, elipsler görünmeden önce görüntülenmesi için metin çok fazla olmalıdır. Etkisini görmek için metin eklemeye devam edin.
Dashard

@ MarcosPérezGude - beni şaşırtmadı. O >> ima << "Tabii ki, saf CSS çözüm aracı olan bu oldukça karmaşık bir ... Ayrıca bu kadar"
dashard

138

Kolay CSS özellikleri hile yapabilir. Aşağıdaki üç satırlık bir üç nokta içindir.

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

15
bu firefox'ta çalışmaz. sadece chrome, safari ve opera
anyavacy

1
caniuse'ye göre , "diğer tarayıcıların özelliği olduğu gibi desteklemesi olası değildir" diyor. Yani dikkat edin.
Matan Bobi

pürüzsüz dostum .. çok yardımcı oldu
Valentino Pereira

4
Firefox'ta gr8 de çalışıyor
Nisharg Shah

4
Şu anda harika bir desteğe sahip görünüyor: caniuse.com/#search=line-clamp
Joao

52

Bu saf css sürümüne bir göz atın: http://codepen.io/martinwolf/pen/qlFdp

display: -webkit-box;
max-width: 400px;
height: 109.2px;
-webkit-line-clamp: 3;
-webkit-box-orient: vertical;
overflow: hidden;
text-overflow: ellipsis;
line-height: 1.625;

7
Bu gerçekten harika, çok kötü, sadece webkit. İşte konuyla ilgili ilginç bir makale: css-tricks.com/line-clampin
Tony Bogdanov

Neden iki text-overflowve displaykural ilan ediyorsunuz ?
j08691

Büyük bir WoooW. Halat kıskacından önce hiç görmedim
Mike Aron

1
Bilginize, bu günlerde Firefox'ta da iyi çalışıyor. Harika çözüm!
Athoxx

sadece 1 soru, bir veya iki satırlık metne sahip olduğumda bunların ortalanmasını istiyorum, bunu nasıl yaparım, ekran esnekliği eklersem üç noktayı kaybederim, bu yalnızca ekran: -webkit kutusu ayarlıysa çalışır gibi görünüyor
PirateApp

10

Aşağıdaki Css hile yapmalı.

İkinci satırdan sonra, metin şunları içerecektir ...

line-height: 1em;
max-height: 2em;
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 2;

bu güzel çalıştı ama eklemek zorunda kaldımoverflow:hidden
timhysniu

4

Yukarıdaki çalışmıyorsa bunu kullanın

 display: block;
 display: -webkit-box;
 max-width: 100%;
 margin: 0 auto;
 -webkit-line-clamp: 2;
 /* autoprefixer: off */
 -webkit-box-orient: vertical;
 /* autoprefixer: on */
 overflow: hidden;
 text-overflow: ellipsis;

2

Çözümüm amcdnl'yi yeniden kullanıyor, ancak geri dönüşüm metin kabı için bir yükseklik kullanmaktan oluşuyor:

.my-caption h4 {
    display: -webkit-box;
    margin: 0 auto;
    -webkit-line-clamp: 2;
    -webkit-box-orient: vertical;
    overflow: hidden;
    text-overflow: ellipsis;

    height: 40px;/* Fallback for non-webkit */
}

-webkit-line-clampIE11, Edge veya Firefox için çalışmaz.
Gaʀʀʏ

@Garry, haklısın, o zamanlar bir JS düzeltmesine ihtiyacın olacaktı, ama şimdi iyi çalışıyor. caniuse.com/#search=webkit-line-clamp
VincentPerrin.com

1

Stackoveflow'da gördüğüm bir cevaba dayanarak, bu LESS karışımını oluşturdum ( CSS kodunu oluşturmak için bu bağlantıyı kullanın ):

.max-lines(@lines: 3; @line-height: 1.2) {
  overflow: hidden;
  text-overflow: ellipsis;
  display: -webkit-box;
  -webkit-box-orient: vertical;
  -webkit-line-clamp: @lines;
  line-height: @line-height;
  max-height: @line-height * @lines;
}

Kullanım

.example-1 {
    .max-lines();
}

.example-2 {
    .max-lines(3);
}

.example-3 {
    .max-lines(3, 1.5);
}

1

İki sınıfı birleştirmek daha zarif görünüyor. two-linesYalnızca bir satırın görülmesi gerekiyorsa sınıfı bırakabilirsiniz :

.ellipse {
          white-space: nowrap;
          display:inline-block;
          overflow: hidden;
          text-overflow: ellipsis;
       }
      .two-lines {
          -webkit-line-clamp: 2;
          display: -webkit-box;
          -webkit-box-orient: vertical;
          white-space: normal;
      }
      .width{
          width:100px;
          border:1px solid hotpink;
      }
        <span class='width ellipse'>
          some texts some texts some texts some texts some texts some texts some texts
       </span>

       <span class='width ellipse two-lines'>
          some texts some texts some texts some texts some texts some texts some texts
       </span>


1

Birkaç satırla sınırlama hemen hemen tüm tarayıcılarda işe yarar, ancak Firefox ve IE'de bir üç nokta (3 nokta) görüntülenmez. Demo - http://jsfiddle.net/ahzo4b91/1/

div {
width: 300px;
height: 2.8em;
line-height: 1.4em;
display: flex;
-webkit-line-clamp: 2;
display: -webkit-box;
-webkit-box-orient: vertical;
overflow: hidden; 
}

1

Scss'de çalışanlar !autoprefixeriçin, postcs için korunabilmesi için yorumun başlangıcına eklemeniz gerekir :

Bu sorunla karşılaştım bu yüzden buraya yazıyorum

line-height: 1em;
max-height: 2em;
display: -webkit-box;
/*! autoprefixer: off */
-webkit-box-orient: vertical;
-webkit-line-clamp: 2;

Referans


0
          text-overflow: ellipsis;
          overflow: hidden;
          text-overflow: ellipsis;
          display: -webkit-box;
          line-height: 36px;
          max-height: 18px;
          -webkit-line-clamp: 2;
          -webkit-box-orient: vertical;

Hem çizgi kıskacı hem de çizgi yüksekliği çalışmalarının bir kombinasyonunu buldum: D


0

Açısal uygulamamda aşağıdaki stil , ikinci satırdaki metnin taşması üzerinde üç nokta elde etmem için çalıştı :

 <div style="height:45px; overflow: hidden; position: relative;">
     <span class=" block h6 font-semibold clear" style="overflow: hidden;
        text-overflow: ellipsis;
        display: -webkit-box; 
        line-height: 20px; /* fallback */
        max-height: 40px; /* fallback */
        -webkit-line-clamp: 2; /* number of lines to show */
        -webkit-box-orient: vertical;">
        {{ event?.name}} </span>
 </div>

Umarım birine yardımcı olur.


0

Üç nokta, saf CSS yerine çözülmüş bir efekt kullanabilirsiniz ve daha profesyonel görünür:

    <div style="width: 293px; height:48px; overflow: hidden; ">
        More than two line of text goes here-More than two line of text goes here
    </div>
    <div style="position: relative; top: -24px; width: 293px; height:24px; 
             background: linear-gradient(90deg, rgba(255,0,0,0) 40%, rgba(255,255,255,1) 99%);">
    </div>

Burada arka plan renginizin beyaz olduğunu varsaydım.


-1

Bu tam bir hack'tir, ancak işe yarar:

http://jsfiddle.net/2wPNg/

div {
    width: 30%;
    float: left;
    margin-right: 2%;
    height: 94px;
    overflow: hidden;
    position: relative;
}

div:after {
     display: block;
      content: '...';
      width: 1em;
  height: 1.5em;
  background: #fff;
  position: absolute;
  bottom: -6px;
  right: 0;
    }

Sorunları var .... bir mektubu garip bir şekilde kesebilir ve duyarlı bir sitede muhtemelen bazı tuhaf sonuçları olacaktır.


5
Bu doğru bir çözüm olmayacaktır çünkü içerik daha küçükse, sonunda '...' ekler. Fiddle: jsfiddle.net/2wPNg
Sachin

-1

Burada üç noktayı jQuery kullanarak yönetmek için basit bir komut dosyası verilmiştir. Öğenin gerçek yüksekliğini inceler ve gizli bir orijinal düğüm ve kesilmiş bir düğüm oluşturur. Kullanıcı tıkladığında iki versiyon arasında geçiş yapar.

En büyük faydalarından biri, beklendiği gibi "üç nokta" nın son kelimeye yakın olmasıdır.

Saf CSS çözümlerini kullanırsanız, üç nokta son kelimeden uzakta görünür.

function manageShortMessages() {

        $('.myLongVerticalText').each(function () {
            if ($(this)[0].scrollHeight > $(this)[0].clientHeight)
                $(this).addClass('ellipsis short');
        });

        $('.myLongVerticalText.ellipsis').each(function () {
            var original = $(this).clone().addClass('original notruncation').removeClass('short').hide();
            $(this).after(original);

            //debugger;
            var shortText = '';
            shortText = $(this).html().trim().substring(0, 60) + '...';
            $(this).html(shortText);
        });
        
        $('.myLongVerticalText.ellipsis').click(function () {
            $(this).hide();

            if ($(this).hasClass('original'))
            {
                $(this).parent().find('.short').show();
            }
            else
            {
                $(this).parent().find('.original').show();
            }
        });
    }
	
  manageShortMessages();
div {
 border:1px solid red;
 margin:10px;
}

div.myLongVerticalText {
  height:30px;
  width:450px;
}

div.myLongVerticalText.ellipsis {
 cursor:pointer;
}

div.myLongVerticalText.original {
  display:inline-block;
  height:inherit;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<body>
<div class="myLongVerticalText">
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse sit amet quam hendrerit, sagittis augue vel, placerat erat. Aliquam varius porta posuere. Aliquam erat volutpat. Phasellus ullamcorper malesuada bibendum. Etiam fringilla, massa vitae pulvinar vehicula, augue orci mollis lorem, laoreet viverra massa eros id est. Phasellus suscipit pulvinar consectetur. Proin dignissim egestas erat at feugiat. Aenean eu consectetur erat. Nullam condimentum turpis eu tristique malesuada.

Aenean sagittis ex sagittis ullamcorper auctor. Sed varius commodo dui, nec consectetur ante condimentum et. Donec nec blandit mi, vitae blandit elit. Phasellus efficitur ornare est facilisis commodo. Donec convallis nunc sed mauris vehicula, non faucibus neque vehicula. Donec scelerisque luctus dui eu commodo. Integer eu quam sit amet dui tincidunt pharetra eu ac quam. Quisque tempus pellentesque hendrerit. Sed orci quam, posuere eu feugiat at, congue sed felis. In ut lectus gravida, volutpat urna vitae, cursus justo. Nam suscipit est ac accumsan consectetur. Donec rhoncus placerat metus, ut elementum massa facilisis eget. Donec at arcu ac magna viverra tincidunt.
</div>


<div class="myLongVerticalText">
One Line Lorem ipsum dolor sit amet.  
</div>
</body>


Bu çözüme olumsuz oy verirseniz, lütfen nedenini burada açıklayın, takdir edeceğim.
Matteo Conta

1
OP, CSS çözümü istedi ve siz jQuery'yi mi teklif ettiniz?
dashard

Javascript yokluğunun güçlü bir gereksinim olduğunu gözden kaçırdım, benim durumumda saf CSS çözümü oluşturma sorunları ortaya koydu, jQuery çözümü bana son işleme ve üç nokta konumu üzerinde daha fazla kontrol sağladı.
Matteo Conta

Kesinlikle katılıyorum. Cevabımda bunun JS ile elde etmenin çok daha kolay olduğunu belirttim.
dashard

-3

Hedefinizin ne olduğundan emin değilsiniz, ancak metnin ikinci satıra gelmesini ister misiniz?

İşte jsFiddle'ınız: http://jsfiddle.net/8kvWX/4/ aşağıdakileri kaldırdı:

     white-space:nowrap;  

Aradığınız şeyin bu olup olmadığından emin değilim.

Saygılarımızla,

Mee


1
İkinci satırın sonunda üç nokta istiyor, ki bu JavaScript olmadan yapmak o kadar da kolay değil ...
Marc Audet

@MarcAudet tam olarak :)
Tony Bogdanov

Doğru, ikinci satırda satırların olmasını isteyen başka bir kişi bulduğum için ve CSS'si sizinkiyle hemen hemen aynıydı, ancak sınıf bunun yerine bir ul etiketini gösteriyordu. Neyse, üzgünüm Tony. Tekrar bakacağım ve başarılı olursam cevabımı güncelleyeceğim.
Mee

bence en iyi çözüm @ İtay Gal'den gelen çözüm. Gördüğüm kadarıyla bir çalışıyor.
Mee
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.