作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我尝试使用 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/
我是一名优秀的程序员,十分优秀!