2016-04-19 8 views
7

イメージのスライダを作成して(前/次)、「前」をクリックするとイメージが左にスライドし、右は0.5sで「次」をクリックするとゆっくりとしているので、アニメーションがかかります。最後の画像に到達して「次へ」をクリックすると、画像が最初の画像に戻るようにしたいのですが、最初の画像をクリックして「前の画像」をクリックすると、最後の一つ。未定義の高さを持つスライダ

私は同じ動作をしたいですthis JSFiddleが表示されます。 (ただし、画像を自動的に移動させるタイマーは不要で、「トリガー」ボタンは不要で、「前」と「次」のみ)。

ここでの問題は、自分の画像が固定サイズでないことです。私はパーセンテージで幅を定義し、レスポンシブデザインであるため高さを定義できません。ブラウザウィンドウのサイズを変更すると画像のサイズが変更されます。

以前の/次のアクションへのjQueryは簡単ですが、画像に「アクティブ」クラスを削除/追加するときにこのアニメーションを追加する方法を見つけることができません。

私は既に、すべての画像を並べて表示し、最初のものだけを表示しようとしました(コンテナの幅は画像の幅に等しい)ので、「次へ」をクリックするとコンテナが左に移動します次の画像を表示することはできますが、画像の高さを定義することができなければ、それらは横並びではなく、互いの下に表示されるため動作しません。

JSFiddle

HTML

<div class="images"> 
    <img class="active" src="1.jpg"> 
    <img src="2.jpg"> 
    <img src="3.jpg"> 
</div> 

<div class="previous">previous</div> 

<div class="next">next</div> 

CSS

img { 
    width: 100px; 
    display: none; 
    float: left; 
} 

img.active { 
    display: block; 
} 

jQueryの

$('.next').on('click', function() { 
    var active = $('img.active'); 
    var next = active.next('img'); 

    if (next.length) { 
     active.removeClass('active'); 
     next.addClass('active'); 
    } else { 
     active.removeClass('active'); 
     $('.images img:first').addClass('active'); 
    } 
}); 
+0

スライディングエフェクトが必要な場合は、すべてのイメージを左側にオフセットしてから、 'img.active'のcss3トランジションを使用して、' left:0px; '上の各アクティブイメージを取得する必要があります。スキルは私が人々が使用すると思うコンセプトです。 – ArchNoob

答えて

0

HEREは、私が開発した解決策のバイブルです。

この画像スライダの実装における主な問題は、画像がすべて同じサイズで、動的幅(CSSで%で定義)と動的高さ(CSSで定義されていない)です。

解決策は基本的に私のコンテナの中に "fake"イメージ(opacity: 0)を入れて、コンテナがスライダで使用するイメージの実際のサイズを取得するようにしました。実際の画像をposition: absoluteで「ホールド」するdivを入れ、number of images * 100%で計算された幅を与えます。最後に、スライダ内の各画像に画像の数に基づいてx%の幅を与えます。

jQueryでは、「画像ホルダーdiv」を常に%で「移動」します。これは静的な値ではなく、ウィンドウのサイズを変更するとすべての幅が変更できるようになります。

イメージを左右にスライドしてからウィンドウのサイズを変更すると、イメージが完全に機能し続けることがわかります。

0

おそらく理想的な状況ではありませんが、少なくともそれはあなたにアイデアを与えるでしょう。 jQueryのアニメーション機能を使用することもできますし、コードも少し変更しました。

<div id="images"> 
    <div class="images-wrapper"> 
     <img src="http://www.cutestpaw.com/wp-content/uploads/2016/02/In-the-spotlight.jpg"> 
     <img src="http://www.cutestpaw.com/wp-content/uploads/2016/02/Bath-time-with-ducky.jpg"> 
     <img src="http://www.cutestpaw.com/wp-content/uploads/2016/03/FB_IMG_1452981788903.jpg"> 
     <img src="http://www.pictures-of-cats.org/images/Pixiebob-cat-list-of-cat-breeds-pictures-of-cats.jpg" /> 
    </div>  
</div> 

<div class="previous"> 
    previous 
</div> 

<div class="next"> 
    next 
</div> 

とあなたのjQueryのコード内で使用すると、幅アニメーション化することができます:この実装で変更し、追加のプロセス全体を

$('.images-wrapper img:gt(0)').hide(); 

