gpt4 book ai didi

javascript - 如何在 flexbox 行之间插入一个 div 并保持一切响应?

转载 作者:行者123 更新时间:2023-11-29 16:46:22 26 4
gpt4 key购买 nike

我尝试使用 flexbox,尽管 flexbox 可以保持其响应性,但我很快发现无法在换行时有选择地在行之间放置一个 div。

尝试通过 inline-block 而不是使用 flexbox 来完成它,如果我忽略保持页面响应,它工作正常。但这就是问题的症结所在;我需要它保持响应。

无论行中有多少元素,它都应该在所选(单击)图片所在行的下方显示 bio 行。如果在不同的行中选择了图片,则原始 bio 行将关闭,并在新选择的图片行下方的行中重新打开。

这是我为 flexbox 管理的最接近的:

    .container {
max-width: 1220px;
border: 5px solid black;
display: flex;
margin: 0 auto;
flex-direction: row;
flex-wrap: wrap;
align-items: center;
justify-content: center;
}

.item {
border-width: 1px;
border-style: solid;
border-color: black;
width: 200px;
height: 300px;
}

.one {
background: #B5AC01;
}
.two {
background: #ECBA09;
}
.three {
background: #E86E1C;
}
.four {
background: #D41E45;
}
.five {
background: #D41EFF;
}
.six {
background: #D4FF45;
}

body {
margin: 0px;
padding: 0px;
}
<div class="container">
<div class="item one"></div>
<div class="item two"></div>
<div class="item three"></div>
<div class="item four"></div>
<div class="item five"></div>
<div class="item six"></div>
<div class="item four"></div>
<div class="item five"></div>
<div class="item six"></div>
<div class="item one"></div>
<div class="item two"></div>
<div class="item three"></div>
</div>

这没有成功,因为能够找到一行并在这些行之间插入一个 div 显然是一个艰难的过程。所以我换了个思路,尝试了 inline-block,结果发现虽然没那么复杂,但还是很复杂。

.container {
max-width: 1220px;
border: 5px solid black;
margin: 0 auto;
font-size: 0;
}

.item {
display: inline-block;
width: 200px;
height: 300px;
margin: 0px;
padding: 0px;
border: 1px solid black;
font-size: 14pt;
color: white;
text-align: center;
line-height: 300px;
}

.bio {
height: 500px;
width: 100%;
background: #333;
color: white;
font-size: 24pt;
text-align: center;
line-height: 500px;
}

.selected {
box-shadow: inset 0 0 10px #000000;
font-weight: 800;
}

.row {
display: inline-block;
font-size: 0;
}

.subrow {
display: inline-block;
font-size: 0;
}

.one {
background: #B5AC01;
}

.two {
background: #ECBA09;
}

.three {
background: #E86E1C;
}

.four {
background: #D41E45;
}

.five {
background: #D41EFF;
}

.six {
background: #D4FF45;
}

body {
margin: 0px;
padding: 0px;
}
<div class="container">
<div class="row">
<div class="subrow">
<div class="item one">Pic</div>
<div class="item two">Pic</div>
<div class="item three selected">Clicked Pic</div>
</div>
<div class="subrow">
<div class="item four">Pic</div>
<div class="item five">Pic</div>
<div class="item six">Pic</div>
</div>
</div>
<div class="bio">
Bio goes here with pic
</div>
<div class="row">
<div class="subrow">
<div class="item four">Pic</div>
<div class="item five">Pic</div>
<div class="item six">Pic</div>
</div>
<div class="subrow">
<div class="item one">Pic</div>
<div class="item two">Pic</div>
<div class="item three">Pic</div>
</div>
</div>
</div>

运气不太好。会喜欢仅 CSS/HTML 的解决方案,但如果有必要,我对 Javascript/jQuery 持开放态度。想法?在此先感谢您的时间。

编辑:有人在下面发布了一个解决方案,建议使用 offsetTop 跟踪包装以确定插入 bio 行的位置。虽然它不是一个只有 CSS/HTML 的解决方案,但它不是一个糟糕的解决方案。明天早上我睡得更多时,我会再试验一下 JS 代码。

最佳答案

$(function(){

$('.item').click(function() {
var $this = $(this);

$('.selected').removeClass('selected');
$this.addClass('selected');

moveBio();
});

function moveBio() {

var $bio = $(".bio");
var itemsPerRow = 0;

$bio.hide(); // hide so doesn't affect calculations

var firstItem = $('.item').eq(0);
var itemTop = firstItem.position().top;

$('.item').each(function(i) { // loop till we hit next row
if($(this).position().top != itemTop) {
itemsPerRow = i;
return false;
}
});

selectedIndex = $(".item").index($('.selected')[0]);
selectedRowNum = Math.floor(selectedIndex / itemsPerRow) + 1;

$(".bio").insertAfter($(".item").eq((selectedRowNum * itemsPerRow) - 1)).show();
}

$(window).resize(function() {
$(".bio").hide(); // hide Bio so it doesn't interfere with the flex layout during resize
clearTimeout(window.resizedFinished);

window.resizedFinished = setTimeout(function(){
moveBio(); // show Bio again now that resize has stabilised
}, 250);
});

});
.container {
max-width: 1220px;
border: 5px solid black;
display: flex;
margin: 0 auto;
flex-direction: row;
flex-wrap: wrap;
align-items: center;
justify-content: center;
position: relative;
}

.item {
border-width: 1px;
border-style: solid;
border-color: black;
width: 200px;
height: 300px;
}

.bio {
height: 500px;
width: 100%;
background: #333;
color: white;
font-size: 24pt;
text-align: center;
line-height: 500px;
}
.one {
background: #B5AC01;
}
.two {
background: #ECBA09;
}
.three {
background: #E86E1C;
}
.four {
background: #D41E45;
}
.five {
background: #D41EFF;
}
.six {
background: #D4FF45;
}
.selected {
box-shadow: inset 0 0 10px #000000;
font-weight: 800;
}
body {
margin: 0px;
padding: 0px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<div class="container">
<div class="item one"></div>
<div class="item two"></div>
<div class="item three"></div>
<div class="item four"></div>
<div class="item five"></div>
<div class="item six selected"></div>
<div class="bio">
Bio goes here with pic
</div>
<div class="item one"></div>
<div class="item two"></div>
<div class="item three"></div>
<div class="item four"></div>
<div class="item five"></div>
<div class="item six"></div>
</div>

添加了动态浏览器调整大小

这是一个更容易调整大小的示例:http://jsbin.com/wamisiliza/edit?output

关于javascript - 如何在 flexbox 行之间插入一个 div 并保持一切响应?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40879381/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com