如何使用 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
布局您的left
和right
部分(删除right
和left
中的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 框创建滑块布局?的主要内容,如果未能解决你的问题,请参考以下文章
CSS3--Flex弹性盒子布局: 实例篇-输入框的布局 & 悬挂式布局