3

次の要件に従って、ページに複数の画像を表示したいと思います。

  • それらはすべて高さに適合します

  • それらはすべて1行にあり、必要に応じて幅を切り取ります

  • 反射はいいだろう

期待される結果

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の専門家ではないので、簡単に思えるかもしれませんが、どんな回答でも大歓迎です! 詳細が必要な場合はお気軽にお尋ねください。

簡単に動作させることができれば、GitHub で jQuery プラグインとしてリリースする予定です。

編集: 画像のリストには JSON API が取り込まれ、URL と画像のサイズが表示されます。Web ページ上の画像の数はさまざまであるため、サーバー上の画像のサイズを変更できません。

編集:将来の読者へ:この質問に対する両方の素晴らしい回答に報いたかったので、次のことを行いました

  • Troy Alfrod 氏の非常に詳細で見栄えの良い回答に対して賞金を授与しました

  • Vals のソリューションのセットアップのシンプルさを検証しました

私自身のシナリオでは、実装とテストの遅延が非常に短いため、今のところ最も簡単な答えを選択することにしました。これが私がしたことです:

  • と の両方#cover_pictures > .images2#cover_reflections > .images2、同一の同じ div が含まれ、background-image同じスタイル (これ以上はありませんreflect.php)

  • に追加transform: scaleY(-1);(および他のブラウザの同等物) #cover_reflections > .images2

  • のサイズを#cover_reflections制限100px

  • .mask提案された div Vals を追加しました。

プロパティをサポートしていないため、IE7-8 を除いて、非常にうまく機能しbackground-sizeます。そこで、php にバックエンドを追加して、すべての画像を正しい高さで送信しました (キャッシュ サポートなどを使用)。それは計画の一部ではありませんでしたが、私はしなければなりませんでした。必要な高さはそのまま取得されますvar height = $('#cover_pictures .images1').height();

それが他の誰かを助けることを願っています!!

セットアップ時に jQuery プラグインへのリンクをここに公開します。

4

3 に答える 3

0

簡略化されたレイアウトでデモを作成しましたが、アイデアは問題ないと思います。

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 に変更しました。

重要なのは、反射のスケール Y ネガティブです (bwoebi のアイデアに従います)。反射のように見えるように、1 より少し小さくしましたが、それはあなた次第です。

これが正常に機能するには、いくつかのプロパティを変更する必要があります。たとえば、位置を下にする必要があります。

最後に、すべての ref1 div をカバーするようにスケーリングされたマスク div を使用し、透明から白へのグラデーションを適用します。

私は JavaScript を含めず、寸法を手作業で修正しましたが、既に行ったようにそれを行うことができます。

デモ

編集: 透明度とぼやけを追加しました (Webkit でのみ利用可能)。透明度を確認する div を 1 つ追加しました。

更新されたデモ

変更はここにあります

#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と1セットの画像のみを使用して、この代替ソリューションを提供したいと思います。

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 に答える