我很难理解字体缩放。

我目前有一个字体大小为100%的网站。但这是100%的吗?这似乎是在16个像素处计算出来的。

我的印象是,100%会以某种方式指代浏览器窗口的大小,但显然不是因为无论窗口大小调整为移动宽度还是宽屏桌面,都是16像素。

如何使站点上的文本与其容器相关?我尝试过使用它们,但这也无法扩展。

我的理由是,当你调整大小时,像我的菜单这样的东西会变得压扁,所以我需要减少.menuItem等元素相对于容器宽度的px字体大小。(例如,在大型桌面上的菜单中,22px的效果非常好。向下移动到平板电脑宽度,16px更合适。)

我知道我可以添加断点,但我真的希望文本能够缩放并具有额外的断点,否则,我将以每100像素宽度减少数百个断点来控制文本。


当前回答

看看我的代码。它使字体大小变小,以适应任何地方。

但我认为这并不能带来良好的用户体验

var containerWidth = $("#ui-id-2").width();
var items = $(".quickSearchAutocomplete .ui-menu-item");
var fontSize = 16;

items.each(function(){
    // Displaying a value depends sometimes on your case. You may make it block or inline-table instead of inline-block or whatever value that make the div take overflow width.
    $(this).css({"whiteSpace": "nowrap", "display": "inline-block"});
    while ($(this).width() > containerWidth){
         console.log("$(this).width()" + $(this).width() + "containerWidth" + containerWidth)
         $(this).css("font-size", fontSize -= 0.5);
    }
});

其他回答

这是一个纯CSS解决方案,您承认断点是必要的,但也希望文本缩放:

我知道我可以添加断点,但我真的希望文本能够缩放还有额外的断点,否则。。。。

以下是一种方法:

自定义财产媒体查询断点clamp()(2022年2月的浏览器支持率为93%)计算()

如果可以使用一个通用的缩放因子来控制每个屏幕最大宽度容器内的所有文本缩放,则只需按最大宽度缩放自定义属性,并将此因子应用于1计算。

基本设置如下所示:

:root {
  --scaling-factor: 1
}

.parent {
  font-size: 30px
}

.largest {
  font-size: clamp(60%, calc(var(--scaling-factor) * 100%), 100%); 
}

.middle {
  font-size: clamp(60%, calc(var(--scaling-factor) * 85%), 100%); 
}

.smallest {
  font-size: clamp(60%, calc(var(--scaling-factor) * 70%), 100%); 
}

然后嵌套您的媒体查询,如下所示(或断点所需的任何内容):

@media (max-width: 1200px) {
  :root {
    --scaling-factor: 0.9
  }
  @media (max-width: 800px) {
    :root {
      --scaling-factor: 0.8
    }
    @media (max-width: 600px) {
      :root {
        --scaling-factor: 0.5 /* nope, because the font-size is floored at 60% thanks to clamp() */
      }
    }
  }
}

这将最小化媒体查询标记。

优势

一个自定义属性控制所有缩放。。。无需为每个媒体断点添加多个声明使用clamp()设置了字体大小的下限,这样可以确保文本永远不会太小(这里的下限是父字体大小的60%)

请查看此JSFiddle演示。调整窗口大小,直到宽度最小,段落的字体大小都相同。

带有calc()、CSS单位和数学的纯CSS解决方案

这并不是OP所要求的,但可能会让某人过得很愉快。这个答案并不容易,需要在开发者端进行一些研究。

我终于得到了一个纯CSS解决方案,它使用了不同单位的calc()。您需要对公式有一些基本的数学理解,才能计算出calc()的表达式。

当我完成这项工作时,我必须得到一个全页面宽度的响应标头,在DOM中填充一些父级。我将在这里使用我的值,用你自己的值替换它们。

数学

您需要:

在某些视口中,比例调整得很好。我使用了320个像素,因此我得到了24个像素高和224个像素宽,因此比率为9.333…或28/3容器宽度,我有填充物:3em和全宽,因此达到100wv-2*3em

X是容器的宽度,因此请用自己的表达式替换它,或调整值以获得整页文本。R是你的比率。您可以通过调整某些视口中的值、检查元素宽度和高度并将其替换为自己的值来获得它。此外,它是宽度/高度;)

