Wanted:仅 CSS 的解决方案,可在每行基础上启用多个等高网格“部分”,并且也是响应式的。
注意:这是一个后续问题这个问题 https://stackoverflow.com/questions/44115503/css-only-solution-to-set-same-height-row-sections-on-a-responsive-grid每个项目只有一个“等高”部分 - 这可以通过 flexbox 实现
The below diagram should help explain the requirement:
“项目网格”应该是响应式的 - 因为它可以根据视口宽度每行显示不同数量的卡片(桌面上 4 个,移动设备上 2 个)。在给定行中,等效的“内容”和“功能”部分应具有相同的高度。
在下面的 HTML 和 CSS 中 - 项目卡被分成我们需要的行(在桌面和移动设备的两个示例断点处),但内容部分的高度是可变的:
.items {
max-width: 1200px;
}
.item {
width: 25%;
box-sizing: border-box;
display: inline-block;
vertical-align: top;
padding: 0 12px;
margin: 24px -4px 24px 0;
}
@media (max-width: 600px) {
.item {
width: 50%;
}
}
.item__heading {
background-color: #d4d0f5;
padding: 10px;
text-align: center;
border: 1px solid #bbbbbb;
}
.item__content {
padding: 10px;
border-left: 1px solid #bbbbbb;
border-right: 1px solid #bbbbbb;
}
.item__features {
padding: 10px;
border-top: 1px solid #bbbbbb;
border-left: 1px solid #bbbbbb;
border-right: 1px solid #bbbbbb;
background-color: #f7cbb1;
}
.item__features ul {
margin: 0px;
}
.item__price {
background-color: #e0f6d9;
padding: 10px;
text-align: center;
border: 1px solid #bbbbbb;
}
<div class="items">
<div class="item">
<div class="item__heading">
Item 1
</div>
<div class="item__content">
Some content that is not that long
</div>
<div class="item__features">
<ul>
<li>feature 1</li>
</ul>
</div>
<div class="item__price">
£99.99
</div>
</div>
<div class="item">
<div class="item__heading">
Item 2
</div>
<div class="item__content">
Some content that is longer than other items on the same row and sets the height of this section as it spans many more lines than the rest of the other content sections on this row
</div>
<div class="item__features">
<ul>
<li>feature 1</li>
</ul>
</div>
<div class="item__price">
£69.99
</div>
</div>
<div class="item">
<div class="item__heading">
Item 3
</div>
<div class="item__content">
Some content that is not that long
</div>
<div class="item__features">
<ul>
<li>feature 1</li> <li>feature 2</li>
<li>feature 3</li>
</ul>
</div>
<div class="item__price">
£69.99
</div>
</div>
<div class="item">
<div class="item__heading">
Item 4
</div>
<div class="item__content">
Some content that is not that long
</div>
<div class="item__features">
<ul>
<li>feature 1</li>
</ul>
</div>
<div class="item__price">
£109.99
</div>
</div>
<div class="item">
<div class="item__heading">
Item 5
</div>
<div class="item__content">
Some content that is a medium kind of length blah blah
</div>
<div class="item__features">
<ul>
<li>feature 1</li>
</ul>
</div>
<div class="item__price">
£29.99
</div>
</div>
<div class="item">
<div class="item__heading">
Item 6
</div>
<div class="item__content">
Some content that is not that long
</div>
<div class="item__features">
<ul>
<li>feature 1</li>
<li>feature 2</li>
</ul>
</div>
<div class="item__price">
£99.99
</div>
</div>
</div>
我创建了以下 codepen 作为基于 JavaScript 的解决方案,可以实现预期的结果 - 但如果可能的话,我希望仅用 CSS 解决方案替换它:http://codepen.io/rusta/pen/xdmdxm http://codepen.io/rusta/pen/xdmdxm
局限性
- 网格列表中显示的项目数可以是 1-n 中的任意数字
- 要显示的“内容”和“功能”部分的大小确实是可变的(因此选择“合理的”最小高度不是一个选项)
基于 Flexbox 的解决方案似乎无法应对以下事实:项目有多个需要对齐的部分
我希望新的 CSS 网格系统能够帮助实现上述目标,但我已经对此进行了多次尝试,但没有成功,所以我将其开放给社区,看看我是否遗漏了一些东西
进一步说明:我说的是纯 CSS 解决方案,我指的是非 JS 解决方案。如果 HTML 块需要更改(顺序/嵌套/类名称)以支持非 JS 解决方案,这是一个可行的选择
根据你自己的答案,你将它们按 4 分组,你也可以使用 CSS Flexbox 来做到这一点。
为了让它们在少于 4 个时表现出来,可以使用nth-child
选择器,但使用更简单last*
类,所以我选择了后者。
人们甚至可以在没有.group_of_4
包装,有一些巧妙的nth-child
规则,但同样,选择更简单的规则,因为它没有任何明显的限制
小提琴演示 https://jsfiddle.net/83nz0jeh/2/
.items {
display: flex;
flex-direction: column;
max-width: 1200px;
}
.items .group_of_4 {
display: flex;
flex-wrap: wrap;
justify-content: space-between; /* updated */
}
.items .group_of_4 ~ .group_of_4 {
margin-top: 24px;
}
.items .group_of_4 > div {
width: calc(25% - 12px); /* updated */
box-sizing: border-box;
padding: 12px;
}
.item__heading {
background-color: #d4d0f5;
padding: 10px;
text-align: center;
border: 1px solid #bbbbbb;
order: 1;
}
.item__content {
padding: 10px;
border-left: 1px solid #bbbbbb;
border-right: 1px solid #bbbbbb;
order: 2;
}
.item__features {
padding: 10px;
border-left: 1px solid #bbbbbb;
border-right: 1px solid #bbbbbb;
background-color: #f7cbb1;
order: 3;
}
.item__price {
background-color: #e0f6d9;
padding: 10px;
text-align: center;
border: 1px solid #bbbbbb;
order: 4;
}
/* one item in a group */
.items .group_of_4 .last1 {
margin-right: calc(75% 6px); /* updated */
}
/* two items in a group */
.items .group_of_4 .last2 {
margin-right: calc(50% + 6px); /* updated */
}
/* three items in a group */
.items .group_of_4 .last3 {
margin-right: calc(25% + 6px); /* updated */
}
@media (max-width: 600px) {
.items .group_of_4 > div:nth-child(8) ~ .item__heading {
margin-top: 24px;
order: 5;
}
.items .group_of_4 > div:nth-child(8) ~ .item__content {
order: 6;
}
.items .group_of_4 > div:nth-child(8) ~ .item__features {
order: 7;
}
.items .group_of_4 > div:nth-child(8) ~ .item__price {
order: 8;
}
.items .group_of_4 > div {
width: calc(50% - 12px); /* updated */
}
/* one item in a group */
/* three items in a group */
.items .group_of_4 .last1,
.items .group_of_4 .last3 {
margin-right: 50%;
}
/* two items in a group */
.items .group_of_4 .last2 {
margin-right: 0%;
}
}
<div class="items">
<div class="group_of_4">
<div class="item__heading">
Item 1
</div>
<div class="item__content">
Some content that is not that long
</div>
<div class="item__features">
<ul>
<li>feature 1</li>
</ul>
</div>
<div class="item__price">
£99.99
</div>
<div class="item__heading">
Item 2
</div>
<div class="item__content">
Some content that is longer than other items on the same row and sets the height of this section as it spans many more lines than the rest of the other content sections on this row
</div>
<div class="item__features">
<ul>
<li>feature 1</li>
</ul>
</div>
<div class="item__price">
£69.99
</div>
<div class="item__heading">
Item 3
</div>
<div class="item__content">
Some content that is not that long
</div>
<div class="item__features">
<ul>
<li>feature 1</li>
<li>feature 2</li>
<li>feature 3</li>
</ul>
</div>
<div class="item__price">
£69.99
</div>
<div class="item__heading">
Item 4
</div>
<div class="item__content">
Some content that is not that long
</div>
<div class="item__features">
<ul>
<li>feature 1</li>
</ul>
</div>
<div class="item__price">
£109.99
</div>
</div>
<div class="group_of_4">
<div class="item__heading">
Item 5
</div>
<div class="item__content">
Some content that is a medium kind of length blah blah
</div>
<div class="item__features">
<ul>
<li>feature 1</li>
</ul>
</div>
<div class="item__price">
£29.99
</div>
<div class="item__heading last2">
Item 6
</div>
<div class="item__content last2">
Some content that is not that long
</div>
<div class="item__features last2">
<ul>
<li>feature 1</li>
</ul>
</div>
<div class="item__price last2">
£99.99
</div>
</div>
</div>
这是一个基于脚本的解决方案,适合任何需要的人。
它缺少的是一个调整大小事件处理程序,它会重新计算每行的最大高度。
(function(d) {
window.addEventListener("load", function() {
var item = d.querySelector('.items');
var items = item.querySelectorAll('.item__features');
var heights = [], i = 0, css;
for (i = 0; i < items.length; i++) {
heights.push(parseFloat(window.getComputedStyle(items[i], null).getPropertyValue("height")));
}
css = ".item__features { height: " + Math.max.apply(null, heights) + "px; }" ;
var st = d.createElement('style');
st.type = 'text/css';
if (st.styleSheet) {
st.styleSheet.cssText = css
} else {
st.appendChild(d.createTextNode(css));
}
(d.head || d.getElementsByTagName('head')[0]).appendChild(st);
}, false);
}(document));
.items {
display: flex;
flex-wrap: wrap;
max-width: 1200px;
}
.item {
display: flex;
flex-direction: column;
width: 25%;
box-sizing: border-box;
padding: 0 12px;
margin: 24px -4px 24px 0;
}
@media (max-width: 600px) {
.item {
width: 50%;
}
}
.item__heading {
background-color: #d4d0f5;
padding: 10px;
text-align: center;
border: 1px solid #bbbbbb;
}
.item__content {
flex: 1 1 auto;
padding: 10px;
border-left: 1px solid #bbbbbb;
border-right: 1px solid #bbbbbb;
}
.item__features {
padding: 10px;
border-top: 1px solid #bbbbbb;
border-left: 1px solid #bbbbbb;
border-right: 1px solid #bbbbbb;
background-color: #f7cbb1;
}
.item__features ul {
margin: 0px;
}
.item__price {
background-color: #e0f6d9;
padding: 10px;
text-align: center;
border: 1px solid #bbbbbb;
}
<div class="items">
<div class="item">
<div class="item__heading">
Item 1
</div>
<div class="item__content">
Some content that is not that long
</div>
<div class="item__features">
<ul>
<li>feature 1</li>
</ul>
</div>
<div class="item__price">
£99.99
</div>
</div>
<div class="item">
<div class="item__heading">
Item 2
</div>
<div class="item__content">
Some content that is longer than other items on the same row and sets the height of this section as it spans many more lines than the rest of the other content sections on this row
</div>
<div class="item__features">
<ul>
<li>feature 1</li>
</ul>
</div>
<div class="item__price">
£69.99
</div>
</div>
<div class="item">
<div class="item__heading">
Item 3
</div>
<div class="item__content">
Some content that is not that long
</div>
<div class="item__features">
<ul>
<li>feature 1</li>
<li>feature 2</li>
<li>feature 3</li>
</ul>
</div>
<div class="item__price">
£69.99
</div>
</div>
<div class="item">
<div class="item__heading">
Item 4
</div>
<div class="item__content">
Some content that is not that long
</div>
<div class="item__features">
<ul>
<li>feature 1</li>
</ul>
</div>
<div class="item__price">
£109.99
</div>
</div>
<div class="item">
<div class="item__heading">
Item 5
</div>
<div class="item__content">
Some content that is a medium kind of length blah blah
</div>
<div class="item__features">
<ul>
<li>feature 1</li>
</ul>
</div>
<div class="item__price">
£29.99
</div>
</div>
<div class="item">
<div class="item__heading">
Item 6
</div>
<div class="item__content">
Some content that is not that long
</div>
<div class="item__features">
<ul>
<li>feature 1</li>
<li>feature 2</li>
</ul>
</div>
<div class="item__price">
£99.99
</div>
</div>
</div>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)