$('.next').click(function() { 
    $('.images-wrapper img:first-child').animate({width:'toggle'},350).next().fadeIn().end().appendTo('.images-wrapper'); 
}); 

$('.previous').click(function() { 
    $('.images-wrapper img:first-child').animate({width:'toggle'},350); 
    $('.images-wrapper img:last-child').prependTo('.images-wrapper').fadeOut(); 
    $('.images-wrapper img:first-child').fadeIn(); 
}); 

を、私はこれを言うだろう、あなたのHTML内でdemo here

を参照してください。 activeイメージへのクラスが削除され、アニメーション関数に置き換えられます

+0

ありがとうございますが、片面から他面への「スライド」アニメーションがないと、これは私には合いません。 –

-1

私はcss3を使って実装しました交尾。しかし、これは、スライドが追加または削除されるたびにCSSのアニメーション値を操作する必要があります。

@keyframes slideAnim { 
    0% { 
    transform: translateX(0) 
    } 
    12.5% { 
    transform: translateX(0%); 
    } 
    25% { 
    transform: translateX(-25%); 
    } 
    37.5% { 
    transform: translateX(-25%) 
    } 
    50% { 
    transform: translateX(-50%) 
    } 
    62.5% { 
    transform: translateX(-50%) 
    } 
    75% { 
    transform: translateX(00%); 
    } 
    89.5% { 
    transform: translateX(00%) 
    } 
    100% { 
    transform: translateX(00%) 
    } 
} 

ここで、アニメーション値は、スライドトランジション間に休止があるように設定されています。私は一度に1つのスライドだけを表示する親フレームを追加しました。

fiddleを参照してください。

5

問題は滑りの高さです。

まず、他のすべての画像を保持する「画像フレーム」の要素が必要です。それは重要です。優れた想像力のために 絵:

Picture Frame example

今、あなたは画像を表示し、非表示にするには、いくつかのテクニクスを持っています。不透明度を設定することができます。 transition: opacity .15s ease-in-out;を使用する場合1つのピクチャがフェードアウトし、次のフェードインがフェードインします。

スライドショーの効果は、可視イメージの位置を左の幅に、以前はまったく新しいしたがって、現在の画像をフレームの左に移動し、新しい画像を右に移動します。

高さが同じでない場合の難易度は次のとおりです。現在の画像が300px、新しい画像が400pxの場合、新しい画像が表示され始めると、ここの画像フレームは直ちに高さを調整します。

以下のコンテンツは、各スライドでジャンプし始めます。

これは本当に望ましいですか?

「はい」の場合は、どのように動作するかを例示することができます。

5

あなたが実際に基本的にはそれだそれ

あなたは(目標IDの= for属性を持つ)IDとラベルを使用Pure CSS!

でこれを行うことができます。あなたが残したのはそれをスタイルすることだけです! (Joshua Hibbertのペンからフォーク)

body { 
 
    background: #f7f4e2; 
 
} 
 

 
/* Slides */ 
 
.slider input { 
 
    display: none; 
 
} 
 

 
/* Buttons */ 
 
.slider label { 
 
    display: none; 
 
    cursor: pointer; 
 
    position: absolute; 
 
    top: 6em; 
 
    left: 50%; 
 
    transform: translateX(-50%); 
 
    color: #fff; 
 
    background: #000; 
 
    padding: 1.36em .5em; 
 
    opacity: .6; 
 
    font-size: 19px; 
 
    font-family: fantasy; 
 
    font-weight: bold; 
 
    transition: .25s; 
 
} 
 
.slider label:hover { 
 
    opacity: 1; 
 
} 
 
.previous { 
 
    margin-left: -188px; 
 
} 
 
.next { 
 
    margin-left: 188px; 
 
} 
 

 
#slide1:checked ~ .buttons .slide1 { 
 
    display: block; 
 
} 
 
#slide2:checked ~ .buttons .slide2 { 
 
    display: block; 
 
} 
 
#slide3:checked ~ .buttons .slide3 { 
 
    display: block; 
 
} 
 
#slide4:checked ~ .buttons .slide4 { 
 
    display: block; 
 
} 
 

 
/* Images */ 
 