x = 100vw - 2 * 3em = 100vw - 6em
r = 224px/24px = 9.333... = 28 / 3

y = x / r
  = (100vw - 6em) / (28 / 3)
  = (100vw - 6em) * 3 / 28
  = (300vw - 18em) / 28
  = (75vw - 4.5rem) / 7

砰!成功了!我写了

font-size: calc((75vw - 4.5rem) / 7)

到我的标题,它在每个视口中都调整得很好。

但它是如何工作的?

我们需要一些常量。100vw表示视口的全宽,我的目标是建立带有一些填充的全宽标头。

比率。在一个视口中获得一个宽度和高度,我就得到了一个可以使用的比例,而通过这个比例,我知道在其他视口宽度中的高度应该是多少。用手计算它们需要大量的时间,至少需要大量的带宽,所以这不是一个好答案。

结论

我想知道为什么没有人知道这一点,有些人甚至告诉我,这是不可能修补CSS的。我不喜欢在调整元素时使用JavaScript,所以我不接受JavaScript(并忘记jQuery)的答案而不进行更多挖掘。总而言之,这很好,这是在网站设计中实现纯CSS的一步。

我很抱歉,我的文本中有任何不寻常的惯例,我不是英语母语,而且我对编写Stack Overflow答案也很陌生。

还应该注意的是,我们在一些浏览器中有邪恶的滚动条。例如,当使用Firefox时,我注意到100vw表示视口的全宽,在滚动条下延伸(内容无法扩展。

功能如下:

document.body.setScaledFont = function(f) {
  var s = this.offsetWidth, fs = s * f;
  this.style.fontSize = fs + '%';
  return this
};

然后将所有文档子元素的字体大小转换为em或%。

然后向代码中添加类似的内容以设置基本字体大小。

document.body.setScaledFont(0.35);
window.onresize = function() {
    document.body.setScaledFont(0.35);
}

http://jsfiddle.net/0tpvccjt/

使用vw,em&co.确实有效,但IMO始终需要人为的微调。

这是我刚刚根据@tnt-rox的回答编写的一个脚本,它试图使人类的触摸自动化:

$('#controller').click(function(){$('h2').each(函数){变量$el=$(此),max=$el.get(0),el=空;最大值=最大值? 最大偏移宽度: 320;$el.css({“font size”:“1em”,“display”:“inline”,});el=$el.get(0);el.get_float=函数(){变量fs=0;if(this.style&&this.style.fontSize){fs=parseFloat(this.style.fontSize.replace(/([\d\.]+)em/g,'$1'));}返回fs;};el.bigger=函数(){this.style.fontSize=(this.get_float()+0.1)+'em';};而(el.offsetWidth<max){el.bigger();}//完成触摸。$el.css({“字体大小”:((el.get_float()-0.1)+'em'),'线条高度':'正常','显示':'',});}); // 结束(每个)}); // 结束(字体缩放测试)第二部分{宽度:50%;背景色:番茄;字体系列:'Arial';}氢气{空白:nowrap;}h2:第n个孩子(2){字体样式:斜体;}<script src=“https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js“></script><input type=“button”id=“controller”value=“Apply”/><div><h2>Lorem ipsum dolor公司</h2><h2>测试字符串</h2><h2>甜蜜串联</h2><h2>字体缩放比例</h2></div>

它基本上将字体大小减小到1em,然后开始递增0.1,直到达到最大宽度。

JSFiddle公司

这个呢?将父级的字体大小设置为等于其宽度,然后使用文本元素字体大小的百分比。

.element {
    width: 400px;
    font-size: 400px; /* equal to width */
}

.text {
    width: 10%;  /* will be 40px */
}

我发现这非常简单,特别是当你处理图标时,但也适用于文本。

/*造型的开始*/* {边距:0;填充:0;框大小调整:边框框;}.box格式{显示:块;背景:矢车菊蓝;高度:最大含量;边距底部:32px;}/*样式结束*/.方框p{字体大小:20%;}<div class=“box”style=“width:400px;font-size:400px”><p>文本</p></div><div class=“box”style=“width:128px;font-size:128px”><p>文本</p></div><div class=“box”style=“width:10vw;font-size:10vw”><p>文本</p></div><div class=“box”style=“width:64px;font-size:64px”><p>文本</p></div>