【问题标题】:How to force a block container to take always all the available width?如何强制块容器始终占用所有可用宽度?
【发布时间】:2016-12-15 06:16:18
【问题描述】:

这是我目前正在练习的 HTML 代码。 CSS 不完整,因为我不知道该怎么做:

.container {
  margin: auto;
  width: 700px;
  border: solid blue 2px;
}
.container div {
  padding: 10px 0;
  vertical-align: top;
}
#orange {
  background-color: coral;
}
#blue {
  background-color: lightblue;
}
.container > div .content {
  border: dotted black 1px;
  height: 100px;
  width: 250px;
  margin: auto;
  display: block;
  text-align: center;
}
<div class="container">
  <div id="orange">
    <div class="content">content
      <br />width: 250px</div>
  </div>
  <div id="blue">
    <div class="content">content
      <br />width: 250px</div>
  </div>
</div>

当容器足够大时,橙色和蓝色块应该并排放置,如下所示:

如果我减小容器的宽度,橙色和蓝色块内的水平边距会缩小,直到它们的边框与内容的边框相交:

这是我在减小容器宽度时想要获得的结果:

有人知道怎么做吗? 如果可能的话,不用 JS。并且容器不依赖于屏幕大小,所以我不能使用基于设备宽度的媒体查询。 当然,该解决方案必须与尽可能多的网络浏览器兼容(包括最新版本的 IE)。

编辑: 我考虑过使用flexbox,但我希望我能找到没有的解决方案。 顺便说一句,我有兴趣在 CSS 代码中编写仅适用于 IE9 及以下版本的特定规则。

编辑2: 似乎不可能通过以下限制做我想做的事:

  • 没有JS
  • 对屏幕尺寸没有条件,而是在容器尺寸上

所以我想我必须至少放弃其中一个......

【问题讨论】:

  • 探索flexbox - display: flex
  • .container中使用display:inline-block
  • 按照@Pugazh 的建议使用 flexbox。他附加的链接中有很好的参考。
  • 您还可以查看媒体查询:w3schools.com/cssref/css3_pr_mediaquery.aspcss-tricks.com/snippets/css/media-queries-for-standard-devices - 如果您正在寻找它在旧版浏览器上的工作。 Flexbox 适用于现代浏览器
  • @Pugazh:是的,我已经把这篇文章加红了(顺便说一句,这很好)。但是,在一个完美的世界里,我需要 IE9 兼容性......而且 IE9 不支持 flexbox。 :( 但是如果我没有找到其他解决方案,我会尝试使用 flexbox。

标签: css responsive


【解决方案1】:

只需将inline-block 添加到需要并排的两个框,块元素就会按照你喜欢的方式运行(始终采用所有可用宽度),因为这是块元素的默认行为。

.container { 
  margin: auto; 
  font-size: 0;
  width: 700px;
}
.container div { 
  padding: 10px 0;
  display: inline-block;
  vertical-align: top;
  font-size: 1rem;
}
#orange { background-color: coral; }
#blue { background-color: lightblue; }

.container > div .content {
  border: dotted black 1px;
  height: 100px;       
  width: 250px;
  margin: auto;
  display: block;
  text-align: center;
}
<div class="container">
  <div id="orange">
    <div class="content">content<br />width: 250px</div>
  </div>
  <div id="blue">
    <div class="content">content<br />width: 250px</div>
  </div>
</div>

虽然 inline-block 使用块行为在文本流上运行,但您需要避免框之间的空格。这就是为什么我在容器中设置font-size:0,并在内部框中再次重置font-size: 1rem 来实现这一点。

【讨论】:

  • 您可以使用媒体查询来实现,但这取决于屏幕分辨率,而不是元素的宽度。元素查询目前只是一个 javascript 插件,可以监听盒子大小的变化并触发元素。如果此解决方案符合您的要求(添加 javascript 插件),我可以添加比此更好的答案。
  • 我会稍等一下,看看是否有人有一个绝妙的主意。但如果不是,我认为解决方案将是 flexbox... 所有容器宽度始终被橙色和蓝色块覆盖这一事实是必不可少的,而您的解决方案没有实现这一点。
  • The fact that all the container width is always covered by both the orange and blue blocks is essential。如果您定义宽度的250px...您希望表现如何?真的很混乱。这没有什么绝妙的主意。您想要实现的有两种解决方案:弹性盒或元素查询。元素查询很好,你可以写 CSS,js 引擎会处理它。当一个元素满足你想让另一个 CSS 运行的条件时。
  • 橙色和蓝色块没有 250px 宽度...没关系。不过谢谢你的回答。
  • elementqueries.com :即使我不能在这种情况下使用它,由于限制我无法更改,这很有趣!
【解决方案2】:

使用弹性盒的解决方案。

如果您希望拥有特定于 IE9 及以下版本的样式,有 2 个选项:

  1. 具有特定于 IE 9 及以下版本的单独样式表(.css 文件),在 HTML 中引用它 - Target IE9 Only via CSS

  2. 以这种方式编辑 CSS - https://css-tricks.com/snippets/css/browser-specific-hacks

.container {
  display: flex;
  background-color: green;
  justify-content: space-around;
  padding: 10px;
}
#orange {
  background-color: coral;
  height: 100px;
  min-width: 250px;
  text-align: center;
  margin: 5px;
}
#blue {
  background-color: lightblue;
  height: 100px;
  min-width: 250px;
  text-align: center;
  margin: 5px;
}
@media (max-width: 500px) {
  .container {
    flex-flow: row wrap;
  }
}
<div class="container">
  <div id="orange">
    <div class="content">
      content
      <br/>width: 250px
    </div>
  </div>
  <div id="blue">
    <div class="content">
      content
      <br/>width: 250px
    </div>
  </div>
</div>

【讨论】:

  • 除非我弄错了,媒体查询评估的宽度是设备宽度。但是例如,.container 在 800 像素的屏幕上可以是 50% 的宽度。这使自己的宽度为 400 像素。那么你的解决方案会奏效吗?
  • @Eria - 不。如果您需要根据.container 的大小应用样式,则必须使用 JavaScript。
猜你喜欢
  • 2013-01-01
  • 2020-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-06
  • 2015-03-04
  • 2013-03-18
  • 2019-07-28
相关资源
最近更新 更多