3

我想在我的页面上显示多个图像,并满足以下要求:

  • 他们都适合身高

  • 它们都在一条线上,必要时按宽度裁剪

  • 反射会很好

预期结果

我让它使用background-image, 和以下结构工作:

<!-- row images -->
<div class="row-fluid">
    <div class="span12" id="cover_pictures">
        <div class="images1">
            <div class="images2" style="background-image: url('http://i.imgur.com/OEy0D1X.jpg');"></div>
            <div class="images2" style="background-image: url('http://i.imgur.com/OEy0D1X.jpg');"></div>
            <div class="images2" style="background-image: url('http://i.imgur.com/OEy0D1X.jpg');"></div>
            <div class="images2" style="background-image: url('http://i.imgur.com/OEy0D1X.jpg');"></div>
            <div class="images2" style="background-image: url('http://i.imgur.com/OEy0D1X.jpg');"></div>
            <div class="clearfix"></div>
        </div>  </div>
</div>


<!-- row for reflections, php generated -->
<div class="row-fluid">
    <div class="span12 hidden-phone" id="cover_reflections">
        <div class="images1">
            <div class="images2" style="background-image: url('http://myserver/reflect.php?http://i.imgur.com/OEy0D1X.jpg');"></div>
            <div class="images2" style="background-image: url('http://myserver/reflect.php?http://i.imgur.com/OEy0D1X.jpg');"></div>
            <div class="images2" style="background-image: url('http://myserver/reflect.php?http://i.imgur.com/OEy0D1X.jpg');"></div>
            <div class="images2" style="background-image: url('http://myserver/reflect.php?http://i.imgur.com/OEy0D1X.jpg');"></div>
            <div class="images2" style="background-image: url('http://myserver/reflect.php?http://i.imgur.com/OEy0D1X.jpg');"></div>
            <div class="clearfix"></div>
        </div>
    </div>
</div>

以及以下 CSS :

#cover_pictures .images1 {
    height:350px;
}

#cover_reflections .images1 {
    height:100px;
}

.images1 {
    width:100%;
}

.images2 {
    /* top for reflections, doesnt matter for pictures*/
    background-position:center top;
    background-repeat:no-repeat;
    background-size:auto 100%;

    float:left;
    height:100%;
    overflow: hidden;
    margin:0px 0%;
}

使用这个 JS 来调整.images2div 的大小:

var l = dataJson.length; // number of images
var margTot = 5; // 5% of the space for margins

$(".images2").css("margin-left",  margTot / 2 / l + "%");
$(".images2").css("margin-right", margTot / 2 / l + "%");
$(".images2").css("width", (100 - margTot)/l + "%");

问题是:从 PHP 加载反射非常慢,生成的图像太大,所以我想使用 Reflection.js。此脚本仅适用于<img />,不适用于background-image,但我似乎无法使用<img />元素制作相同的布局。图像失真,如果不是,它们仅适合宽度等。

我不是 html/css 方面的专家,所以对你们中的一些人来说似乎很容易,但请确保任何答案都将不胜感激!如果您需要更多详细信息,请随意询问,我可能已经忘记了一些。

如果我能让它轻松工作,我计划将它作为 jQuery 插件发布到 GitHub 上。

编辑:图像列表填充了 JSON API,给了我图像的 URL 和大小。我无法调整服务器上的图像大小,因为网页上的图像数量不同。

编辑:对未来的读者:我想奖励这个问题的两个很好的答案,所以我做了以下

  • 我向 Troy Alfrod 授予了赏金,因为他的回答非常详细且好看

  • 我验证了 Vals 的解决方案,因为它设置简单

对于我自己的场景,我决定暂时采用最简单的答案,因为实施和测试的延迟非常短。这是我所做的:

  • 两者都#cover_pictures > .images2包含#cover_reflections > .images2相同的 divbackground-image和相同的样式(不再reflect.php

  • 添加transform: scaleY(-1);(以及其他浏览器的等效项)到 #cover_reflections > .images2

  • 将大小限制#cover_reflections100px

  • 添加了.maskdiv Vals 建议。

它工作得很好,除了在 IE7-8 中,因为它不支持background-size属性。所以我在 php 中添加了一个后端,以正确的高度发送每个图像(支持缓存等)。那不是计划的一部分,但我必须这样做。这样检索所需的高度var height = $('#cover_pictures .images1').height();

希望它会帮助别人!

设置时,我将在此处发布指向 jQuery 插件的链接。

4

3 回答 3

0

我给你做了一个demo,布局很简单,但我觉得这个想法还可以:

HTML是:

<div class="row-fluid">
    <div class="span12" id="cover_pictures">
    <div class="images1">
        <div class="images2" id="img1"></div>
        <div class="images2" id="img2"></div>
        <div class="clearfix"></div>
    </div>  </div>
</div>
<div class="row-fluid">
    <div class="span12" id="cover_reflections">
    <div class="ref1">
        <div class="ref2" id="img1"></div>
        <div class="ref2" id="img2"></div>
        <div class="mask"></div>
    </div>  </div>
</div>

和你已经拥有的没什么不同。

我在反射行中添加了一个蒙版 div,以制作阴影效果。

CSS是