.slider { 
 
    position: absolute; 
 
    top: 50%; 
 
    left: 50%; 
 
    width: 400px; 
 
    height: 300px; 
 
    margin-top: -150px; 
 
    margin-left: -200px; 
 
    white-space: nowrap; 
 
    padding: 0; 
 
    float: left; 
 
    transition: .25s; 
 
    overflow: hidden; 
 
    box-shadow: 0 0 0 3.12px #e8e8e8, 
 
       0 0 0 12.64px #eaebe4, 
 
       0 0 0 27.12px #000, 
 
       0 24px 3.824em 5.12px #000; 
 
} 
 
.slide { 
 
    width: 500em; 
 
    transition: .25s; 
 
} 
 
.slider img { 
 
    float: left; 
 
    width: 400px; 
 
    height: 300px; 
 
} 
 

 
#slide1:checked ~ .slide { 
 
    margin: 0; 
 
} 
 
#slide2:checked ~ .slide { 
 
    margin: 0 0 0 -400px; 
 
} 
 
#slide3:checked ~ .slide { 
 
    margin: 0 0 0 -800px; 
 
} 
 
#slide4:checked ~ .slide { 
 
    margin: 0 0 0 -1200px; 
 
}
<div class="slider"> 
 
    <input type="radio" name="slide" id="slide1" checked="true" /> 
 
    <input type="radio" name="slide" id="slide2" /> 
 
    <input type="radio" name="slide" id="slide3" /> 
 
    <input type="radio" name="slide" id="slide4" /> 
 
    
 
    <div class="buttons"> 
 
    <!-- Slide 1 --> 
 
    <label for="slide4" class="slide1 previous">&lt;</label> 
 
    <label for="slide2" class="slide1 next">&gt;</label> 
 
    
 
    <!-- Slide 2 --> 
 
    <label for="slide1" class="slide2 previous">&lt;</label> 
 
    <label for="slide3" class="slide2 next">&gt;</label> 
 
    
 
    <!-- Slide 3 --> 
 
    <label for="slide2" class="slide3 previous">&lt;</label> 
 
    <label for="slide4" class="slide3 next">&gt;</label> 
 
    
 
    <!-- Slide 4 --> 
 
    <label for="slide3" class="slide4 previous">&lt;</label> 
 
    <label for="slide1" class="slide4 next">&gt;</label> 
 
    </div> 
 

 
    <div class="slide"> 
 
    <img src="http://dribbble.s3.amazonaws.com/users/322/screenshots/872485/coldchase.jpg"> 
 
    <img src="http://dribbble.s3.amazonaws.com/users/322/screenshots/980517/icehut_sm.jpg"> 
 
    <img src="http://dribbble.s3.amazonaws.com/users/322/screenshots/943660/hq_sm.jpg"> 
 
    <img src="http://dribbble.s3.amazonaws.com/users/322/screenshots/599584/home.jpg"> 
 
    </div> 
 
</div>

この方法は、(IEの旧バージョンを除く)で最も互換性があり、あなたはそれをアニメーション化する方法に応じて、この方法は、より多くの時間がかかることがありますが、 JSメソッドよりも高速ですが、アニメーションをどのようにしたいかによって異なりますが、css library that does this for youを使用することもできます。

ここに私がお勧めするいくつかのcssイメージスライダーがあります。

10 Amazing Pure CSS3 Image Sliders
http://bashooka.com/coding/pure-css3-image-sliders/

Pure CSS Image Slider Without Javascript #Codeconveyあなたが取り組んでいるものと一緒にこれらの欠点があることであるあなたが探しているもののために良い解決策ですが、CSSの多く
http://codeconvey.com/pure-css-image-slider/

写真ギャラリーでもっと一般的な携帯電話やタブレットではスライドできません。

私はFotoramaをチェックアウトすることをお勧めしますそれは素晴らしいです! :)

0

最も簡単な解決策は、項目を同じサイズにすることです(divに入れて)。background-image CSS機能(詳細はhttp://www.w3schools.com/css/css3_backgrounds.aspを参照)を使用して、imgタグを使用せずにdivに画像を表示させることもできます。

.item { 
    background-size: contain; 
    background-position: center; 
} 

とHTML内の各項目に:

項目のCSSは次のようになり、私は最終的にそこに着いた

<div class='item' style='background-image: url(img1.jpg)' /> 
<div class='item' style='background-image: url(img2.jpg)' /> 
<div class='item' style='background-image: url(img3.jpg)' /> 
関連する問題