我创建了一个容器(红色边框,其中心线表示中心),如果发生溢出,该容器将水平滚动。
此容器的第一个子项(紫色块)始终是一个按钮。
当您单击此按钮时,它将向容器中添加其他子项。
我想做的是找出一种使用纯CSS的方法,以便在加载应用程序时第一个孩子始终居中,而容器中的最后一个孩子元素(如果有多个孩子)可以也可以滚动到容器的正中央。
我很难弄清楚这一点,因为除了对子元素进行了响应的min-width
(即100px
)之外,我还应用了width
(即25vw
)
我最初计划实现此目标的方法是将padding-left
应用于父容器,然后将::after
伪元素应用于:not(.first-child).children:last-child
,但后来我意识到这种方法是如果我希望它能够完全响应,这还不够。但是,我知道我可以手动计算将触发min-width
的宽度,然后使用@media
查询,但是我希望有更好的方法。
#container {
width: 100%;
height: 100%;
padding-left: ; /* Half the window width minus half the width of the child. */
overflow-x: scroll;
display: flex;
align-items: center;
background: skyblue;
box-sizing: border-box;
border: solid red 2px;
}
#container::-webkit-scrollbar {
display: none;
}
.children {
width: 25vw;
min-width: 100px;
height: 50%;
min-height: 200px;
position: relative;
margin-right: 5%;
display: flex;
justify-content: center;
align-items: center;
background: purple;
}
:not(.first-child).children:last-child::after {
content: '';
width: ; /* Half the window width minus half the width of the child. */
height: 100%;
position: relative; /* relative or absolute */
left: ; /* and offset appropriately. */
transform: ; /* */
}
有人对此有任何想法吗?
答案 0 :(得分:2)
您可以将margin-left
应用于第一个孩子,并且可以使用媒体查询来处理最小宽度。当屏幕小于400px
时,25vw
小于100px
,并且您更改值以考虑100px
。
#container {
position: fixed;
top:0;
left:0;
width: 100%;
height: 100%;
overflow-x: scroll;
display: flex;
align-items: center;
background:
linear-gradient(red,red) center/1px 100% no-repeat,
skyblue;
box-sizing: border-box;
border: solid red 2px;
}
#container::-webkit-scrollbar {
display: none;
}
.children {
width: 25vw;
min-width: 100px;
height: 40%;
min-height: 100px;
position: relative;
margin-right: 5px;
display: flex;
justify-content: center;
align-items: center;
background: purple;
flex-shrink:0; /* don't forget this to avoid the shrink */
}
.children:first-child {
margin-left: calc(50% - 12.5vw);
}
@media (max-width:400px) {
.children:first-child {
width: 25vw;
min-width: 100px;
margin-left: calc(50% - 50px);
}
}
<div id="container">
<div class="children"></div>
<div class="children"></div>
<div class="children"></div>
<div class="children"></div>
</div>
没有媒体查询,您可以考虑一个伪元素,其中将受到max-width
约束:
#container {
position: fixed;
top:0;
left:0;
width: 100%;
height: 100%;
overflow-x: scroll;
display: flex;
align-items: center;
background:
linear-gradient(red,red) center/1px 100% no-repeat,
skyblue;
box-sizing: border-box;
border: solid red 2px;
}
#container::-webkit-scrollbar {
display: none;
}
.children {
width: 25vw;
min-width: 100px;
height: 40%;
min-height: 100px;
position: relative;
margin-right: 5px;
display: flex;
justify-content: center;
align-items: center;
background: purple;
flex-shrink:0;
}
#container:before {
content:"";
width: calc(50% - 12.5vw);
max-width:calc(50% - 50px);
flex-shrink:0;
}
<div id="container">
<div class="children"></div>
<div class="children"></div>
<div class="children"></div>
<div class="children"></div>
</div>
答案 1 :(得分:0)
即使我将calc
用作孩子的vh
,我仍然可以使用width
创建严格响应的解决方案。 CSS是救星。
#container {
--offset: calc(50vw - ((100vh / 100) * 20);
padding-left: var(--offset);
background: skyblue;
}
.children {
min-width: 40vh; /* vh is used for width to account for the height of window. */
min-height: 60vh;
position: relative;
background: purple;
}
:not(.first-child).children:last-child::after {
content: '';
width: var(--offset);
height: 1px;
position: absolute;
left: 100%;
}