#javascript #html #css #fonts
#javascript #HTML #css #шрифты
Вопрос:
Представьте, что у вас есть строка символов и HTML-div-элемент фиксированного размера. Сколько символов строки поместилось бы в div (без переноса) при использовании моноширинного шрифта и заданного фиксированного размера шрифта? Бонус: как можно, наконец, слегка отрегулировать размер шрифта, чтобы текст действительно занимал всю ширину контейнера.
JS
var s = "skjhfkjsdhjfksdhjkghskjgh...";
CSS
#c { width:267px; font-size:30px; font-family:monospace }
HTML
<div id="c"></div>
Посмотрите на эту скрипку для импровизированного подхода, который работает, но, я думаю, не такой чистый. Могут быть лучшие способы: https://jsfiddle.net/6et20853/1 /
Ответ №1:
Вам понадобится .getBoundingClientRect
элемент, содержащий один моноширинный символ, чтобы получить ширину одного символа:
oneCharWidth = document.querySelector('#testing').getBoundingClientRect().width;
console.log(oneCharWidth)
<span id="testing" style="font-family: monospace">a</span>
Если вы хотите проверить, какой размер шрифта позволит строке текста поместиться в контейнер фиксированного размера:
var widthOfContainer = 400, // The width of the container in pixels
textLength = "Hello world!".length, // The text to fit
testElem = document.querySelector('#testing'),
widthOfChar,
fontSize = 100; // Our initial guess (must be exaggerated, otherwise optimal value won't be reached)
do {
fontSize--;
testElem.style.fontSize = fontSize 'px';
widthOfChar = testElem.getBoundingClientRect().width;
} while (textLength * widthOfChar > widthOfContainer);
var container = document.querySelector('#container');
container.style.fontSize = fontSize 'px';
testElem.parentNode.removeChild(testElem); // Remove #testing element
#container {
border: 1px solid red;
font-family: monospace;
width: 400px;
}
#testing {
font-family: monospace;
}
<div id="container">Hello world!</div>
<span id="testing">a</span>