【问题标题】:Resize font-size according to div size [duplicate]根据div大小调整字体大小[重复]
【发布时间】:2012-11-01 17:32:11
【问题描述】:

它由9个盒子组成,中间有文字。 我已经做到了,所以这些框会随着屏幕的大小而调整,所以它会一直保持在同一个地方。

但是,即使我使用百分比,文本也不会调整大小。

  1. 如何调整文本大小,使其始终与整个页面保持相同的比例?
  2. 这是处理多种分辨率的合适解决方案吗?还是我应该在 CSS 中有很多 @media 检查并为每种媒体类型设置很多布局?

html,
body {
  height: 100%;
  width: 100%;
}

#launchmain {
  width: 55%;
  display: inline-block;
  position: relative;
  top: 10%;
  left: 25%;
}

#launchmain:after {
  padding-top: 79.26%;
  display: block;
  content: '';
  margin-top: 10px;
}

#box1 {
  border: 1px solid #000000;
  position: absolute;
  width: 25.37%;
  height: 21.88%
}

#box2 {
  border: 1px solid #000000;
  width: 48.48%;
  height: 21.88%;
  position: absolute;
  left: 25.64%
}

#box3 {
  border: 1px solid #000000;
  width: 25.37%;
  height: 21.88%;
  position: absolute;
  left: 74.39%;
}

#box4 {
  border: 1px solid #000000;
  width: 33.235%;
  height: 53.84%;
  position: absolute;
  top: 22.07%;
}

#maininvite {
  border: 1px solid #000000;
  width: 33.53%;
  height: 53.84%;
  position: absolute;
  top: 22.07%;
  left: 33.235%;
}

#box6 {
  border: 1px solid #000000;
  width: 33.235%;
  height: 53.84%;
  position: absolute;
  top: 22.07%;
  left: 66.765%;
}

#box7 {
  border: 1px solid #000000;
  width: 25.37%;
  height: 21.88%;
  position: absolute;
  top: 76.2%;
}

#box8 {
  border: 1px solid #000000;
  width: 48.48%;
  height: 21.88%;
  position: absolute;
  left: 25.64%;
  top: 76.2%;
}

#box9 {
  border: 1px solid #000000;
  width: 25.37%;
  height: 21.88%;
  position: absolute;
  top: 76.2%;
  left: 74.39%;
}

#maininvite h2 {
  font-size: 180%;
}

p {
  position: relative;
  font-size: 80%;
}
<div id="launchmain">
  <div id="box1"></div>
  <div id="box2"></div>
  <div id="box3"></div>
  <div id="box4"></div>
  <div id="maininvite">
    <h2> header</h2>
    <p>not a lot of text here but still overflowing</p>
  </div>
  <div id="box6"></div>
  <div id="box7"></div>
  <div id="box8"></div>
  <div id="box9"></div>
</div>

【问题讨论】:

  • 您的文字大小不会使用百分比来调整,它会保持不变。这不是容器 div 的百分比,而是容器中设置的文本大小的百分比。
  • 仅使用 CSS 是不可能的。您将需要使用 Javascript。看看这个,我知道它在以下问题中将文本保留在 1 行,但它应该让你在正确的行上 stackoverflow.com/questions/3401136/…

标签: css responsive-design


【解决方案1】:

我找到了一种根据 div 大小调整字体大小的方法,无需任何 JavaScript。我不知道它的效率有多高,但它很好地完成了工作。

在所需的 div 中嵌入一个 SVG 元素,然后使用一个可以在其中使用 HTML 元素的 foreignObject 标签。下面给出了一个完成我的工作的示例代码 sn-p。

<!-- The SVG element given below should be place inside required div tag -->
<svg viewBox='0 2 108.5 29' xmlns='http://www.w3.org/2000/svg'>
    <!-- The below tag allows adding HTML elements inside SVG tag -->
    <foreignObject x='5' y='0' width='93.5%' height='100%'>
        <!-- The below tag can be styled using CSS classes or style attributes -->
        <div xmlns='http://www.w3.org/1999/xhtml' style='text-overflow: ellipsis; overflow: hidden; white-space: nowrap;'>
            Required text goes here            
        </div>
    </foreignObject>
