2017-08-27 13 views
0

子セレクタを使用してホバー上の画像を切り替えるのにCSSだけを使用しています。各画像は、包含div内にインラインブロックとして表示され、画像のグリッドを作成します。CSS:子セレクタ付きホバーイメージスイッチ

これは奇妙twitch-

を除いて、美しく働いている)マウスを含むDIVで最初画像上に置きました。 および b。)ページが任意の距離をスクロールすると、ページ全体が先頭にジャンプします。

このツイッチは、最初の画像上にマウスを移動することによって誘発されます。位置に関係なく、マウスが他の画像の間を移動するときは発生しません。

効果がここに表示されます:https://jsfiddle.net/continuist/kognrzof/9/

CSS:

/* CONTAINER DIV */ 

    #rocks {width: auto;} 

/* EACH IMAGE ELEMENT */ 

    .foo img {width:30%;} 

    .foo img:first-child{display:inline-block;} 
    .foo img:last-child{display:none;} 

    .foo:hover img:first-child{display:none;} 
    .foo:hover img:last-child{display:inline-block;} 

HTML:写真で

<div id="rocks"> 
    <a class="foo" href="#"> 
     <img src="/img/item1.png"> 
     <img src="/img/item1hover2.svg"> 
    </a> 
    <a class="foo" href="#"> 
     <img src="/img/item1.png"> 
     <img src="/img/item1hover.svg"> 
    </a> 
    <a class="foo" href="#"> 
     <img src="/img/item3.png"> 
     <img src="/img/item3hover.svg"> 
    </a> 

    ... 

</div> 

、これらのイメージのスイッチのそれぞれについて:ホバー。しかし、ページがスクロールし、マウスがページ上の最初のイメージ(一番上、一番左)上に移動すると、ページ全体が先頭にジャンプします。

Screenshot of the CSS/HTML above

+1

JsFiddleを作成します。 – Muhammad

+0

明らかに間違っていることがないので、あなたが含まれているものから言うことは不可能です。フィドルや作業現場/デモへのリンクは助けになります – FluffyKitten

+0

ありがとうムハンマドとフルフィーキッテン。私はここでJsFiddleを作成しました: https://jsfiddle.net/continuist/kognrzof/9/ – continuist

答えて

0

最初に、私はそれがあなたのブラウザの問題だと思っていました。なぜなら、Firefoxでは動作が正しいからです。しかし、OperaやChromeでは、あなたが記述したほど悪いものでした。

私はフィドルを作成しましたが、これはうまくいくようですが、コードを少しきれいに再作成しました。