#cover_pictures .images1 {
    height:350px;
}
#cover_reflections .ref1 {
    height:100px;
}
.images1, .ref1 {
    width:100%;
}
#img1 {
    width: 200px;
    background-image: url(http://placekitten.com/200/300);
}
#img2 {
    width: 250px;
    background-image: url('http://placekitten.com/250/300');
}
.images2, .ref2 {
    background-repeat:no-repeat;
    float:left;
    height:100%;
    overflow: hidden;
    margin:0px 0%;
}
.images2 {    
    background-position:center top;
    background-size:auto 100%;
}
.ref2 {
    background-position:center bottom;
}
#cover_reflections .ref1 {
    -webkit-transform: scaleY(-0.9);
} 
.mask {
    position: absolute;
    width: 100%;
    height: 100%;
    background-image: -webkit-gradient( linear, center bottom, center top, color-stop(0.1, rgba(255, 255, 255, 0.2)), color-stop(0.95, rgba(255, 255, 255, 0.9)));
}

几乎是一样的;我已将背景图像从 HTML 更改为 CSS。

关键是反射的 scaleY 负值(遵循 bwoebi 的想法)。我放了一点点小于 1,看起来更像是一种反射,但这取决于你。

必须更改某些属性才能正常工作,例如位置必须位于底部。

最后,使用缩放的遮罩 div 覆盖所有 ref1 div,渐变从透明到白色。

我没有包含 JavaScript,并手动修复了尺寸,但您可以像以前那样做。

演示

编辑:增加透明度和一些模糊性(仅在 webkit 中可用)。添加了一个 div 来检查透明度。

更新的演示

变化在这里

#cover_reflections .ref1 {
    -webkit-transform: scaleY(-1);
    opacity: 0.65;
    -webkit-filter: blur(1px);
}

我认为您所说的由尺寸变化引起的问题与之前的 scaleY(-0.9) 有关,我认为现在表现还可以。关于它是响应式的,只是我没有在我的代码中包含您的 Javascript,因为我认为这不是重点,但它应该可以正常工作而不会出现问题

于 2013-05-30T19:44:36.270 回答
0

我想提供这个替代解决方案,只使用 CSS 和一组图像:

HTML:

<div class="row-fluid">
    <div class="span12" id="cover_pictures">
        <div class="images">
            <div class="img"></div>
            <div class="img"></div>
            <div class="img"></div>
            <div class="img"></div>
            <div class="img"></div>
            <div class="img"></div>
            <div class="img"></div>
            <div class="img"></div>
            <div class="img"></div>
            <div class="img"></div>
            <div class="img"></div>
            <div class="img"></div>
        </div>  
    </div>
</div>

CSS:

#cover_pictures { font-size: 0; }
.images { position: relative; }
.images > .img {
    display: inline-block;
    height: 350px; width: 50px;
    margin: 2px;
}
.images > .img, .images > .img:after {
    background-color: transparent;
    background-position: bottom center;
    background-repeat: no-repeat;
}

.images > .img:after {
    content: '';
    display: inline-block;
    width: 50px; height: 60px;
    position: absolute;
    bottom: -58px;

    -moz-transform: scaleY(-1);
    -o-transform: scaleY(-1);
    -webkit-transform: scaleY(-1);
    transform: scaleY(-1);
    -ms-filter: flipv;
    filter: flipv;

    -moz-box-shadow: inset 0px 40px 60px #fff;
    -webkit-box-shadow: inset 0px 40px 60px #fff;
    box-shadow: inset 0px 40px 60px #fff;
}

.images > .img:nth-child(1), .images > .img:nth-child(1):after { 
    background-image: url(http://placekitten.com/110/350);
}
.images > .img:nth-child(2), .images > .img:nth-child(2):after { 
    background-image: url(http://placekitten.com/120/350);
}
.images > .img:nth-child(3), .images > .img:nth-child(3):after { 
    background-image: url(http://placekitten.com/130/350);
}
.images > .img:nth-child(4), .images > .img:nth-child(4):after { 
    background-image: url(http://placekitten.com/145/350);
}
.images > .img:nth-child(5), .images > .img:nth-child(5):after { 
    background-image: url(http://placekitten.com/150/350);
}
.images > .img:nth-child(6), .images > .img:nth-child(6):after { 
    background-image: url(http://placekitten.com/160/350);
}
.images > .img:nth-child(7), .images > .img:nth-child(7):after { 
    background-image: url(http://placekitten.com/170/350);
}
.images > .img:nth-child(8), .images > .img:nth-child(8):after { 
    background-image: url(http://placekitten.com/180/350);
}
.images > .img:nth-child(9), .images > .img:nth-child(9):after { 
    background-image: url(http://placekitten.com/195/350);
}
.images > .img:nth-child(10), .images > .img:nth-child(10):after { 
    background-image: url(http://placekitten.com/205/350);
}
.images > .img:nth-child(11), .images > .img:nth-child(11):after { 
    background-image: url(http://placekitten.com/210/350);
}
.images > .img:nth-child(12), .images > .img:nth-child(12):after { 
    background-image: url(http://placekitten.com/240/350);
}

结果如下所示:

在此处输入图像描述

解释一下,CSS 通过:after在每个图像之后注入一个伪元素来工作。图像本身clip只能以正确的尺寸显示,:after版本也是如此。

然后该:after元素包含与其父元素完全相同的图像,但使用 CSS 垂直翻转,因此仅60px显示底部。然后通过使用box-shadow带有40px色散的偏移来创建渐变效果,向上辐射。

这是一个工作的 jsFiddle供您使用。

于 2013-05-31T19:30:48.690 回答
-1

您可以获取每个 img 标签的 src 并使用 jQuery 将其添加为背景图像。然后 Reflection.js 将起作用。

只要确保将图像放在隐藏的 div 中即可。

于 2013-05-28T11:47:20.357 回答