</svg>

所有viewBox、x、y、宽高值都可以根据需要改变。

文本可以在 SVG 元素本身内部定义,但是当文本溢出时,省略号不能添加到 SVG 文本中。因此,HTML 元素被定义在 foreignObject 元素中,并且文本溢出样式被添加到那个/那些元素中。

【讨论】:

    【解决方案2】:

    我提出的答案非常简单,我将使用“vw”,而不是使用“px”、“em”或“%”。 简而言之,它可能看起来像这样:- h1 {字体大小:5.9vw;} 用于航向时。

    看到这个:Demo

    更多详情:Main tutorial

    【讨论】:

    • 你能修正一下你的格式,或许可以多加一点解释吗?
    • vw 的一个单位是视口轴的 1%。 “视口” == 浏览器窗口大小 == 窗口对象。如果视口是 40 厘米宽,1vw == 0.4 厘米。
    • 例如刚刚将 "font-size: 80%" 改为 "font-size: 2.5vw" , jsfiddle
    【解决方案3】:

    关于您的代码,请参阅@Coulton。您需要使用 JavaScript。

    结帐FitText(它在 IE 中确实有效,他们只是以某种方式将他们的网站搞砸了)或BigText

    FitText 将允许您相对于它所在的容器缩放一些文本,而 BigText 更多的是关于将不同文本部分的大小调整为容器内的相同宽度。

    BigText 会将您的字符串设置为与容器的宽度完全相同,而 FitText 的像素不那么完美。首先将字体大小设置为容器元素宽度的 1/10。默认情况下,它不适用于所有字体,但它有一个设置允许您减少或增加调整大小的“力量”。它还允许您设置最小和最大字体大小。第一次开始工作需要一些摆弄,但效果很好。

    http://marabeas.io

    对于那些使用 Angularjs 的人,这是我制作的 FitText 的 Angular version


    这是一个 LESS mixin,您可以使用它来使 @humanityANDpeace 的解决方案更漂亮:

    @mqIterations: 19;
    .fontResize(@i) when (@i > 0) {
        @media all and (min-width: 100px * @i) { body { font-size:0.2em * @i; } }
        .fontResize((@i - 1));
    }
    .fontResize(@mqIterations);
    

    感谢@NIXin,还有一个 SCSS 版本!

    $mqIterations: 19;
    @mixin fontResize($iterations) { 
        $i: 1; 
        @while $i <= $iterations { 
            @media all and (min-width: 100px * $i) { body { font-size:0.2em * $i; } } 
            $i: $i + 1; 
        }
    } 
    @include fontResize($mqIterations);
    

    【讨论】:

    • 我认为“你需要使用 JavaScript”,加上你最后的 sn-p,意味着如果你也想提供一个纯 CSS 的解决方案,它应该是一个单独的回答。
    • 这是你的 mixin 的 SCSS 版本:$mqIterations: 19; @mixin fontResize($iterations) { $i: 1; @while $i &lt;= $iterations { @media all and (min-width: 100px * $i) { body { font-size:0.2em * $i; } } $i: $i + 1; } } @include fontResize($mqIterations);
    【解决方案4】:

    这是@Patrick 的 mixin 的 SCSS 版本。

    $mqIterations: 19;
    @mixin fontResize($iterations)
    {
      $i: 1;
      @while $i <= $iterations
      {
        @media all and (min-width: 100px * $i) {
          body { font-size:0.2em * $i; }
        }
        $i: $i + 1;
      }
    }
    @include fontResize($mqIterations);
    

    【讨论】:

      【解决方案5】:

      我一直在寻找相同的功能并找到了这个答案。但是,我想给你们一个快速的更新。它是 CSS3 的 vmin 单位。

      p, li
      {
        font-size: 1.2vmin;
      }
      

      vmin 表示“视口高度的 1% 和视口宽度的 1% 之间较小的那个”。

      More info on SitePoint

      【讨论】:

      • 虽然这是最好的答案,但绝对值得注意的是lack of browser support
      • 但这并不能真正解决手头的问题。但结合 calc() 函数,它可能会非常有用。现在的浏览器支持非常好,如果您只关心“现代”用户,那么您几乎可以覆盖。
      • 为什么说它不能解决问题?它应该根据视口大小调整字体大小。
      • 你知道 safari 和 Opera 浏览器中的 vmin 是如何工作的吗?
      • 好吧,只是一个快速更新:除了 Opera Mini,它现在可以在所有浏览器中使用
      【解决方案6】:

      我的回答不需要 Javascript,只依赖 CSS3(在大多数现代浏览器中可用)。如果设计不太依赖 Javascript,我个人非常喜欢它。

      我的答案是“纯 CSS3,无需 Javascript”-解决方案:

      可以在此处看到的解决方案 (http://jsfiddle.net/uNF3Z/16/) 使用以下 CSS 样式添加(利用 CSS3 的 @media 查询)

      @media all and (min-width: 50px)   {  body  { font-size:0.1em;  } }
      @media all and (min-width: 100px)  {  body  { font-size:0.2em;  } }
      @media all and (min-width: 200px)  {  body  { font-size:0.4em;  } }
      @media all and (min-width: 300px)  {  body  { font-size:0.6em;  } }
      @media all and (min-width: 400px)  {  body  { font-size:0.8em;  } }
      @media all and (min-width: 500px)  {  body  { font-size:1.0em;  } }
      @media all and (min-width: 600px)  {  body  { font-size:1.2em;  } }
      @media all and (min-width: 700px)  {  body  { font-size:1.4em;  } }
      @media all and (min-width: 800px)  {  body  { font-size:1.6em;  } }
      @media all and (min-width: 900px)  {  body  { font-size:1.8em;  } }
      @media all and (min-width: 1000px) {  body  { font-size:2.0em;  } }
      @media all and (min-width: 1100px) {  body  { font-size:2.2em;  } }
      @media all and (min-width: 1200px) {  body  { font-size:2.4em;  } }
      @media all and (min-width: 1300px) {  body  { font-size:2.6em;  } }
      @media all and (min-width: 1400px) {  body  { font-size:2.8em;  } }
      @media all and (min-width: 1500px) {  body  { font-size:3.0em;  } }
      @media all and (min-width: 1500px) {  body  { font-size:3.2em;  } }
      @media all and (min-width: 1600px) {  body  { font-size:3.4em;  } }
      @media all and (min-width: 1700px) {  body  { font-size:3.6em;  } }
      

      这实际上导致字体大小调整为可用的屏幕宽度。这种调整以 100 像素为步长(对于大多数用途来说已经足够细化了),并且覆盖了 1700 像素的最大屏幕宽度,我认为这是足够的(2013 年),并且可以通过添加更多线条来进一步改进。

      另一个好处是每次调整大小时都会调整字体大小。这种动态调整(例如,因为调整了浏览器窗口的大小)可能还没有被基于 Javascript 的解决方案覆盖。

      【讨论】:

      • 有趣的方法,我同意它很丑,但它可以满足我的要求。谢谢。
      • 在我的答案中添加了一个 LESS 版本 - 让它更漂亮一点:)
      • 如果您根据窗口宽度而不是容器 div 大小调整大小,因为这种情况下使用“vw”单位会更容易。
      • 我调整了您的代码以使用 min-height 而不是 min-width,因此 DIV 的高度(在某种程度上)与字体的高度成正比。
      • 打破缩放行为,因此如果您关心可访问性,则无法使用。
      猜你喜欢
      • 2017-11-02
      • 1970-01-01
      • 1970-01-01
      • 2012-01-28
      • 1970-01-01
      • 2013-08-28
      • 2012-11-11
      • 1970-01-01
      • 2017-01-19
      相关资源
      最近更新 更多