根据Flexbox容器的高度设置字体大小。

5
我想知道是否可以使用flexbox项目的高度来设置字体大小。我的flexbox容器使用视口单位进行设置,项目的高度是通过flex-grow属性确定的。我想要做的是将字体大小设置为这些项目的高度,并在视口改变时保留这些关系。
我有一个基本的想法,有些效果,但我不确定如何仅隔离字母(基线到大写字母高度)并将其缩放到项目容器中。
欢迎提出任何建议,或者遇到任何问题,请参考以下HTML链接:https://codepen.io/NewbCake/pen/JvwNJq(垂直调整窗口大小以设置字体大小)。
<section class="center">
  <div class="container">
    <div class="item1">H</div>
    <div class="item2">H</div>
  </div>
</section>

CSS

section {
  display:flex;
  flex-direction:row;
  height:95vh;
  width:100%;
  border:1px solid red;
}

.container {
  display:flex;
  flex-direction:column;
  height:80vh;
  width:80vh;
  border:1px solid blue;
}

.container_wide {
  display:flex;
  flex-direction:column;
  height:80vh;
  width:80vh;
  border:1px solid blue;
}

.center {
  justify-content:center;
  align-items:center;
}

.item1 {
  flex-grow:1;
  flex-shrink:0;
  flex-basis:auto;
  border:1px solid green;
  line-height:.75;
}

.item2 {
  flex-grow:3;
  flex-shrink:0;
  flex-basis:auto;
  border:1px solid green;
  line-height:.75;
}

JS

var resizeTimer;

$(window).on('resize', function(e) {

  clearTimeout(resizeTimer);
  resizeTimer = setTimeout(function() {

    // Run code here, resizing has "stopped"
    $(".item1").css("font-size", $(".item1").css("height"));
    $(".item2").css("font-size", $(".item2").css("height"));            
  }, 250);
});

非常感谢您的帮助!

1个回答

4
如果您控制了flex-grow,则可以进行一些计算,根据容器的高度来获取font-size。因此,如果您有一个1 + 2作为flex-grow,则表示第二个将是第一个的两倍,因此我们可以将H高度定义为H+2*H = 容器高度=80vh,因此H = calc(80vh / 3)
因此,第一个项目将具有font-size:H,而第二个项目将具有font-size:2*H
您还可以考虑使用CSS变量来更好地处理此问题。

body {
   margin:0;
  padding:0;
  font-family: sans-serif;
}

header {
  display:flex;
  height:5vh;
}
section {
  display:flex;
  flex-direction:row;
  height:95vh;
  width:100%;
  border:1px solid red;
}

.container {
  display:flex;
  flex-direction:column;
  --h:80vh;
  height:var(--h);
  width:var(--h);
  border:1px solid blue;
}

.gauge {
  display:flex;
  flex-direction:column;
  height:80vh;
  width:10vh;
  border:1px solid blue;
}

.center {
  justify-content:center;
  align-items:center;
}

.item1 {
  flex-grow:1;
  font-size:calc((var(--h) / 3));
  flex-shrink:0;
  flex-basis:auto;
  border:1px solid green;
  line-height:1;
}

.item2 {
  font-size:calc((var(--h) / 3) * 2);
  flex-grow:2;
  flex-shrink:0;
  flex-basis:auto;
  border:1px solid green;
  line-height:1;
}
<header class="center">resize window vertically</header>
<section class="center">
  <div class="gauge">
    <div class="item1"></div>
    <div class="item2"></div>
  </div>
  <div class="container">
    <div class="item1">Haj</div>
    <div class="item2">Hlp</div>
  </div>
</section>


嗨@Temani Afif,感谢您的回复。这是一种有趣的使用calc设置字体大小的方式。然而,我希望保持更灵活的方式,并且能够在一个地方仅更改容器高度,同时仍保留flex-grow关系,或者反之亦然。但也许可以通过将容器高度和flex-grow属性分别设置为单独的变量来实现?我不太熟悉如何在CSS中实现这一点。另一个问题是,这不会随着视口的更改而动态更改(除非刷新页面)。我们可以通过保留JS来实现这个吗? - NewbCake
@NewbCake,你可以使用CSS变量(请查看我的编辑)...顺便问一下,这个为什么不会动态改变?当调整大小时,片段中没有发生变化吗?顺便说一句,不再需要JS函数了。 - Temani Afif
@ Temani Afif,这对变量的使用效果很好。是否可以使用变量设置flex-grow,以便calc仅基于变量进行计算?我所说的不动态更改是指内容在我更改浏览器窗口大小时不会重新调整大小。JS是否只能用于检测窗口大小调整并重新计算字体大小值? - NewbCake
@NewbCake,我的回答的整个重点就是可以动态调整大小:) 我很惊讶你说它无法动态调整大小... 你使用的是哪个浏览器? - Temani Afif
@NewbCake,正如预期的那样,缺乏支持...请查看此链接:https://caniuse.com/#search=calc 并查看已知问题,您会发现vh/vw在Safari中无法在calc中使用。 - Temani Afif
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接