在找实习时,面试官问过我一个问题。如果给了一个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即为最大且不溢出的整数。