4

だから私は同じ問題について他のたくさんの解決策を読んだが、それらのどれもうまくいかないようだ。

私はたくさんの画像を持っていますが、そのほとんどはページが読み込まれるときに非表示になります。最初の画像のみが表示されます。私がする必要があるのは、画像を垂直方向に中央揃えにするために、負の上部マージンを与えることです。唯一の問題は、私が今持っているコードは非常に一貫性がなく、時々しか機能しないということです。それが私のコードなのか、画像がキャッシュされているのかなど、実際にはわかりません。

これは私が持っているものです:

$('#frontpage-sidebar-slideshow img').each(function(i, v) {

    // I read that preloading the images would solve the problem, but this doesn't do anything
    //var src = $(this).attr('src');
    //$('<img/>')[0].src = src;

    // First make parent .slide visible to be able to get the image dimentions (not possible if image is invisible)
    var showAfter = false;
    if(!$(this).parent('.slide').is(':visible')) {
        showAfter = true;
        $(this).parent('.slide').css({ // .show() might also work
            display: 'block',
            visibility: 'visible',
            opacity: 1
        });
    }

    // Get dimentions
    var wrapHeight = parseInt($('#frontpage-sidebar-slideshow').height(), 10) + 20;
    var imgHeight = $(this).height();
    var offset = Math.ceil((wrapHeight - imgHeight) / 2);

    // Set offset if needed
    if(imgHeight > wrapHeight) {
        $(this).css('margin-top', offset);
    }

    // Show image again if needed
    if(showAfter) {
        $(this).parent('.slide').show();
    }
});

SlidesJSを使用して画像のスライドショーを作成しています。HTMLフォーマットは次のようになります。

   <div class="slide">
    <a href="url goes here">
        <img width="200" src="image src goes here" alt="" style="">
        <div class="overlay">
            <p class="title"> Some title </p>
            <p> Some content </p>
            <p> More content </p>
        </div> <!-- overlay -->
    </a>
    </div>
   <div class="slide" style="display: none;"> <!-- Only the first image is visible, so this one will be hidden -->
    <a href="url goes here">
        <img width="200" src="image src goes here" alt="" style="">
        <div class="overlay">
            <p class="title"> Some title </p>
            <p> Some content </p>
            <p> More content </p>
        </div> <!-- overlay -->
    </a>
    </div>

2つの問題があります:

1)最初の画像は非常に一貫性のない高さの結果になります。ラッパー値(の高さ.slide)を取得することもあれば、実際の高さの値を取得することもあります。何が原因なのかわかりません。

2)何をしても、最初の画像の高さの値しか取得できません。残りの画像はただ戻り0ます。.slideうん、彼らは奇妙なラッパーの高さ(の高さ)さえ返しません。

何か案は?

更新SlidesJSとスクリプトの両方がページロードで実行されることに気づきました。それらが衝突している可能性があります(SlidesJSが最初の画像を除くすべてを非表示にしたいのに対し、画像を表示し、サイズを取得してから非表示にしようとしています) 、それで私は上記のスクリプト全体をaでラップしようとしましたがsetTimeout(code, 300)、少なくとも最初の画像で一貫した結果が得られるようですが、残りの画像はまだ0を返します。

4

1 に答える 1

8

DOMの外部で画像を調べることができます。

var tmp = new Image()
tmp.src="http://i.imgur.com/vdDQgb.jpg" <-- set to the image path you're using.
alert(tmp.height)

イメージがロードされたことを確認するには、SRCを指定する前にonloadイベントをフックします。

var tmp = new Image()
tmp.onload=function() {alert(tmp.height)};
tmp.src="http://i.imgur.com/vdDQgb.jpg";
于 2012-11-06T15:16:27.783 に答える