dynamically changing the size of font size based on text length using css and html

前端 未结 8 1234

I need to display user entered text into a fixed size div. What i want is for the font size to be automatically adjusted so that the text fills the box as much as possible.<

相关标签:
8条回答
  • 2020-12-08 04:49
    <!doctype html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Document</title>
        <style>
            #div1{
                width: 200px;
                height: 200px;
                font-size: 32px;
                line-height: 1.2em;
            }
        </style>
        <script type="text/javascript" src="js/jquery-1.9.1.min.js"></script>
        <script>
            $(function(){
                n = 1;
                while(n==1){
                    n = 0
                    if ($('#div1 .holder').outerHeight()>$('#div1').outerHeight()){
                        var fz = parseInt($('#div1').css('font-size'));
                        $('#div1').css({'font-size' : fz-1});
                        n = 1
                    } else {n = 0}
                }
            });
        </script>
    </head>
    <body>
        <div id="div1">
            <div class="holder">I need to display user entered text into a fixed size div. What i want is for the font size to be automatically adjusted so that the text fills the box as much as possible.
    I'd probably want to start with a maximum font size and while the text is too big to fit the container, shrink the font size until it fits and the font must be displayed as a single line. Is it possible to do this using only css and html.</div>
        </div>
    </body>
    </html>
    
    0 讨论(0)
  • 2020-12-08 04:51

    Whoever wants a dynamic function that depends on the width of the element (based on putvande answer):

            $(document).ready(function () {
                var arrEl = ['div1', 'div2', 'div3'];
                resize_to_fit(arrEl);
            });
    
            function resize_to_fit(arr){
                for (var el in arr) {
                    var jEl = $('.' + arr[el] + ' span');
                    var fontsize = jEl.css('font-size');
                    jEl.css('fontSize', parseFloat(fontsize) - 1);
                    if (jEl.width() >= $('.' + arr[el]).width()){
                        resize_to_fit([arr[el]]);
                    }        
                }
            }
    

    and the HTML:

    <div class="div1">
        <span>Lorem Ipsum</span>
    </div>
    <br/>
    <div class="div2">
        <span>Lorem Ipsum 2</span>
    </div>
    <br />
    <div class="div3">
        <span>Lorem Ipsum 3</span>
    </div>
    

    whith CSS:

    .div1, .div2, .div3 {
        width: 207px;
        white-space: nowrap;
    }
    

    Notice you only set font-size to span inside, and not to the outer div.

    0 讨论(0)
  • 2020-12-08 04:56

    Getting the size in pixels of a string of text is a hard thing to do and depends a lot on the browser and the user's settings, so it will probably be hard to come up with a solution that works in all cases.

    By "display user entered text" do you mean the user is typing into a textbox? If so, you can attach a keypress listener that checks the length of the value of the text, then adjusts the font-size accordingly. Here's an example, though you will probably need to change the lengths and font-sizes to meet your needs:

    Working Demo

    $('#text').on('keypress', function(e) {
        var that = $(this),
            textLength = that.val().length
        ;
    
        if(textLength > 30) {
            that.css('font-size', '5px');
        } else if(textLength > 20) {
            that.css('font-size', '10px');
        } else if(textLength > 10) {
            that.css('font-size', '15px');
        }
    });
    
    0 讨论(0)
  • 2020-12-08 04:56

    Using very little Javascript, you can assign a CSS class with the length of the string, eg: text-length-5 or text-length-20

    Then use exclusively CSS to target different font-size according to those class names.

    It probably won't work for every case, but it did very well for mine, where the max length was about 10-12 chars.

    If you have 100+ or 1000+ chars you can also make a function that receives the length and returns a CSS class, then style base on those ranges.


    HTML:

    <div class="box">ABC</div>
    <div class="box">ABCDE</div>
    

    Javascript (jQuery, but the same idea can be applied to React, or vanilla JS)

    $(".box").each((i, el)=> {
      const length = $(el).text().length;
      $(el).addClass("text-length-"+length);
    })
    

    CSS:

    .box {
      font-size: 16px;
    }
    .box.text-length-4,
    .box.text-length-5,
    .box.text-length-6 {
      font-size: 12px;
    }
    
    0 讨论(0)
  • 2020-12-08 04:57

    Say you have this:

    <div id="outer" style="width:200px; height:20px; border:1px solid red;">
        <div>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer mollis dui felis, vel vehicula tortor cursus nec</div>
    </div>
    

    Then you can do something like:

    $(document).ready(function () {
        resize_to_fit();
    });
    
    function resize_to_fit(){
        var fontsize = $('div#outer div').css('font-size');
        $('div#outer div').css('fontSize', parseFloat(fontsize) - 1);
    
        if($('div#outer div').height() >= $('div#outer').height()){
            resize_to_fit();
        }
    }
    

    Working Sample

    $(document).ready(function() {
      resize_to_fit();
    });
    
    function resize_to_fit() {
      var fontsize = $('div#outer div').css('font-size');
      $('div#outer div').css('fontSize', parseFloat(fontsize) - 1);
    
      if ($('div#outer div').height() >= $('div#outer').height()) {
        resize_to_fit();
      }
    }
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    <div id="outer" style="width:200px; height:20px; border:1px solid red;">
      <div>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer mollis dui felis, vel vehicula tortor cursus nec</div>
    </div>

    0 讨论(0)
  • 2020-12-08 04:58

    Thanks putvande for letting me know the general method. Here is an improved version.

    1. Get rid of the callback hell.
    2. Fixed some bugs may cause page hang.

    Same HTML:

    <div id="outer" style="width:200px; height:20px; border:1px solid red;">
        <div>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer mollis dui felis, vel vehicula tortor cursus nec</div>
    </div>
    

    Here is the function:

    resize_to_fit($('#outer'), $('#outer div'));
    
    function resize_to_fit(outer, inner) {
        while(inner.height() > outer.height()) {
            var fontsize = parseInt(inner.css('font-size')) - 1;
            inner.css('font-size', fontsize);
            // some browsers(chrome) the min font return value is 12px
            if(fontsize <= 1 || parseInt(inner.css('font-size')) >= fontsize+1)
                break;
        }
    }
    
    0 讨论(0)
提交回复
热议问题