使用 CSS Grid 和 Flexbox 水平对齐位于不同网格单元格中的元素

Posted

技术标签:

【中文标题】使用 CSS Grid 和 Flexbox 水平对齐位于不同网格单元格中的元素【英文标题】:Aligning elements horizontally adjacent that are in different grid cells with CSS Grid and Flexbox 【发布时间】:2019-02-09 00:00:12 【问题描述】:

目前我正在使用网格和弹性框之间的混合来尝试实现表单的布局。

我希望两个 input 元素水平排列而不设置高度。如果我要在文本输入上申请填充,则范围应继续垂直居中,并与相邻的输入相邻。

此外,我还希望 label 元素也保持水平对齐。

请提出需要更改标记或使用 javascript 的解决方案。

目前我拥有的:

我想要达到的目标:

我知道我可以在范围上应用一个固定的高度或填充来对齐它,但我正在努力使它尽可能流畅。

HTML:

<form class="grid">
  <div class="group">
    <label for="input-1">Label 1</label>
    <input type="text" id="input-1" placeholder="placeholder" />
  </div>

  <div class="group">
    <label for="input-2">Label 2</label>
    <div class=range-wrapper>
      <input type="range" id="input-2" placeholder="placeholder" />
      <output>0</output>
    </div>
  </div>
</form>

SCSS:

html 
  box-sizing: border-box;

*, *::before, *::after 
  box-sizing: inherit;


body 
  height: 100vh;
  display: flex;
  justify-content: center;
  align-items: center;
  font-size: 1.2rem;


.grid 
  width: 80%;
  max-width: 960px;
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  grid-gap: 40px 10px;

  padding: 50px;
  background: #ccc;


.group 
  display: flex;
  flex-direction: column;
  margin-top: auto;

  label 
    margin-bottom: 10px;
  


input 
  font-size: inherit;

  &[type="text"] 
    padding: 14px;
  
  &[type="range"] 
    width: 100%;
  


.range-wrapper 
  display: flex;
  align-items: center;

  output 
  padding: 10px;

您也可以查看codepen here。

非常感谢!


** 编辑 **

应该支持多行标签,如果标签包含多行,元素仍然应该水平对齐。

多行标签示例:Codepen

【问题讨论】:

没有允许对齐不共享父元素的元素的 CSS 属性或布局方法。 你可以做的是强制组 div 中的最后一个项目一直到行的底部......像这样 - codepen.io/Paulie-D/pen/GXmVWv 这与将margin-bottom: auto 添加到label 元素中的效果相同。另外,如果我想将更多 input 组放入网格中,它将无法正常工作。此外,这实际上并没有解决相邻 inputrange 之间的对齐问题。 正如我所说....有 NO CSS 方法。 【参考方案1】:

为您的“小组”课程试试这个。 (或使用此样式为该元素使用新类)

.group 
  display: flex;
  flex-direction: column;
  justify-content: center;

  label 
    margin-bottom: 10px;
  

【讨论】:

我最初尝试过这个,但现在的问题是label 元素不相互排列... 如何将flex: 1 添加到range-wrapper 类并从Label 2 中删除margin-bottom 如果是多行标签会怎样,例如:codepen.io/anon/pen/zJwXYQ 我认为给输入和range-wrapper一个特定的高度会更容易,并将justify-content: center添加到group类。这是代码笔:link 您是否忘记分叉您的更改?由于多种原因,我真的反对固定高度定位。例如,如果我决定更改根字体大小,这可能会导致布局中断。

以上是关于使用 CSS Grid 和 Flexbox 水平对齐位于不同网格单元格中的元素的主要内容,如果未能解决你的问题,请参考以下文章

html 使用CSS Grid和Flexbox的LastPass Vault布局

简单横幅广告-是否有更好的桌面和移动版面布局方式? (Flexbox / CSS Grid)

Flexbox 中的 CSS Grid 仅在 Chrome 上无法正常工作

仅使用 flexbox CSS 的水平砌体布局[重复]

用于 Django 中动态内容的 CSS Grid/Flexbox

CSS Grid 在 flexbox 内时不会增长