纯CSS可根据动态字符数量使字体大小响应

DMT*_*ner 281 css css3

我知道这可以通过Javascript轻松解决,但我只对纯CSS解决方案感兴趣.

我想要一种动态调整文本大小的方法,以便它始终适合固定的div.以下是示例标记:

<div style="width: 200px; height: 1em; overflow: hidden;">
  <p>Some sample dynamic amount of text here</p>
</div>
Run Code Online (Sandbox Code Playgroud)

我想也许这可以通过在ems中指定容器的宽度,并使字体大小继承该值来实现?

DMT*_*ner 484

我刚刚发现这可以使用大众单位.它们是与设置视口宽度相关联的单位.有一些缺点,例如缺乏传统的浏览器支持,但这绝对值得认真考虑使用.另外,您仍然可以为旧浏览器提供后备服务,例如:

p {
    font-size: 30px;
    font-size: 3.5vw;
}
Run Code Online (Sandbox Code Playgroud)

http://css-tricks.com/viewport-sized-typography/https://medium.com/design-ux/66bddb327bb1

  • Upvoted,但现在我想知道这是否真的回答了原始问题.我的理解是你的文本长度是动态的,你想要改变字体大小以始终适合你的`div`(200px)的宽度.这是如何解决这个问题的? (105认同)
  • 专业提示:您可以通过执行`font-size:calc(100%+ 2vw);`或类似操作来防止文本变得太小并获得一些控制权.它有点像`min-font-size`.浏览器对`calc`的支持类似于`vw`. (33认同)
  • 为这一个提供2个上升.获胜的CSS解决方案! (30认同)
  • 我同意@Floremin的观点.这会根据视口宽度/高度缩放所有字体大小,而不是文本宽度/高度的容器. (23认同)
  • @Floremin是对的,这没有解决这个问题.这将字体大小计算为容器宽度的函数,而不是与容器宽度相关的字符串长度的函数 (21认同)
  • 哦,我错过了那些!所以现在我们有em,ex,ch,rem,vh,vh,vmin,vmax,px,mm,cm,in,pt和pc![mozilla doc](https://developer.mozilla.org/en-US/docs/Web/CSS/length) (7认同)
  • 答案解决了另一个问题.使用视口单元将使字体大小响应视口的大小,而不是文本的字符数. (7认同)
  • 另一票给@Floremin's.这并没有解决问题中的问题. (3认同)
  • vw,vh,vmax,vmin单位有时在某些android和ie8中不起作用. (2认同)

aWe*_*per 105

CSS3支持相对于视口的新维度.但这在android <4.4中不起作用

  1. 3.2vw =视口宽度的3.2%
  2. 3.2vh =视口高度的3.2%
  3. 3.2vmin = 3.2vw或3.2vh的较小值
  4. 3.2vmax = 3.2vw或3.2vh的较大值

    body
    {
        font-size: 3.2vw;
    }
    
    Run Code Online (Sandbox Code Playgroud)

css-tricks.com/....还看看caniuse.com/....

要么

使用媒体查询.最简单的方法是使用%或em中的维度.只需更改基本字体大小,一切都会改变.

@media (max-width: @screen-xs) {
    body{font-size: 10px;}
}

@media (max-width: @screen-sm) {
    body{font-size: 14px;}
}


h5{
    font-size: 1.4em;
}
Run Code Online (Sandbox Code Playgroud)

使用%或em中的维度.只需更改基本字体大小,一切都会改变.在上一个中,您可以只更改正文字体而不是每次更改h1,或者让基本字体大小为设备的默认值,并将其全部放在em中

有关em,px和%的更多信息,请参阅kyleschaeffer.com/....

  • 问题是关于相对于容器的缩放,而不是整个视口. (12认同)
  • ...而问题是基于字符数量的缩放 (6认同)

Kho*_*Phi 28

您可能对此方法感兴趣calc:

font-size: calc(4vw + 4vh + 2vmin);
Run Code Online (Sandbox Code Playgroud)

完成.调整值直到符合您的口味.

资料来源:https://codepen.io/CrocoDillon/pen/fBJxu


Sve*_*jek 12

唯一的方法可能是为不同的屏幕尺寸设置不同的宽度,但这种方法非常简单,你应该使用js解决方案.

h1 {
    font-size: 20px;
}

@media all and (max-device-width: 720px){
    h1 {
        font-size: 18px;
    }
}

@media all and (max-device-width: 640px){
    h1 {
        font-size: 16px;
    }
}

@media all and (max-device-width: 320px){
    h1 {
        font-size: 12px;
    }
}
Run Code Online (Sandbox Code Playgroud)


use*_*058 12

我知道我正在重新解决一个长期存在的问题,但我有同样的问题,我想补充一些东西.请不要因为这个而禁止我,我觉得重要的是要证明这个答案,我会在必要时删除.@Joseph Silber错了,编码所有可能性实际上是一种可行的方法来做到这一点.原因是因为实际上没有无限的可能性.嗯,技术上有,但99%的访问者将使用标准分辨率.这对于移动设备来说是双重的(响应式网页设计的主要原因),因为大多数移动操作系统全屏运行应用程序,没有窗口大小调整.

此外,由于滚动条的高度几乎无关紧要(到一定程度,我会立即留下一个超过4或5英尺长的网页,但这大部分都是正确的),所以你只需要担心宽度.实际上,您需要编码的唯一宽度如下:240,320,480(对于较旧的iThings),640,800,1024,1280,1440,1600,1920,2048,2560.甚至不打扰4k,它会使你的图像膨胀太多,2560尺寸拉伸到100%宽度在4k显示器上看起来很好(我已经测试了这个).另外,不要像上一张海报建议的那样打扰720(720x480).它的分辨率几乎完全由数码相机使用,即便如此,它也非常罕见.

如果有人使用异国情调的分辨率,那么过去15年中制作的几乎所有渲染器都会向下舍入,所以如果有人的屏幕宽度是,那么.1100,它将加载1024 CSS规则,您的网站不应该破坏.这通过尝试创建不必要的响应规则来呈现异常分辨率,并且您需要逐个像素地为每个可能的设置进行编码的想法是荒谬的,除非有人使用网络浏览器如此过时以至于您的网站可能无法加载无论如何.


Mar*_*ack 6

作为参考,一个非CSS解决方案:

下面是一些JS,它根据容器内的文本长度来调整字体大小。

Codepen的代码略有修改,但思路如下:

function scaleFontSize(element) {
    var container = document.getElementById(element);

    // We only want to scale down long text, so first we reset
    // font-size to 100%, in case this function is called multiple times.
    container.style.fontSize = "100%";

    // Now actually check if the text is wider than
    // its container, if so then reduce font-size
    if (container.scrollWidth > container.clientWidth) {
        container.style.fontSize = "70%";
    }
}
Run Code Online (Sandbox Code Playgroud)

对我来说,当用户在下拉菜单中进行选择时,我会调用此函数,然后填充菜单中的div(这是发生动态文本的位置)。

    scaleFontSize("my_container_div");
Run Code Online (Sandbox Code Playgroud)

此外,我还使用CSS省略号(“ ...”)截断甚至更长的文本,如下所示:

#my_container_div {
    width: 200px; /* width required for text-overflow to work */
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}
Run Code Online (Sandbox Code Playgroud)

因此,最终:

  • 短文字:例如“ APPLES”

    充分呈现,漂亮的大字母。

  • 长文本:例如“苹果和橘子”

    通过上述JS缩放功能将其缩小70%。

  • 超长文字:例如“苹果,橙子和香蕉...”

    通过上面的JS缩放功能和CSS规则,将比例缩小70%,并用“ ...”省略号截断。

您还可以探索使用CSS字母间距来缩小文本,同时保持相同的字体大小。


Shu*_*wei 5

calc(42px + (60 - 42) * (100vw - 768px) / (1440 - 768));
Run Code Online (Sandbox Code Playgroud)

使用这个等式。

对于大于或小于 1440 和 768 的任何值,您可以给它一个静态值,或应用相同的方法。

vw 解决方案的缺点是你不能设置缩放比例,比如屏幕分辨率 1440 下的 5vw 可能最终是 60px 字体大小,你的想法字体大小,但是当你将窗口宽度缩小到 768 时,它可能会结束是 12px,不是你想要的最小尺寸。使用这种方法,您可以设置上边界和下边界,字体将在两者之间自行缩放。

  • 这非常聪明、简单而且酷极了。使用“clamp()”可以使最小和最大字体大小紧凑以表达且易于阅读。 (4认同)