js使字体最大且不超过文本框

在找实习时,面试官问过我一个问题。如果给了一个div并且设置了它的长宽,如何用js自适应,使字体达到最大且不溢出。
当时对这个问题从来没有遇见过,也从来没有想过。

现在总结一下:
1.用scrollHeight和clientHeight来判断是否溢出
2.使用.style.fontSize来设置字体大小
3.选取一个算法快速找到合适的字体

     function fontAuto(node) {
    
    
        let before = 1 //before和after用于设置中间元素
        let after = 1
        let fontsize = after //始终让fontsize = after
        node.style.fontSize = fontsize + 'px'
        let height = node.clientHeight
        let scrollheight = node.scrollHeight
        while (scrollheight <= height) {
    
    
          //第一阶段为增长阶段   如果文字没有溢出
          before = after
          after = after * 2
          fontsize = after
          node.style.fontSize = fontsize + 'px'
          height = node.clientHeight
          scrollheight = node.scrollHeight
        }
        //第二阶段为精确取中间值阶段,只取字体最大正整数
        while (after != before + 1) {
    
    
          fontsize = (before + after) / 2
          node.style.fontSize = fontsize + 'px'
          height = node.clientHeight
          scrollheight = node.scrollHeight
          if (scrollheight > height) {
    
    
            after = fontsize
          } else {
    
    
            before = fontsize
          }
        }
        fontsize = before
        node.style.fontSize = fontsize + 'px'
      }

这段代码传进去包含字体的dom节点,然后会自适应调整。
算法为了快速的找到最大的且不溢出的字体号。分成两部分:
1.第一阶段,从一开始,每次乘2,直到scrollHeight>clientHeight
2.第二阶段,开始设置fontsize = (before+after)/2 即二分法,然后依次,直到after = before+1时停止,这时候,before即为最大且不溢出的整数。

猜你喜欢

转载自blog.csdn.net/qq_42535651/article/details/104198645