固定宽高
2023年10月07日
一、认识
在 DOM
元素固定宽高的情况下, 实现字体自适应, 是字体达到最大且不溢出。如果达到最小字号,则超出省略。
二、实现
- Html
- Css
- JavaScript
<div class="container">
看接口付电费发的酸辣房东说了富发多少莲富大厦理发店设计费留点时间发来的司法鉴定蓝山咖啡较大时发的酸辣粉都说了房东说了富家大室发多少理发店浪费大数据开发留点时间发的酸辣粉尽快都说了发多少李逵负荆都是发的酸辣粉发多少莲富大厦发的酸辣粉跨境电商诶瑞入额发的酸辣粉发的酸咖啡机腐恶五福发的射流风机fewi瑞发的酸女,水电费没得商量咖啡机打撒发多少理发店份额无i付额外i佛挡杀佛领导是份额无i付额外i发的酸辣粉跨境电商发的酸辣粉方位服务发的酸辣粉跨境电商敷设电缆咖啡机辅导授课丽枫酒店发多少李逵负荆都是飞蛾五福额外法律手段开发了第三方v明细
</div>
.container {
width: 300px;
height: 300px;
font-size: 24px;
position: relative;
overflow: hidden;
line-height: 36px;
}
.container.overflow {
overflow: hidden;
position: relative;
display: -webkit-box;
-webkit-box-orient: vertical;
}
function getCssValue(value) {
value = String(value);
if (value.endsWith('%')) {
return parseFloat(value) / 100.0;
}
return parseFloat(value);
}
function getLineHeightRadix(value, fontSize) {
if (value === 'normal') {
return 1.14;
} else if (value.endsWith('%')) {
return getCssValue(value);
} else if (
value.endsWith('px') ||
value.endsWith(/(vw|vh)/) ||
value.endsWith('em') ||
value.endsWith('rem')
) {
return (getCssValue(value) / getCssValue(fontSize)).toFixed(2);
}
return value;
}
function adaptiveSize(node) {
const minFontSize = 12;
const nodeStyle = getComputedStyle(node);
let fontSize = getCssStyleValue(nodeStyle.fontSize);
const lineHeightRadix = getLineHeightRadix(nodeStyle.lineHeight,fontSize);
while (
node.scrollHeight > node.clientHeight &&
fontSize > minFontSize
) {
fontSize--;
node.style.fontSize = fontSize + 'px';
node.style.lineHeight = lineHeightRadix * fontSize + 'px';
}
if (node.scrollHeight > node.clientHeight && fontSize <= minFontSize) {
node.classList.add('overflow');
const lineHeight = getCssStyleValue(nodeStyle.lineHeight);
node.style['-webkit-line-clamp'] = Math.ceil(node.clientHeight / lineHeight);
}
}
const containerDOM = document.querySelector('.container');
adaptiveSize(containerDOM);