With CSS, use “…” for overflowed block of multi-lines

后端 未结 16 2317
情话喂你
情话喂你 2020-11-22 07:15

with

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

\"...\" will be shown in the end of the line if overflowed. However, t

相关标签:
16条回答
  • 2020-11-22 07:31

    javascript solution will be better

    • get the lines number of text
    • toggle is-ellipsis class if the window resize or elment change

    getRowRects

    Element.getClientRects() works like this

    each rects in the same row has the same top value, so find out the rects with different top value, like this

    function getRowRects(element) {
        var rects = [],
            clientRects = element.getClientRects(),
            len = clientRects.length,
            clientRect, top, rectsLen, rect, i;
    
        for(i=0; i<len; i++) {
            has = false;
            rectsLen = rects.length;
            clientRect = clientRects[i];
            top = clientRect.top;
            while(rectsLen--) {
                rect = rects[rectsLen];
                if (rect.top == top) {
                    has = true;
                    break;
                }
            }
            if(has) {
                rect.right = rect.right > clientRect.right ? rect.right : clientRect.right;
                rect.width = rect.right - rect.left;
            }
            else {
                rects.push({
                    top: clientRect.top,
                    right: clientRect.right,
                    bottom: clientRect.bottom,
                    left: clientRect.left,
                    width: clientRect.width,
                    height: clientRect.height
                });
            }
        }
        return rects;
    }
    

    float ...more

    like this

    detect window resize or element changed

    like this

    0 讨论(0)
  • 2020-11-22 07:33

    The link below provides a pure HTML / CSS solution to this problem.

    Browser support - as stated in the article:

    So far we have tested on Safari 5.0, IE 9 (must be in standards mode), Opera 12 and Firefox 15.

    Older browsers will still work quite well, as the meat of the layout is in normal positioning, margin and padding properties. if your platform is older (e.g. Firefox 3.6, IE 8), you can use the method but redo the gradient as a standalone PNG image or DirectX filter.

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

    the css:

    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: -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); }
    

    the html:

    <div class="ellipsis">
        <div>
            <p>Call me Ishmael.  Some years ago &ndash; never mind how long precisely &ndash; 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 &ndash; then, I account it high time to get to sea as soon as I can.</p>  
        </div>
    </div>
    

    the fiddle

    (resize browser's window for testing)

    0 讨论(0)
  • 2020-11-22 07:34

    a pure css method base on -webkit-line-clamp:

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

    0 讨论(0)
  • 2020-11-22 07:35

    There are also several jquery plugins that deal with this issue, but many do not handle multiple lines of text. Following works:

    • http://pvdspek.github.com/jquery.autoellipsis/
    • http://dotdotdot.frebsite.nl/
    • http://keith-wood.name/more.html
    • http://github.com/tbasse/jquery-truncate

    There also some preformance tests.

    0 讨论(0)
  • 2020-11-22 07:39

    I've found this css (scss) solution that works quite well. On webkit browsers it shows the ellipsis and on other browsers it just truncates the text. Which is fine for my intended use.

    $font-size: 26px;
    $line-height: 1.4;
    $lines-to-show: 3;
    
    h2 {
      display: block; /* Fallback for non-webkit */
      display: -webkit-box;
      max-width: 400px;
      height: $font-size*$line-height*$lines-to-show; /* Fallback for non-webkit */
      margin: 0 auto;
      font-size: $font-size;
      line-height: $line-height;
      -webkit-line-clamp: $lines-to-show;
      -webkit-box-orient: vertical;
      overflow: hidden;
      text-overflow: ellipsis;
    }
    

    An example by the creator: http://codepen.io/martinwolf/pen/qlFdp

    0 讨论(0)
  • There are many answers here but I needed one that was:

    • CSS Only
    • Future-proof (gets more compatible with time)
    • Not going to break words apart (only breaks on spaces)

    The caveat is that it doesn't provide an ellipsis for the browsers that don't support the -webkit-line-clamp rule (currently IE, Edge, Firefox) but it does use a gradient to fade their text out.

    .clampMe {
      position: relative;
      height: 2.4em; 
      overflow: hidden;
    }
    
    .clampMe:after {
      content: "";
      text-align: right;
      position: absolute;
      bottom: 0;
      right: 0;
      width: 50%;
      height: 1.2em; /* Just use multiples of the line-height */
      background: linear-gradient(to right, rgba(255, 255, 255, 0), rgba(255, 255, 255, 1) 80%);
    }
    
    /* Now add in code for the browsers that support -webkit-line-clamp and overwrite the non-supportive stuff */
    @supports (-webkit-line-clamp: 2) {
      .clampMe {
          overflow: hidden;
          text-overflow: ellipsis;
          display: -webkit-box;
          -webkit-line-clamp: 2;
          -webkit-box-orient: vertical;
      }
      
      .clampMe:after {
        display: none;
      }
    }
    <p class="clampMe">There's a lot more text in here than what you'll ever see. Pellentesque habitant testalotish morbi tristique senectus et netus et malesuada fames ac turpis egestas. Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.</p>

    You can see it in action in this CodePen and you can also see a Javascript version here (no jQuery).

    0 讨论(0)
提交回复
热议问题