2015-07-10 144 views
0

我很努力地在这里,谷歌和其他地方找到这个答案,但它似乎很隐晦。我不得不做一些花哨的CSS来创建一个具有特定长宽比的框,其中缩略图将垂直和水平居中。这些是直接的想法,在CSS中实现起来实际上有些复杂。我的解决方案在任何地方都能很好地工作,除了在Chrome中的表格中放置尺寸大于容器的图片。图片在Chrome和Safari中100%的表内高度错误

这里是代码,演示了这个问题:

/* 
 
sets aspect ratio of container by adding padding that is calculated 
 
according to width of its parent element 
 
*/ 
 
.aspect-ratio { 
 
    width: 100%; 
 
    display: inline-block; 
 
    position: relative; 
 
} 
 

 
.aspect-ratio:after { 
 
    padding-top: 76.19%; 
 
    display: block; 
 
    content: ''; 
 
} 
 

 
/* 
 
parent has no height, this fills the container's space 
 
*/ 
 
.fill-container { 
 
    position: absolute; 
 
    top: 0; 
 
    bottom: 0; 
 
    right: 0; 
 
    left: 0; 
 
    font-size: 0; 
 
} 
 

 
/* 
 
centers image horizontally and vertically 
 
background color 
 
*/ 
 
.image-background { 
 
    text-align: center; 
 
    background-color: #444; 
 
    height: 100%; 
 
    width: 100%; 
 
} 
 

 
.image-background::before { 
 
    content: ''; 
 
    display: inline-block; 
 
    height: 100%; 
 
    vertical-align: middle; 
 
    margin-right: -0.25em; 
 
} 
 

 
img { 
 
    display: inline-block; 
 
    padding: 5px; 
 
    box-sizing: border-box; 
 
    vertical-align: middle; 
 
} 
 

 
/* 
 
Firefox: image height fills the parent element 
 
Chrome: 
 
inside table - image is rendered at its natural height 
 
outside table - image height fills the parent element as expected 
 
*/ 
 
.fill-height { 
 
    height: 100%; 
 
} 
 

 
.fill-width { 
 
    width: 100%; 
 
} 
 

 
/* other styles */ 
 
h1, h2, h3 { 
 
    text-align: center; 
 
} 
 

 
table { 
 
    width: 100%; 
 
} 
 

 
.thumbnail-viewer { 
 
    width: 40%; 
 
    margin: 10px auto; 
 
}
<h1>tall image</h1> 
 
<h2>small</h2> 
 
<h3>table</h3> 
 
<table> 
 
    <tbody> 
 
    <tr> 
 
     <td> 
 
     <div class="thumbnail-viewer"> 
 
      <div class="aspect-ratio"> 
 
      <div class="fill-container"> 
 
       <div class="image-background"> 
 
       <img class="fill-height" src="http://www.irmaagro.com/images/d.jpg" style="height: 100%;"> 
 
       </div> 
 
      </div> 
 
      </div> 
 
     </div> 
 
     </td> 
 
    </tr> 
 
    </tbody> 
 
</table> 
 
<h3>no table</h3> 
 
<div class="thumbnail-viewer"> 
 
    <div class="aspect-ratio"> 
 
    <div class="fill-container"> 
 
     <div class="image-background"> 
 
     <img class="fill-height" src="http://www.irmaagro.com/images/d.jpg" style="height: 100%;"> 
 
     </div> 
 
    </div> 
 
    </div> 
 
</div> 
 

 
<h2>large</h2> 
 
<h3>table (works in firefox and IE, breaks in chrome and safari)</h3> 
 
<table> 
 
    <tbody> 
 
    <tr> 
 
     <td> 
 
     <div class="thumbnail-viewer"> 
 
      <div class="aspect-ratio"> 
 
      <div class="fill-container"> 
 
       <div class="image-background"> 
 
       <img class="fill-height" src="http://www.landscapeontario.com/thumbnailer.php?image=/assets/1320240573.Twine_wrap_2.JPG&imgWH=500" style="height: 100%;"> 
 
       </div> 
 
      </div> 
 
      </div> 
 
     </div> 
 
     </td> 
 
    </tr> 
 
    </tbody> 
 
</table> 
 
<h3>no table</h3> 
 
