JavaScript - Visible Text of a DIV

前端 未结 5 1923
北恋
北恋 2020-12-01 18:20
----------------------------------------------------
| This is my text inside a div and I want the overf|low of the text to be cut
----------------------------------         


        
相关标签:
5条回答
  • 2020-12-01 18:58

    You're trying to force a CSS problem into JavaScript. Put the hammer away and get out a screwdriver. http://en.wiktionary.org/wiki/if_all_you_have_is_a_hammer,_everything_looks_like_a_nail

    Solving the answer of character count is probably irrelevant if you take a step back. The last character could be only partially visible, and character count is drastically different given font size changes, the difference of width between W an i, etc. Probably the div's width is more important than the character count in the true problem.

    If you're still stuck on figuring out the characters visible, put a span inside the div around the text, use the css provided in other answers to this question, and then in JavaScript trim one character at a time off the string until the span's width is less than the div's width. And then watch as your browser freezes for a few seconds every time you do that to a big paragraph.

    0 讨论(0)
  • 2020-12-01 18:59

    try this, it requires a fixed width if that is ok with you: http://jsfiddle.net/timrpeterson/qvZKw/20/

    HTML:

    <div class="col">This is my text inside a div and I want the overf|low of the text to be cut</div>
    

    CSS:

    .col { 
       width:120px; 
        overflow: hidden;
       white-space:nowrap;
    
     }​
    
    0 讨论(0)
  • 2020-12-01 19:03

    You can do this with Javascript. Here is a function that counts the number of visible characters in an element, regardless of external css sheets and inline styles applied to the element. I've only tested it in Chrome, but I think it is cross browser friendly:

    function count_visible(el){
        var padding, em, numc;
        var text = el.firstChild.data;
        var max = el.clientWidth;
    
        var tmp = document.createElement('span');
        var node = document.createTextNode();
        tmp.appendChild(node);
        document.body.appendChild(tmp);
    
        if(getComputedStyle)
            tmp.style.cssText = getComputedStyle(el, null).cssText;
        else if(el.currentStyle)
            tmp.style.cssText = el.currentStyle.cssText;
    
        tmp.style.position = 'absolute';
        tmp.style.overflow = 'visible';
        tmp.style.width = 'auto';
    
        // Estimate number of characters that can fit.
        padding = tmp.style.padding;
        tmp.style.padding = '0';
        tmp.innerHTML = 'M';
        el.parentNode.appendChild(tmp);
        em = tmp.clientWidth;
        tmp.style.padding = padding;      
        numc = Math.floor(max/em);
    
        var width = tmp.clientWidth;
    
        // Only one of the following loops will iterate more than one time
        // Depending on if we overestimated or underestimated.
    
        // Add characters until we reach overflow width
        while(width < max && numc <= text.length){
            node.nodeValue = text.substring(0, ++numc);
            width = tmp.clientWidth;
        }
    
        // Remove characters until we no longer have overflow
        while(width > max && numc){
            node.nodeValue = text.substring(0, --numc);
            width = tmp.clientWidth;
        }
    
        // Remove temporary div
        document.body.removeChild(tmp);
    
        return numc;
    }
    

    JSFiddle Example

    0 讨论(0)
  • 2020-12-01 19:04

    Okay, I didn't see the addendum to the question. Although I had previously said it wasn't possible to do this using JavaScript and a font that isn't fixed-width... it actually is possible!

    You can wrap each individual character in a <span>, and find the first <span> that is outside the bounds of the parent. Something like:

    function countVisibleCharacters(element) {
        var text = element.firstChild.nodeValue;
        var r = 0;
    
        element.removeChild(element.firstChild);
    
        for(var i = 0; i < text.length; i++) {
            var newNode = document.createElement('span');
            newNode.appendChild(document.createTextNode(text.charAt(i)));
            element.appendChild(newNode);
    
            if(newNode.offsetLeft < element.offsetWidth) {
                r++;
            }
        }
    
        return r;
    }
    

    Here's a demo.

    0 讨论(0)
  • 2020-12-01 19:14

    .col { width:40px; overflow: hidden; white-space:nowrap; }

    White-space: nowrap; is needed when the content has spaces.

    Either way, long words in single lines do not appear. http://jsfiddle.net/h6Bhb/

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