主な変更点は、ホバリングとサイズの影響を処理するために、与えられたクラスでIMGをdivにカプセル化したことです。次に、画像はdivの幅の100%にすぎません(オーバーフローでIMG要素を配置するのではなく、カバーを使用するためにdivの背景として画像を持たせたいかもしれません。 :divに隠されています

また、マージン:5pxと幅/高さ:calc(33vw - 15px)のA(.foo)フロートを作成しました。メディアは

/* CONTAINER DIV */ 
 

 
    #rocks {width: auto;} 
 
    
 
/* EACH IMAGE ELEMENT */ 
 

 
    .foo {width:calc(33vw - 15px); height:calc(33vw - 15px); position:relative; margin:5px 5px 0 0 ; float:left; } 
 
    .foo div img{width:100%;} 
 
    
 
    .nd{display:none;} 
 
    
 
    .foo:hover div.st{display:none;} 
 
    .foo:hover div.nd{display:block;}
<div id="rocks"> 
 
<!-- ROW 1 --> 
 
    <a class="foo" href="#"> 
 
    <div class="switch st"> <img src="https://dl.dropbox.com/s/nduc0f6fi6zmt5g/rock1.png?dl=0"></div> 
 
     <div class="switch nd"><img src="https://dl.dropbox.com/s/jce22cboubyv3l8/rock1-hover.png?dl=0"></div> 
 
    </a> 
 
    <a class="foo" href="#"> 
 
    <div class="switch st"> <img src="https://dl.dropbox.com/s/nduc0f6fi6zmt5g/rock1.png?dl=0"></div> 
 
     <div class="switch nd"><img src="https://dl.dropbox.com/s/jce22cboubyv3l8/rock1-hover.png?dl=0"></div> 
 
    </a> <a class="foo" href="#"> 
 
    <div class="switch st"> <img src="https://dl.dropbox.com/s/nduc0f6fi6zmt5g/rock1.png?dl=0"></div> 
 
     <div class="switch nd"><img src="https://dl.dropbox.com/s/jce22cboubyv3l8/rock1-hover.png?dl=0"></div> 
 
    </a> 
 
<!-- ROW 2 --> 
 
    <a class="foo" href="#"> 
 
    <div class="switch st"> <img src="https://dl.dropbox.com/s/nduc0f6fi6zmt5g/rock1.png?dl=0"></div> 
 
     <div class="switch nd"><img src="https://dl.dropbox.com/s/jce22cboubyv3l8/rock1-hover.png?dl=0"></div> 
 
    </a> <a class="foo" href="#"> 
 
    <div class="switch st"> <img src="https://dl.dropbox.com/s/nduc0f6fi6zmt5g/rock1.png?dl=0"></div> 
 
     <div class="switch nd"><img src="https://dl.dropbox.com/s/jce22cboubyv3l8/rock1-hover.png?dl=0"></div> 
 
    </a> <a class="foo" href="#"> 
 
    <div class="switch st"> <img src="https://dl.dropbox.com/s/nduc0f6fi6zmt5g/rock1.png?dl=0"></div> 
 
     <div class="switch nd"><img src="https://dl.dropbox.com/s/jce22cboubyv3l8/rock1-hover.png?dl=0"></div> 
 
    </a> 
 
<!-- ROW 3 --> 
 
    <a class="foo" href="#"> 
 
    <div class="switch st"> <img src="https://dl.dropbox.com/s/nduc0f6fi6zmt5g/rock1.png?dl=0"></div> 
 
     <div class="switch nd"><img src="https://dl.dropbox.com/s/jce22cboubyv3l8/rock1-hover.png?dl=0"></div> 
 
    </a> <a class="foo" href="#"> 
 
    <div class="switch st"> <img src="https://dl.dropbox.com/s/nduc0f6fi6zmt5g/rock1.png?dl=0"></div> 
 
     <div class="switch nd"><img src="https://dl.dropbox.com/s/jce22cboubyv3l8/rock1-hover.png?dl=0"></div> 
 
    </a> <a class="foo" href="#"> 
 
    <div class="switch st"> <img src="https://dl.dropbox.com/s/nduc0f6fi6zmt5g/rock1.png?dl=0"></div> 
 
     <div class="switch nd"><img src="https://dl.dropbox.com/s/jce22cboubyv3l8/rock1-hover.png?dl=0"></div> 
 
    </a> 
 
</div>

を照会します(その後、handeledすることができています

+0

この解決策は機能しました。私はこのメソッドを適用することに決めました(クラス 'switch'を削除することは、フィドルでは定義されていませんでした)。私はあなたの助けに大変感謝しています! – continuist

+0

確かに、助けてうれしい:)スイッチクラスのためだけに注意してください。私は要素 '.foo:hover div.st {display:none;} 'でターゲティングを使用しましたが、' .foo:hover .switch.st {display:none;} 'の代わりにクラスを使う方が良いです。正しい動作の問題ではなく、両方のソリューションが同じように動作しますが、経験から、もしあなたがそのようなものをターゲットにして、後であなたのプロジェクトに戻ってきて、他のdiv要素を構造に追加すると、 divにターゲティングしている間にそれらにも適用されますが、これはほとんどの場合、欲しい結果ではありません:) – Zorak

0

私はこの行動の理由を説明することはできないんだけど、私は私があなたの問題の解決策を知っていると思います。

#rocks a要素にdisplay: inline-blockを追加すると解決できます。 この変更により、画像に適用されているwidthをアンカータグに切り替える必要があります。私はあなたのフィドルをフォークし、あなたはそれを見ることができますhere

私はそれがあなたを助けてくれることを願っています。

+0

このソリューションは、既存のコード(私の心の構造が問題を構成する方法を反映している)を最小限に変更しても機能しました。助けてくれてありがとう! – continuist