我正在做一个项目列表,但它有一些挑战:
这是我所期望的形象:
我得到了什么:http://codepen.io/caio/pen/ygkfm/
正如您所看到的,当图标具有图标时,我无法将相同的缩放设置为“图像”div
。我的问题有解决办法吗?
答案 0 :(得分:6)
我假设你的图像(exept图标)都具有与你的例子中相同的宽高比。
在这种情况下,您可以使用填充底部来保持图像容器的高度。由于padding-bottom
是根据容器的宽度计算的,所以无论内容如何都会保持其宽高比(您必须使用position:absolute;
定位内容,因此它不会改变容器的尺寸。)
以下是 demo 显示您可以执行的操作。抱歉我没有进入codePen
我还添加了另一个容器,以便将图标置于中心位置。
* {
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
}
.items {
margin: 50px auto 0;
width: 90%;
*zoom: 1;
}
.items:before, .items:after {
content:" ";
display: table;
}
.items:after {
clear: both;
}
.items .item {
border: 1px solid #ddd;
float: left;
width: 32%;
}
.items .item:nth-child(3n+2) {
margin: 0 2%;
}
.items .item .image {
background: #eee;
padding-bottom:50%;
position:relative;
}
.items .item .image .img_in{
position:absolute;
width:100%;
height:100%;
text-align:center;
}
.items .item .image img {
display: block;
width: 100%;
height:100%;
}
.items .item .image img.icon {
height: 80%;
margin:0 auto;
position: relative;
top: 10%;
width: auto;
}
.items .item .title {
margin: 0;
padding: 20px;
}
答案 1 :(得分:4)
很容易
添加以下.items .item .image
当你有一个正常的'宽度和高度分别为200和100像素,然后50%代表宽度的50%(200 * 50%= 100)
{
height: 0;
padding-bottom: 50%;
}
http://codepen.io/HerrSerker/pen/HhjKo?editors=110
您可以使用SCSS percentage功能:
padding-bottom: percentage(100px / 200px);
答案 2 :(得分:2)
这并不是你想到的,但它是一个非常敏感的设计,我希望你能得到它:http://codepen.io/anon/pen/DwudI
这是要点:您可能希望保持每个主容器的纵横比。然后,图像缩放至高度的至少80%,宽度和高度均不超过100%。在div上创建宽高比的方法是使用这个有趣的padding-top
技巧。调整屏幕大小时,div的宽度会发生变化,从而导致高度变为(宽高比)。因此,如果您调整较小,则最终div会小于图像大小,这将导致200x100填充整个div。
因此,如果您希望图像填充div,则它必须(A)大于div,(B)与div相同的宽高比。
你提到标题可能是多行:现在新行在下面。如果您希望文本“向上浮动”,那么这不会太难。只需在标题上使用position:absolute; bottom:0px
,并确保.item
有position:relative
。
答案 3 :(得分:2)
我认为你的方法是错误的,当一切都基于宽度百分比时,除非你使用JS,否则没有办法知道高度,所以你需要将宽度改为更适合你的目标
将CSS更改为:
.icon {
margin: 0 auto;
padding: 5% 0;
width: 40%;
}
它看起来更像你想要的。我更新了您的CodePen
答案 4 :(得分:1)
也许你可以尝试这个jQuery库http://brm.io/jquery-match-height/
要使用它,您需要将数据属性分配给要匹配其高度的元素,然后计算要生成的每个元素的高度,它们都是相同的。它考虑了填充,边距,边框和框大小。
答案 5 :(得分:1)
主要是,我向.items .item .image img
添加了相同值的最大高度和最小高度:
.items .item .image img {
display: block;
width: 100%;
max-height:23%;
min-height:23%;
}
我不太确定你想要实现的目标,但如果我能帮到你,那么这就是你正在寻找的,这是完整的代码:
<强> HTML 强>
<div class="items">
<a href="#" class="item">
<div class="image">
<img src="http://placehold.it/200x100" />
</div>
<h4 class="title">Hi. I'm a title.</h4>
</a>
<a href="#" class="item">
<div class="image">
<img src="http://placehold.it/80x80" class="icon" />
</div>
<h4 class="title">Hi. I'm a title.</h4>
</a>
<a href="#" class="item">
<div class="image">
<img src="http://placehold.it/200x100" />
</div>
<h4 class="title">Hi. I'm a title.</h4>
</a>
</div>
<强> CSS 强>
* {
@include box-sizing(border-box);
}
.items {
margin: 50px auto 0;
width: 90%;
@include clearfix;
}
.item {
border: 1px solid #ddd;
float: left;
width: 30%;
}
.items .item .image {
background: #eee;
}
.items .item .image img {
display: block;
width: 100%;
max-height:23%;
min-height:23%;
}
.items .item .title {
margin: 0;
padding: 20px;
}
.icon {
height: 80%;
margin: 0 auto;
position: relative;
top: 10%;
width: auto;
}
.items .item:nth-child(3n+2) {
margin: 0 2%;
}
这是 FIDDLE
答案 6 :(得分:1)
你可以使用额外的元素和vertical-padding
来强制你的div保持相同的比例它是否有2:1的图像。
DEMO 和基本的css:
.image:before {
content:'';
display:inline-block;
vertical-align:middle;
padding-top:50%;/* equals 50% of width of parent */
width:0;
box-shadow:0 0 0 5px red;/* let's see where it stands for demo purpose */
}
为了让这个在您的代码中工作:
img
应该回到默认的display
(inline-block
),所以只需删除display:block;
并在middle
中垂直对齐到伪元素<{1}}上显示的img
下的差距将不再存在。
baseline
需要:
.image
font-size:0;
不应缩进<div><img src="..
以避免额外的<div><!-- code indented --><img src="...
,并在white-space
已满img
时中断2行。
我在演示中链接了另一个版本,其中图像可能比初始空间大而不破坏布局(基于元素保留在流中的想法,不涉及width
定位): {{ 3}} 强>
答案 7 :(得分:1)
我认为这就是你的意思。
<强> HTML 强>
<a href="#" class="item">
<div class="image">
<div><img src="http://placehold.it/200x100"></div>
</div>
<h4 class="title">Hi. I'm a title.</h4>
</a>
<a href="#" class="item">
<div class="image">
<div><img src="http://placehold.it/80x80" class="icon"></div>
</div>
<h4 class="title">Hi. I'm a title.</h4>
</a>
<a href="#" class="item">
<div class="image">
<div><img src="http://placehold.it/200x100"></div>
</div>
<h4 class="title">Hi. I'm a title.</h4>
</a>
</div>
<强> SCSS 强>
* { @include box-sizing(border-box); }
.items {
margin: 50px auto 0;
width: 90%;
@include clearfix;
.item {
border: 1px solid #ddd;
float: left;
width: 32%;
&:nth-child(3n+2) { margin: 0 2%; }
.image {
background: #eee;
min-height:100px;
max-height:100px;
display:table;
width:100%;
&> div {
display:table-cell;
text-align:center;
vertical-align:middle;
}
img {
max-width:100%;
height:100%;
margin:0 auto;
&.icon {
height: 80%;
margin: 0 auto;
position: relative;
top: 10%;
width: auto;
}
}
}
.title {
margin: 0;
padding: 20px;
}
}
}
答案 8 :(得分:1)
我宁愿去使用那些我发现自己使用的实用程序类,因为我发现它们,基本上将它们嵌入到我写的每个CSS中。干净,易于阅读,易于嵌入HTML。
这一小组类允许您在元素上具有比例宽度/高度尺寸。 这是演示http://siebennull.com/equal_width_height.html
以下是解释它的文章:http://www.mademyday.de/css-height-equals-width-with-pure-css.html
明显可以归结为谁找到了这个技巧:)
<强> CSS 强>
.box{
position: relative;
width: 50%; /* desired width */
}
.box:before{
content: "";
display: block;
padding-top: 100%; /* initial ratio of 1:1*/
}
.content{
position: absolute;
top: 0;
left: 0;
bottom: 0;
right: 0;
}
/* Other ratios */
.ratio2_1:before{
padding-top: 50%;
}
.ratio1_2:before{
padding-top: 200%;
}
.ratio4_3:before{
padding-top: 75%;
}
.ratio16_9:before{
padding-top: 56.25%;
}
<强> HTML 强>
<div class='box'>
<div class='content'>Aspect ratio of 1:1</div>
</div>
<div class='box ratio16_9'>
<div class='content'>Aspect ratio of 16:9</div>
</div>