1

このデザインに従って、画像のツールチップを備えたスライドギャラリーを開発しようとしています。

実装する設計

私が開発する必要があるのは、2つのボタンで制御されるスライダーです。ボタンを押すたびに、スライダーのコンテンツはスライダーの幅またはその側に残っているコンテンツの幅のいずれか小さい方を移動する必要があります。マウスがスライダー内の画像に入ると、フルサイズバージョンがツールチップとして表示される必要があります。

これまでの私の解決策のフィドルです。私が抱えている問題は、ビューに完全に収まらない画像と左側の非表示領域が新しい行に移動することです。[コンテンツサイズを表示]ボタンをクリックすると、問題を確認できます。コンテンツ要素の幅は、コンテナ要素の幅+コンテンツ要素の左マージンに等しくなります。

ボーナスポイントは、コンテンツを右に移動するためのアルゴリズムを提案できる場合、私は左にTを計算しました(または、とにかくそう思います)が、右はもう少し作業が必要になります(そうではありません)コンテンツの終わりに達しているかどうかを確認してください)。更新:他の問題が解決されるまで、右への適切な移動を実装できないようです。これが私が思いついたアルゴリズムです。実際の幅を測定できない場合、「表示する左」を測定できません。コンテンツ要素。

ここに画像の説明を入力してください

4

2 に答える 2

2

私はあなたが好きかもしれない何かを作成しました:

ギャラリーデモ

  • ギャラリーは、デフォルトではギャラリーの全幅をスクロールしませ(変更できます)。最初は右側で一部の画像が切り取られ、「完全な」スライドがギャラリーの反対側で再び切り取られます。 . そのために変数が必要です。お好みで調整してください。beKind
  • ギャラリーを使用可能にするのに十分なコンテンツがない場合は、ボタンを非表示にします。
  • ギャラリーは、スクロールする残りのスペースを計算します。
  • スライダーの端に達すると、左/右のボタンでギャラリーが最初/最後にジャンプするため、常に使用できます。(ボタンがあるのはちょっと奇妙に思えます...しかし、それは何も正しくありませんか?;))
  • ツールチップにはホバーインテントが組み込まれており、ユーザーが意図せずにギャラリーをホバリングした場合にユーザーを怒らせません: (ホバーが 120 ミリ秒以上登録されている場合、ツールチップはフェードインします。適切なタイミングです。気に入っています。)
  • コメントで指摘されているように、ツールチップは画面から消えません。

jQ:

// Slide Kind Gallery - by roXon // non plugin v. // CC 2012.
$(window).load(function(){  
    var galW = $('#gallery').outerWidth(true),
        beKind = 120, // px substracted to the full animation to allow some images to be fully visible - if initially partly visible.
        sumW = 0;       
    $('#slider img').each(function(){
        sumW += $(this).outerWidth(true);
    }); 
    $('#slider').width(sumW);
    if(sumW <= galW){ $('.gal_btn').remove(); } 
    function anim(dir){
        var sliderPos = Math.abs($('#slider').position().left),
            rem = dir ==='-=' ? rem = sumW-(sliderPos+galW) : rem = sliderPos,
            movePx = rem<=galW ? movePx = rem : movePx = galW-beKind;
        if( movePx <= 10){
            movePx = dir==='-=' ? movePx=rem : movePx = galW-sumW;
            dir = '';
        }
        $('#slider').stop(1).animate({left: dir+''+movePx },1000);
    }   
    $('.gal_btn').on('click', function(){
        var doit = $(this).hasClass('gal_left') ? anim('+=') : anim('-=');
    }); 
});

ツールチップスクリプト:

// Addon // Tooltip script
var $tt = $('#tooltip');
var ttW2 = $tt.outerWidth(true)/2;
var winW = 0;
function getWW(){ winW = $(window).width(); }
getWW();
$(window).on('resize', getWW);
$('#slider img').on('mousemove',function(e){
    var m = {x: e.pageX, y: e.pageY};
    if( m.x <= ttW2 ){
       m.x = ttW2;
    }else if( m.x >= (winW-ttW2) ){
       m.x = winW-ttW2;
    }
    $tt.css({left: m.x-ttW2, top: m.y+10});
}).hover(function(){
    $clon = $(this).clone();
    var t = setTimeout(function() {
        $tt.empty().append( $clon ).stop().fadeTo(300,1);
    },120);
    $(this).data('timeout', t); 
},function(){
    $tt.stop().fadeTo(300,0,function(){
        $(this).hide();  
    });
    clearTimeout($(this).data('timeout'));
});

HTML

(タグの#tooltip後に div を配置します)body

<div id="tooltip"></div>

<div id="gallery_container">
    <div id="gallery"> 
        <div id="slider">
            <img src="" alt="" />
            <img src="" alt="" />
        </div> 
    </div>
    <div class="gal_left gal_btn">&#9664;</div>
    <div class="gal_right gal_btn">&#9654;</div>
</div>

CSS:

/*GALLERY*/
#gallery_container{
    position:relative;
    margin:0 auto;
    width:600px;
    padding:0 30px; /*for the buttons */
    background:#eee;
    border-radius:5px;
    box-shadow: 0 2px 3px #888;
}
#gallery{
    position:relative;
    height:100px;
    width:600px;
    overflow:hidden;
}
#slider{
    position:absolute;
    left:0px;
    height:100px;
}
#slider img{
    height:100.999%; /* fixes some MOZ image resize inconsistencies */
    float:left;
    cursor:pointer;
    border-right:3px solid transparent; /* instead of margin that could leat to some wrong widths calculations. */
}
.gal_btn{
    position:absolute;
    top:0px;
    width:30px; /*the container padding */
    height:40px;
    padding:30px 0;
    text-align:center;
    font-size:30px;
    cursor:pointer;
}
.gal_left{left:0px;}
.gal_right{right:0px;}
/* end GALLERY */

/* TOOLTIP ADDON */
#tooltip{
    position:absolute;
    z-index:100;
    width:300px;
    padding:10px;
    background:#fff;
    background: rgba(255,255,255,0.3);
    box-shadow:0px 3px 6px -2px #111;
    display:none;
}
#tooltip *{
    width:100%;
    vertical-align:middle;
}
/* end TOOLTIP ADDON */

気に入っていただけるといいのですが、便利なUI 設計のコツを学びました。

ところで、ALT属性を入力したい場合 (検索エンジンはそれを好みます!)、そのテキストを取得して、次のようにツールチップ内に表示することもできます!:

ツールチップ内にテキストを含むデモ

ハッピーコーディング。

于 2012-06-20T21:50:52.573 に答える
1

あなたの問題を正しく理解しているかどうかわかりません。.scroll-content div に十分な幅を設定すると、画像は「次の行」に移動しません。したがって、解決策は、css で幅を設定することです。そうでない場合は、jquery を使用してすべての画像の合計幅を決定し、それを .scroll-content div に渡すことができます。jQueryでChildrenの合計幅を計算する

于 2012-06-19T23:01:31.953 に答える