如何使用 css flex 框创建滑块布局?

Posted

技术标签:

【中文标题】如何使用 css flex 框创建滑块布局?【英文标题】:How can I create slider layout with css flex boxes? 【发布时间】:2019-07-18 20:30:14 【问题描述】:

我正在尝试使用弹性框创建滑块布局,例如这张照片:

在这里,我在右侧有大照片,在左侧有缩略图项目。我想将左侧和缩略图包装与大照片高度对齐。但不幸的是,仅使用 flex box 是不可能的,我应该使用 javascript 检查大照片的高度并将左侧对齐。

例如检查此代码:

main
    position: absolute;
    top: 0px;
    left: 0px;
    right: 0px;
    bottom: 0px;
    display: flex;
    align-items: center;
    justify-content: center;


.wrapper
    width: 500px;
    overflow: hidden;
    background: gray;
    display: flex;
    align-items: flex-start;
    justify-content: center;


.right
    width: calc(100% - 150px);
    height: 450px;
    background: red;


.left
    width: 150px;
    display: flex;
    align-items: center;
    justify-content: space-between;
    flex-direction: column;


.item
    width: 100%;
    height: 50px;
    color: white;
    background: green;
    display: flex;
    align-items: center;
    justify-content: center;
<main>

  <div class="wrapper">
      <div class="left">
          <div class="item">
              <strong>Item</strong>
          </div>
          <div class="item">
              <strong>Item</strong>
          </div>
          <div class="item">
              <strong>Item</strong>
          </div>
          <div class="item">
              <strong>Item</strong>
          </div>
          <div class="item">
              <strong>Item</strong>
          </div>
      </div>
      <div class="right"></div>
  </div>

</main>

在示例代码中,我没有图像,我在 CSS 中使用 450px 高度处理了这个问题。

那么我怎样才能将左侧与 JS 对齐并且仅与 CSS 对齐?我想使用space-between 模式来显示这个高度的所有项目。考虑一下,height:100% 不适用于此问题。

【问题讨论】:

您希望缩略图填满左栏吗? (由于防火墙限制,我看不到图像)如果是这样,只需从包装器中删除 align-items: flex-start; 真的吗?你不能打开 picofile.com 吗?我是伊朗人,我只能在这个提供商上上传照片。 flex-start 不起作用。因为当我想从上到左显示图像时很舒服。但我想将所有文件安排在左侧高度 @Pete 新演示链接:cdn1.imggmi.com/uploads/2019/2/25/… 是的,很遗憾,工作防火墙阻止了所有文件共享站点,第二个链接看起来就像我以为你的意思 - 你试过从包装器中删除 flex start 吗? 我已经添加了图片内联。 @Pete 希望您现在可以在帖子中看到它。 【参考方案1】:

此解决方案使用CSS Grid layouts - 在您的wrapper 上使用display: grid,使用grid-template-columns: 150px 1fr 布局您的leftright 部分(删除rightleft 中的width 定义元素。)。

现在将height: 100% 添加到left,然后为 flexbox 项目 的项目flex: 1 占据来自right 部分的动态高度 - 参见下面的演示:

main 
  position: absolute;
  top: 0px;
  left: 0px;
  right: 0px;
  bottom: 0px;
  display: flex;
  align-items: center;
  justify-content: center;


.wrapper 
  width: 500px;
  overflow: hidden;
  background: gray;
  display: grid; /* make this a grid container */
  grid-template-columns: 150px 1fr; /* 150px for left and rest for right*/
  align-items: flex-start;
  justify-content: center;


.right 
  /* width: calc(100% - 150px);*/
  height: 450px;
  background: red;


.left 
  /*width: 150px;*/
  display: flex;
  align-items: center;
  justify-content: space-between;
  flex-direction: column;
  height: 100%; /* ADDED */


.item 
  width: 100%;
  height: 50px;
  color: white;
  background: green;
  display: flex;
  align-items: center;
  justify-content: center;
  flex: 1; /* ADDED */
<main>
  <div class="wrapper">
    <div class="left">
      <div class="item">
        <strong>Item</strong>
      </div>
      <div class="item">
        <strong>Item</strong>
      </div>
      <div class="item">
        <strong>Item</strong>
      </div>
      <div class="item">
        <strong>Item</strong>
      </div>
      <div class="item">
        <strong>Item</strong>
      </div>
    </div>
    <div class="right"></div>
  </div>

</main>

【讨论】:

谢谢,但我仍然不熟悉 css 网格布局。显然只有 css flex-boxes 是不可能的,我应该使用 JS 来管理左侧高度【参考方案2】:

根据我的评论,为了让您的左列延伸到右列的高度,您需要做的就是从包装器中删除对齐项:

main
    position: absolute;
    top: 0px;
    left: 0px;
    right: 0px;
    bottom: 0px;
    display: flex;
    align-items: center;
    justify-content: center;


.wrapper
    width: 500px;
    overflow: hidden;
    background: gray;
    display: flex;
    /* align-items: flex-start; -- remove this */ 
    justify-content: center;


.right
    /* width: calc(100% - 150px);  I would swap this for flex grow, then you don't need hard values */
    flex-grow: 1;
    height: 450px;
    background: red;


.left
    width: 150px;
    display: flex;
    align-items: center;
    justify-content: space-between;
    flex-direction: column;


.item
    width: 100%;
    height: 50px;
    color: white;
    background: green;
    display: flex;
    align-items: center;
    justify-content: center;
<main>

  <div class="wrapper">
      <div class="left">
          <div class="item">
              <strong>Item</strong>
          </div>
          <div class="item">
              <strong>Item</strong>
          </div>
          <div class="item">
              <strong>Item</strong>
          </div>
          <div class="item">
              <strong>Item</strong>
          </div>
          <div class="item">
              <strong>Item</strong>
          </div>
      </div>
      <div class="right"></div>
  </div>

</main>

【讨论】:

【参考方案3】:

如果您将容器的高度设置为您希望所有滑块的高度,则可以使用 flexbox 完成类似的操作:

.container 
  display: flex;
  flex-flow: column wrap;
  height: 250px;
  width: 250px;


.container > * 
  display: flex;
  flex-flow: row wrap;
  flex: 1 100%;


.thumbs 
  flex-direction: row;
  margin-right: 5px;


.thumb 
  background: red;
  flex: 1 100%;
  margin: 5px 0;


.large 
  background: blue;
  margin: 5px;
<div class="container">
  <div class="thumbs">
    <div class="thumb"></div>
    <div class="thumb"></div>
    <div class="thumb"></div>
    <div class="thumb"></div>
    <div class="thumb"></div>
  </div>
  <div class="large"></div>
</div>

【讨论】:

以上是关于如何使用 css flex 框创建滑块布局?的主要内容,如果未能解决你的问题,请参考以下文章

iPad 上的 CSS 灵活框布局

CSS3--Flex弹性盒子布局: 实例篇-输入框的布局 & 悬挂式布局

如何设置孩子相对于其弹性成长的父母的身高?

如何将flex子元素堆叠在一起

根据 W3C CR(显示:flex 等),当前的 CSS 灵活框布局模块是不是有任何 polyfill? [关闭]

Flex 4:具有滑块和文本框组合