<div class="thumbnail-viewer"> 
 
    <div class="aspect-ratio"> 
 
    <div class="fill-container"> 
 
     <div class="image-background"> 
 
     <img class="fill-height" src="http://www.landscapeontario.com/thumbnailer.php?image=/assets/1320240573.Twine_wrap_2.JPG&imgWH=500" style="height: 100%;"> 
 
     </div> 
 
    </div> 
 
    </div> 
 
</div> 
 

 
<h1>wide image</h1> 
 
<h2>small</h2> 
 
<h3>table</h3> 
 
<table> 
 
    <tbody> 
 
    <tr> 
 
     <td> 
 
     <div class="thumbnail-viewer"> 
 
      <div class="aspect-ratio"> 
 
      <div class="fill-container"> 
 
       <div class="image-background"> 
 
       <img class="fill-width" src="http://www.beach.com/images/activity-photo-county-londonderry-ireland-3-day-lake-district-and-hadrian-s-wall-small-group-tour-from-edinburgh-1.jpg"> 
 
       </div> 
 
      </div> 
 
      </div> 
 
     </div> 
 
     </td> 
 
    </tr> 
 
    </tbody> 
 
</table> 
 
<h3>no table</h3> 
 
<div class="thumbnail-viewer"> 
 
    <div class="aspect-ratio"> 
 
    <div class="fill-container"> 
 
     <div class="image-background"> 
 
     <img class="fill-width" src="http://www.beach.com/images/activity-photo-county-londonderry-ireland-3-day-lake-district-and-hadrian-s-wall-small-group-tour-from-edinburgh-1.jpg"> 
 
     </div> 
 
    </div> 
 
    </div> 
 
</div> 
 

 
<h2>large</h2> 
 
<h3>table</h3> 
 
<table> 
 
    <tbody> 
 
    <tr> 
 
     <td> 
 
     <div class="thumbnail-viewer"> 
 
      <div class="aspect-ratio"> 
 
      <div class="fill-container"> 
 
       <div class="image-background"> 
 
       <img class="fill-width" src="http://www.craterlaketrust.org/pub/photo/thumb/Crater-Summer_cropto_500x200.JPG"> 
 
       </div> 
 
      </div> 
 
      </div> 
 
     </div> 
 
     </td> 
 
    </tr> 
 
    </tbody> 
 
</table> 
 
<h3>no table</h3> 
 
<div class="thumbnail-viewer"> 
 
    <div class="aspect-ratio"> 
 
    <div class="fill-container"> 
 
     <div class="image-background"> 
 
     <img class="fill-width" src="http://www.craterlaketrust.org/pub/photo/thumb/Crater-Summer_cropto_500x200.JPG"> 
 
     </div> 
 
    </div> 
 
    </div> 
 
</div>

希望你可以看到,在Chrome(我使用43.0.2357.132 64位)和Safari(8.0。 7)高/大图像超出了其父图像的边界,并且其高度被设置为图像的自然高度。广泛的图像都按预期工作,所以这似乎只是一个高度问题。

我的问题:在Chrome和Safari中解决这个问题的简单或直接的方法是什么?或者它是一个错误,我应该寻找一种不太理想的解决方法,使它看起来不那么糟糕?什么导致这个问题?

谢谢!

回答

0

FYI,在小屏幕上(屏幕宽度< 650像素),表内断裂的第一图像,以及。

要修复它,改变你的img使用绝对定位centering trick

img { 
    padding: 5px; 
    box-sizing: border-box; 
    position: absolute; 
    left: 50%; 
    top: 50%; 
    transform: translate(-50%, -50%); 
} 

这也意味着你不需要image-background::before声明。

+0

真棒,它看起来像你的中心技巧是比我使用的技巧更符合我的代码。 –

0

为什么你需要.fill-container来拥有绝对定位?如果我从风格删除下面的线,然后一切都在Chrome看起来不错(我不能在Safari浏览器测试):

.fill-container { 
    position: absolute; 
    top: 0; 
    bottom: 0; 
    right: 0; 
    left: 0; 
    font-size: 0; 
} 

您还没有关闭的img标签,你有

<img class="fill-height" src="http://www.irmaagro.com/images/d.jpg" style="height: 100%;"> 

代替的(通知/>在一行的末尾)

<img class="fill-height" src="http://www.irmaagro.com/images/d.jpg" style="height: 100%;" /> 
+0

感谢您的回答。这些样式的原因是,包含盒响应地保持其宽高比并限制任何尺寸的图像的高度和宽度。我发现代码来完成[这里](http://stackoverflow.com/a/12121309/5104089)。 –