Truncate text with jQuery based on pixel width

前端 未结 5 1890
梦谈多话
梦谈多话 2020-12-08 05:48

I\'m trying to use jquery to write a fast function that calculates the pixel width of a string on a html page, then truncates the string until it reaches an ideal pixel widt

相关标签:
5条回答
  • 2020-12-08 06:17

    If you have the text, and know the size you want, why not just use substr?

    I did something similar with

    $('#history-1').text( $('#history-1').text().trim().substr(0,32) + "..." )
    
    0 讨论(0)
  • 2020-12-08 06:24

    Thanks, I got it working - but it only works on the first item and stops, does this have to do with the way I'm declaring variables?

    here's the current code:

        function constrain(text, original, ideal_width){
    
        var temp_item = ('<span class="temp_item" style="display:none;">'+ text +'</span>');
        $(temp_item).appendTo('body');
        var item_width = $('span.temp_item').width();
        var ideal = parseInt(ideal_width);
        var smaller_text = text;
    
        while (item_width > ideal) {
            smaller_text = smaller_text.substr(0, (smaller_text.length-1));
            $('.temp_item').html(smaller_text);
            item_width = $('span.temp_item').width();
        }
    
        var final_length = smaller_text.length;
    
        if (final_length != original) {
            return (smaller_text + '&hellip;');
        } else {
            return text;
        }
    }
    
    0 讨论(0)
  • 2020-12-08 06:27

    Rather than hacking this together with script, why not just use CSS to specify the width of the element you're putting this string into? You can use text-overflow to tell the browser it should truncate with an ellipsis.

    .truncated { display:inline-block; max-width:100px; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
    

    text-overflow is a CSS3 declaration, but is supported in IE 6+, WebKit 312.3+ (Safari 1.3+/Chrome), and Opera 9+ (versions < 10.7 need the -o-text-overflow declaration).

    Note that this was unimplemented in Firefox until 7.0, and under 4% of Firefox users are still using old versions (mostly 3.6). Your text will still be truncated in older versions, there just won't be an ellipsis rendered. If you're concerned about this small group of users, you can use this jQuery plugin, which does nothing in IE/WebKit/Opera/Firefox ≥ 7, but will emulate text-overflow in Firefox ≤ 6.

    0 讨论(0)
  • 2020-12-08 06:28

    On this line:

    smaller_text = smaller_text.substr(0, (smaller_text-1));

    you may have intended

    smaller_text = smaller_text.substr(0, (smaller_text.length-1));

    Does that solve the problem?

    0 讨论(0)
  • 2020-12-08 06:36

    The function takes the text to check, the ideal_width in pixel and the class name for the css. If the ideal_width is less than the text width it truncs and adds the hellip otherwise it returns the text unmodified. Simple and works! :-)

    function constrain(text, ideal_width, className){
    
        var temp_item = ('<span class="'+className+'_hide" style="display:none;">'+ text +'</span>');
        $(temp_item).appendTo('body');
        var item_width = $('span.'+className+'_hide').width();
        var ideal = parseInt(ideal_width);
        var smaller_text = text;
    
        if (item_width>ideal_width){
            while (item_width > ideal) {
                smaller_text = smaller_text.substr(0, (smaller_text.length-1));
                $('.'+className+'_hide').html(smaller_text);
                item_width = $('span.'+className+'_hide').width();
            }
            smaller_text = smaller_text + '&hellip;'
        }
        $('span.'+className+'_hide').remove();
        return smaller_text;
    }
    
    0 讨论(0)
提交回复
热议问题