繁体   English   中英

Javascript:如何获得浏览器的最小字体大小?

[英]Javascript: How can I get a browser's minimum font size?

获得浏览器最小字体大小的最佳方法是什么? 我编写了以下代码,它进行了二进制搜索。 它有效,但我想知道是否有标准或更有效的方法。

function getMinimumFontSize() {
  var el = document.createElement('div');
  document.body.appendChild(el);
  el.innerHTML = "<div><p>a b c d e f g h i j k l m n o p q r s t u v w x y z</p></div>";
  el.style.fontSize = '1px';
  el.style.width = '64px';
  var minimumHeight = el.offsetHeight;
  var least = 0;
  var most = 64;
  var middle; 
  for (var i = 0; i < 32; ++i) {
    middle = (least + most)/2;
    el.style.fontSize = middle + 'px';
    if (e.offsetHeight === minimumHeight) {
      least = middle;
    } else {
      most = middle;
    }
  }
  return middle;
}

仅仅设置样式并读取它是行不通的,因为它将返回设置而不是浏览器实际使用的内容。

我需要最小字体大小,以便我可以动态地重新调整内容大小以将所有内容保留在一页上,而无需滚动。 如果浏览器忽略我的字体大小更改,这很难做到,因为我已经低于最小值。 因此,对于这种情况,我将缩小其他内容,例如图形。

我是这样做的:

var ta = document.createElement('textarea');
ta.style.display = 'none';
ta.style.fontSize = '6px'; // I think this is the smallest possible, if not put smaller value
document.body.appendChild(ta); // needs to be part of DOM to be able to calculate
var minimumFontSize = window.getComputedStyle(ta, null).getPropertyValue('font-size'); // returns '20px' for me when I set minimum font size to 20px

编辑:这不适用于Firefox,所以我创建了一个新的,略有不同的方法:

var ta = document.createElement('div');
ta.style.fontSize = '6px';
ta.style.lineHeight = '1';
ta.innerHTML = 'a';
document.body.appendChild(ta);
var minimumFontSize = ta.clientHeight;

6年后,Chrome和Firefox都允许最小字体大小为零。 这是我的基本方法,类似于第一个答案中的第一个例子:

element.style.fontSize = 0;
let actualMinSize = getComputedStyle(element).fontSize;

您必须从计算结果中删除“px”以获取数字,并且必须显示该元素,但它可以通过position:absolute; 这似乎适用于Chrome和Firefox,因此不需要clientHeight解决方法AFAICT。

今年早些时候,在Chrome 73中,root em空间大小和Chrome中的最小字体大小设置存在问题。 从那时起,Chrome改变了他们的最小字体大小政策和用户界面。 他们现在支持零最小值,Firefox也是如此。

我的应用程序有一个用户大小的窗口,可以垂直滚动文本,元素的宽度通过font-size间接设置,因此更宽的元素等于更大的字体大小。 如果用户试图在配置的最小字体大小下面调整窗口大小,我需要将其作为最小元素宽度处理。

虽然我可以为一个元素设置font-size为零,但是字体大小低于3px是有问题的,因为字体大小越小,它与文本宽度的比例越小,以及我尚未完全调试的其他原因。 在某个时刻,请求的1px宽度减少允许我更改字体大小,但<div> clientWidth冻结:更改font-size对宽度没有影响。 减少2px是可以的,因为变化更大,或者看起来如此。 我可以在调试器的Watch窗格中将style.width设置为所需的值,这使我无法循环。

最奇怪的是我可以在不同的字体大小/宽度下引起这个问题,没有精确的引爆点。 它更像是一个小变化有问题的范围。 它可能是一个Chrome错误,但无论如何我看起来不太可能是3px以下。 我可以在这个元素中强制执行我自己的最小3px,以简单地回避这些问题。

我的问题出现在以下浏览器中:QQBrowser *¹ 和搜狗资源管理器 *²。

如果您将任何元素插入或更改为 9px 以下的字体,它会忽略并保留 9px。

也许我的问题与上面提到的有点不同,但我用这个 polyfill 解决了它:

// get-min-visible-font-size.js v1
function getMinVisibleFontSize() {
    var spanFS = document.createElement('span');
    spanFS.setAttribute('style', 'font-size:1px!important;display:none!important;');
    document.body.appendChild(spanFS);
    var minFontSize = parseInt(getComputedStyle(spanFS).fontSize);
    document.body.removeChild(spanFS);
    return minFontSize;
};

我选择返回一个整数值,因为它使以后的测试更容易:

if( getMinVisibleFontSize() > 6){
    [...]
};

但是所有的返回值实际上都是以像素为单位的。

它是如何工作的:只需使用 font-size = 1px 发送垃圾邮件,将其添加到正文并检查字体大小。 如果它大于 1px,那么您所在的浏览器会限制最小字体大小(在这些情况下为 9px 或 12px)。 重要的是该值不为零,因为如果在所有情况下都检查零,则文本消失并且即使在这些浏览器中也会得到零。

可能是以后有一些CSS定义了min-font-size和min-width,所以我把函数名设为minVisibleFontSize。

适用于 IE-11,但我没有为旧浏览器执行此操作...

¹ = QQBrowser v10.8.3,基于 Chromium 70.0.3538.25。 (9px) ² = Sogou Explorer v11.0.1.34700,基于 Chromium 80.0.3987.87 我认为是因为它在 userAgent 中。 (12 像素)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM