4 幅图像的响应式网格
Responsive Grid of 4 images
我正在尝试复制 eBay 的 'Today' 特色卖家布局,将 4 个正方形图像组成一个盒子(见图),但使用 Bootstrap。我真的很难理解如何实现这一目标。我可以获得或多或少均匀的正方形,并且在 lg、md 和 sm 规则上看起来还不错,因为当然不需要按比例放置东西,我可以让每个正方形具有固定的宽度和高度。但是,当涉及到移动设备时,这会超出 window,因为它需要根据 window 大小进行调整。
我目前想出的 html 基本上是一个网格,分为 9 和 3,(col-xs-9 和 col-xs-3),给定高度在每个 desktop/tablet 宽度处。
图像有时是方形图像,有时是横向或纵向格式的图像,在这种情况下,它们将保持纵横比并扩展到最大尺寸,但在包含 div.
有没有一种方法可以使用 Bootstrap 实现此目的,或者我是否需要使用 javascript 来寻找替代方案?
下面的代码,以备不时之需:
HTML
<div id="featured-merchant-container">
<div class="featured-merchant-listings">
<div class="row">
<div class="primary-img-container col-xs-9 col-sm-9 col-md-9 col-lg-9 no-padding-right">
<div class="big-hero-image">
<a ng-if="merchant.userListings[0].primaryImage" ng-href="/#!/users/{{merchant._id}}">
<span class="thumb">
<img ng-src="{{merchant.userListings[0].primaryImage}}" />
</span>
</a>
<a ng-if="!merchant.userListings[0].primaryImage" ng-href="/#!/users/{{merchant._id}}">
<span class="thumb">
<img ng-src="img/placeholder.png" />
</span>
</a>
</div>
</div>
<div class="secondary-img-container col-xs-3 col-sm-3 col-md-3 col-lg-3 no-padding-left">
<div class="big-hero-images">
<div class="first">
<a ng-if="merchant.userListings[1].primaryImage" ng-href="/#!/users/{{merchant._id}}">
<span class="thumb">
<img ng-src="{{merchant.userListings[1].primaryImage}}" />
</span>
</a>
<a ng-if="!merchant.userListings[1].primaryImage" ng-href="/#!/users/{{merchant._id}}">
<span class="thumb">
<img ng-src="img/placeholder.png" />
</span>
</a>
</div>
<div class="second">
<a ng-if="merchant.userListings[2].primaryImage" ng-href="/#!/users/{{merchant._id}}">
<span class="thumb">
<img ng-src="{{merchant.userListings[2].primaryImage}}" />
</span>
</a>
<a ng-if="!merchant.userListings[2].primaryImage" ng-href="/#!/users/{{merchant._id}}">
<span class="thumb">
<img ng-src="img/placeholder.png" />
</span>
</a>
</div>
<div class="last">
<a ng-if="merchant.userListings[3].primaryImage" ng-href="/#!/users/{{merchant._id}}">
<span class="thumb">
<img ng-src="{{merchant.userListings[3].primaryImage}}" />
</span>
</a>
<a ng-if="!merchant.userListings[3].primaryImage" ng-href="/#!/users/{{merchant._id}}">
<span class="thumb">
<img ng-src="img/placeholder.png" />
</span>
</a>
</div>
</div>
</div>
</div>
</div>
</div>
CSS:
#featured-merchant-container {
border: 1px solid green-grey;
.big-hero-image {
text-align:center;
.thumb {
display:block;
border-right:1px solid green-grey;
height:413px;
display:table-cell;
vertical-align:middle;
text-align:center;
img {
width:100%;
height:413px;
}
}
}
.big-hero-images {
text-align:center;
// border-left:1px solid green-grey;
.thumb {
display:block;
height:137px;
display:table-cell;
vertical-align:middle;
text-align:center;
img {
width:100%;
height:137px;
}
}
.first, .second {
border-bottom:1px solid green-grey;
}
}
}
请帮助我。这让我发疯:(。谢谢!
你能用 flex-box
布局做点什么吗?
.cols {overflow: hidden;}
.cols .col {float: left; width: 25%;}
.cols .col:first-child {width: 75%;}
.cols .col img {width: 100%;}
.flex-container {
display: -ms-flexbox;
display: -webkit-flex;
display: flex;
-webkit-flex-direction: column;
-ms-flex-direction: column;
flex-direction: column;
-webkit-flex-wrap: nowrap;
-ms-flex-wrap: nowrap;
flex-wrap: nowrap;
-webkit-justify-content: flex-start;
-ms-flex-pack: start;
justify-content: flex-start;
-webkit-align-content: stretch;
-ms-flex-line-pack: stretch;
align-content: stretch;
-webkit-align-items: flex-start;
-ms-flex-align: start;
align-items: flex-start;
}
.flex-item {
-webkit-order: 0;
-ms-flex-order: 0;
order: 0;
-webkit-flex: 1 0 auto;
-ms-flex: 1 0 auto;
flex: 1 0 auto;
-webkit-align-self: auto;
-ms-flex-item-align: auto;
align-self: auto;
}
<div class="cols">
<div class="col">
<img src="http://placehold.it/350x350" alt="" />
</div>
<div class="col">
<div class="flex-container">
<div class="flex-item"><img src="http://placehold.it/350x350" alt="" /></div>
<div class="flex-item"><img src="http://placehold.it/350x350" alt="" /></div>
<div class="flex-item"><img src="http://placehold.it/350x350" alt="" /></div>
</div>
</div>
</div>
如果您的图像将具有各种尺寸,那么您需要使用将背景大小设置为覆盖的背景图像。
.flex-item
background-size cover
background-image url(http://placehold.it/350x350)
或者您需要使用 object-fit,它很棒,但在 IE 中的支持很糟糕。
.flex-item img
object-fit cover
谢谢大家的回答。
我设法实现这一点的方法是完全取消对网格的 Bootstrap 使用。相反,我围绕百分比构建了网格。我在网上读到一些内容,其中谈到如何提供一个百分比作为 padding-top 的值基本上可以为您提供一个具有特定纵横比的容器。例如,如果您想要 div 保持纵横比 4:3,您要做的是添加
padding-top:75%;
此 div 的样式 sheet。
只要 div 具有给定的宽度,您就可以使用 padding-top 百分比技巧提供它的高度。因为我希望网格中的所有 div 都是正方形,所以我添加了
`padding-top:100%;`
他们每个人。所以对于网格中的大图像,css(手写笔)如下:
.big-image {
width: 75%;
/* whatever width you want */
display: inline-block;
position: relative;
float:left;
-moz-box-sizing: border-box;
-webkit-box-sizing: border-box;
-ms-box-sizing: border-box;
box-sizing: border-box;
font-size:0px;
&:after {
padding-top: 100%;
/* 16:9 ratio */
display: block;
content: '';
}
}
当然,正如你在下面看到的,div需要相对定位,并且需要在:after css选择器内添加padding。
我希望这对某人有所帮助。谢谢
我正在尝试复制 eBay 的 'Today' 特色卖家布局,将 4 个正方形图像组成一个盒子(见图),但使用 Bootstrap。我真的很难理解如何实现这一目标。我可以获得或多或少均匀的正方形,并且在 lg、md 和 sm 规则上看起来还不错,因为当然不需要按比例放置东西,我可以让每个正方形具有固定的宽度和高度。但是,当涉及到移动设备时,这会超出 window,因为它需要根据 window 大小进行调整。
我目前想出的 html 基本上是一个网格,分为 9 和 3,(col-xs-9 和 col-xs-3),给定高度在每个 desktop/tablet 宽度处。
图像有时是方形图像,有时是横向或纵向格式的图像,在这种情况下,它们将保持纵横比并扩展到最大尺寸,但在包含 div.
有没有一种方法可以使用 Bootstrap 实现此目的,或者我是否需要使用 javascript 来寻找替代方案?
下面的代码,以备不时之需:
HTML
<div id="featured-merchant-container">
<div class="featured-merchant-listings">
<div class="row">
<div class="primary-img-container col-xs-9 col-sm-9 col-md-9 col-lg-9 no-padding-right">
<div class="big-hero-image">
<a ng-if="merchant.userListings[0].primaryImage" ng-href="/#!/users/{{merchant._id}}">
<span class="thumb">
<img ng-src="{{merchant.userListings[0].primaryImage}}" />
</span>
</a>
<a ng-if="!merchant.userListings[0].primaryImage" ng-href="/#!/users/{{merchant._id}}">
<span class="thumb">
<img ng-src="img/placeholder.png" />
</span>
</a>
</div>
</div>
<div class="secondary-img-container col-xs-3 col-sm-3 col-md-3 col-lg-3 no-padding-left">
<div class="big-hero-images">
<div class="first">
<a ng-if="merchant.userListings[1].primaryImage" ng-href="/#!/users/{{merchant._id}}">
<span class="thumb">
<img ng-src="{{merchant.userListings[1].primaryImage}}" />
</span>
</a>
<a ng-if="!merchant.userListings[1].primaryImage" ng-href="/#!/users/{{merchant._id}}">
<span class="thumb">
<img ng-src="img/placeholder.png" />
</span>
</a>
</div>
<div class="second">
<a ng-if="merchant.userListings[2].primaryImage" ng-href="/#!/users/{{merchant._id}}">
<span class="thumb">
<img ng-src="{{merchant.userListings[2].primaryImage}}" />
</span>
</a>
<a ng-if="!merchant.userListings[2].primaryImage" ng-href="/#!/users/{{merchant._id}}">
<span class="thumb">
<img ng-src="img/placeholder.png" />
</span>
</a>
</div>
<div class="last">
<a ng-if="merchant.userListings[3].primaryImage" ng-href="/#!/users/{{merchant._id}}">
<span class="thumb">
<img ng-src="{{merchant.userListings[3].primaryImage}}" />
</span>
</a>
<a ng-if="!merchant.userListings[3].primaryImage" ng-href="/#!/users/{{merchant._id}}">
<span class="thumb">
<img ng-src="img/placeholder.png" />
</span>
</a>
</div>
</div>
</div>
</div>
</div>
</div>
CSS:
#featured-merchant-container {
border: 1px solid green-grey;
.big-hero-image {
text-align:center;
.thumb {
display:block;
border-right:1px solid green-grey;
height:413px;
display:table-cell;
vertical-align:middle;
text-align:center;
img {
width:100%;
height:413px;
}
}
}
.big-hero-images {
text-align:center;
// border-left:1px solid green-grey;
.thumb {
display:block;
height:137px;
display:table-cell;
vertical-align:middle;
text-align:center;
img {
width:100%;
height:137px;
}
}
.first, .second {
border-bottom:1px solid green-grey;
}
}
}
请帮助我。这让我发疯:(。谢谢!
你能用 flex-box
布局做点什么吗?
.cols {overflow: hidden;}
.cols .col {float: left; width: 25%;}
.cols .col:first-child {width: 75%;}
.cols .col img {width: 100%;}
.flex-container {
display: -ms-flexbox;
display: -webkit-flex;
display: flex;
-webkit-flex-direction: column;
-ms-flex-direction: column;
flex-direction: column;
-webkit-flex-wrap: nowrap;
-ms-flex-wrap: nowrap;
flex-wrap: nowrap;
-webkit-justify-content: flex-start;
-ms-flex-pack: start;
justify-content: flex-start;
-webkit-align-content: stretch;
-ms-flex-line-pack: stretch;
align-content: stretch;
-webkit-align-items: flex-start;
-ms-flex-align: start;
align-items: flex-start;
}
.flex-item {
-webkit-order: 0;
-ms-flex-order: 0;
order: 0;
-webkit-flex: 1 0 auto;
-ms-flex: 1 0 auto;
flex: 1 0 auto;
-webkit-align-self: auto;
-ms-flex-item-align: auto;
align-self: auto;
}
<div class="cols">
<div class="col">
<img src="http://placehold.it/350x350" alt="" />
</div>
<div class="col">
<div class="flex-container">
<div class="flex-item"><img src="http://placehold.it/350x350" alt="" /></div>
<div class="flex-item"><img src="http://placehold.it/350x350" alt="" /></div>
<div class="flex-item"><img src="http://placehold.it/350x350" alt="" /></div>
</div>
</div>
</div>
如果您的图像将具有各种尺寸,那么您需要使用将背景大小设置为覆盖的背景图像。
.flex-item
background-size cover
background-image url(http://placehold.it/350x350)
或者您需要使用 object-fit,它很棒,但在 IE 中的支持很糟糕。
.flex-item img
object-fit cover
谢谢大家的回答。
我设法实现这一点的方法是完全取消对网格的 Bootstrap 使用。相反,我围绕百分比构建了网格。我在网上读到一些内容,其中谈到如何提供一个百分比作为 padding-top 的值基本上可以为您提供一个具有特定纵横比的容器。例如,如果您想要 div 保持纵横比 4:3,您要做的是添加
padding-top:75%;
此 div 的样式 sheet。
只要 div 具有给定的宽度,您就可以使用 padding-top 百分比技巧提供它的高度。因为我希望网格中的所有 div 都是正方形,所以我添加了
`padding-top:100%;`
他们每个人。所以对于网格中的大图像,css(手写笔)如下:
.big-image {
width: 75%;
/* whatever width you want */
display: inline-block;
position: relative;
float:left;
-moz-box-sizing: border-box;
-webkit-box-sizing: border-box;
-ms-box-sizing: border-box;
box-sizing: border-box;
font-size:0px;
&:after {
padding-top: 100%;
/* 16:9 ratio */
display: block;
content: '';
}
}
当然,正如你在下面看到的,div需要相对定位,并且需要在:after css选择器内添加padding。
我希望这对某人有所帮助。谢谢