2016-12-17 8 views
2

イメージの上を移動するたびにウィンドウを作成する必要があります。この制約は、ウィンドウが定義されているため繰り返されるべきではありません。 10個の類似したウィンドウの代わりに10個の画像がある場合、画像の境界線として機能するように、幅の高さと位置(左右、上、下)を動的に変更する必要があります。境界効果はCSSを使用して取得できますが、この動的境界効果が必要なその他の要件があります。JQueryを使ってホバー上のdivでイメージをラップする

<div> <!-- This is the border div --> 
    <div id="top" class="imageBorder" style="display: block; width: 105px">Top</div> 
    <div id="left" class="imageBorder" style="display: block; width: 105px"></div> 
    <div id="right" class="imageBorder" style="display: block; width: 105px"></div> 
    <div id="bottom" class="imageBorder" style="display: block; width: 105px">Bottom</div> 
</div> 

このdivはウィンドウとして使用されます。私がどんなイメージにでも乗るときはいつでも、このdivはそれを囲むべきです。私はこのdivを一度にコピーして各画像に関連付けることは望ましくありません。

JSFiddle

enter image description here

+1

そのウィンドウのdivには4つのdivがあります。 '#top'と'#bottom'は4つのボーダーすべてを持っていますが、 '#left'と'#right'は1つのボーダーしか持っていません。 **動的な**フレームを作成できないコードはありますか?私が見ているのは、HTMLと不活性CSSです。 – zer00ne

+0

div内の画像はどこにありますか?これは基本的にコンテナです。少しjQueryが処理できないものはありません。画像にクラスを追加し、イベントリスナーを使用し、 'this'を使用してdivコンテナにアタッチします。なぜ、コンテナを定義してinnerHtml要素を削除しないのですか?内側の要素はすべて同じですので、それらを削除するIMHO – yardpenalty

+1

あなたはホバリングされたイメージ上のウィンドウをしたいですか?または、ホバリングされた画像をウィンドウの最下部に表示したいですか? –

答えて

2

画像がサムネイルではなく、彼らのサイズが異なる場合は、あなたが選択した/アクティブな画像の幅と高さに基づいて、単一のコンテナの幅と高さを動的にすることができます。

HTML:

<div id="container"></div> 

<img class="img" src="http://www.so.com/390px-Amtgard-300x200.jpg" /> 
<img class="img" src="http://www.so.com/390px-Amtgard-300x200.jpg" /> 
<img class="img" src="http://www.so.com/390px-Amtgard-300x200.jpg" /> 

CSS

#container{ 
    position: absolute; 
    width: 100px; 
    height: 100px; 
    background-color: red; 
    z-index: 2; 
    display:none; 
} 
.img{max-width: 80px; max-height: 80px; z-index: 10000;} 

JS/jQueryの

$(document).ready(function(){ 
    $(".img").hover(function(){ 
     //on mouseenter 
     var img = $(this); 
     img.addClass("this"); 
     var c = $("#container"); 
     //change container width/height based on image size 
     c.css({width:img.outerWidth() + 20, height: img.outerHeight + 10}); 
     //position container 
     c.css({top:img.offset().top - 10, left: img.offset().left - 10, position:'absolute'}).fadeIn("fast"); 
     //reset other images z-index 
     $(".img:not(.this)").css("zIndex","1"); 
    }, function(){ 
    //on mouseleave 
    if(!$("#container").css("display","none")) 
     $("#container").fadeOut("fast");    
     $(".img").css("zIndex","4");     
     $(this).removeClass("this"); 
}); 
}); 

JSFIDDLE

説明

jQueryのはそこに最も強力なJavaScriptライブラリですが、私はあなたがそれはあなたのjavascriptのスキルを磨くと同様にあなたのUIのスキルを向上させるとして独占的にこれを使用する方法を学ぶお勧めします。通常、私はjavascript/jQueryを利用できるように、クラスとIDを使用してHTML要素を定義します。

.hover

私は詳しくhereに説明されている.hoverイベントハンドラを使用しています。このイベントハンドラを使用すると、単一のハンドラを使用してmouseentermouseleaveを定義することができます。最初の匿名関数はmouseenterを処理し、2番目の関数はmouseleaveを処理します。

の.css

このjQueryのメソッドを使用すると、その場であなたのhtmlのCSSにpractiallyあなたが欲しいものを行うことができます。

注: outerWidth()、outerHeight()またはwidth()、height()の結果は異なります。要素がbox-sizing:border-boxまたはborderのいずれであるかに依存するものを使用する。

の.css( "のZIndex"、 "4")

これはその場で編集CSS z-indexのjQueryの方法です。これは、#containerがアクティブではない他のイメージをオーバーラップさせる方法です。

$(この)

あなたは$(this)が貴重になっCSSクラスを持つイベントハンドラを(私はあなたができるだけ多くを使用する方法を学ぶお勧め)を使用。これにより、イベントハンドラ内のクラスから要素を分離することができます。

.addClass( "本")

addClass()removeClass()は、ユーザー体験を向上させることができる方法です。 私はこれがより長くするための要素を分離するために迅速かつ簡単な方法である私は、ボタンを無効にするか、それらを非表示にする必要がありhiddendisabledなど

.NOT(「本)

で、この多くを使用しますイベントハンドラは、スコープ内にある。私は、ドロップダウンリストで別名選択リストを、この多くを使用しています。いずれかと

フェードイン、フェードアウト(「速い」)(「遅い」)

使用このjQueryのメソッドhtml要素には、display: noneというプロパティがあります。それはあなたが要素が

あなたはそれがイベント処理に来るときを理解しておく必要があります一つのことを閉じるにはdisplay: none - block or inline

間のトグルオーバーアップグレードがある表示されているかどうかを切り替えることができますし、それが伝播されます!イベントハンドリングを処理する場合、イベントリスナーは次のイベントにリスンします:

A:イベントのタイプ ie:on( 'click')、on( 'submit')、on( 'mouseenter' )、( '変更')などに...

B:要素 すなわちのタイプ:クラス、またはhtml要素(すなわち:DIV、入力を選択し、ボタンなど。 。)

これは、要素が動的に作成される場合、特に誤った結果を引き起こす可能性があります。

イベントの伝播、イベントのバブリング、イベントの終了についてよく知っておいてください。

+0

赤い枠線は他の画像よりも上にする必要があります。ありがとう –

+0

私はそれを今得ました。コンテナのサイズが動的である必要がありますか? – yardpenalty

+0

私の場合は、画像サイズを一定に保ちます。したがって、ボックスのサイズは同じにすることができます。 –

1

私は

https://jsfiddle.net/2fmo1xjm/3/

$("div > img").hover(function() 
{ 
    $(this).before(`<div id='main_window'><div id="top" class="imageBorder" style="display: block; width: 105px">Top</div> 
<div id="left" class="imageBorder" style="display: block; width: 105px"></div>`); 
    $(this).after(`<div id="right" class="imageBorder" style="display: block; width: 105px"></div> 
<div id="bottom" class="imageBorder" style="display: block; width: 105px">Bottom</div> 
</div>`); 
}, 
function() 
{ 
    $("#top, #left, #bottom, #right").remove(); 
}); 

したいウィンドウを得るためにそれで遊んで、そしてもちろん)(jQueryの.hover().before().afterを使用それをより良くする。

更新:

使用.wrap()代わりに。必要に応じて上部ヘッダーと下部ヘッダーがあります。

https://jsfiddle.net/2fmo1xjm/9/

+0

素敵なハック。名声。ボーダーdivがホバーに表示されるたびに、拡大する代わりに近隣のimgにオーバーラップさせることができます。 @A。 Lau –

+0

なぜ.before()と.after()が使用されていますか? –

+0

'.before()'はimgの前に挿入するために使われます。 '.after()'はそれの後ろに挿入するために使われます。もし重複するようなことをしたいのであれば、 '.replaceWith()'と 'replaceAll()'はあなたにとってもっと良いかもしれません。 –

1

境界線divの最終的な外観や動作についてはわかりませんが(必要に応じて調整できます)、これが役立ちます。私は

$("img").hover(
 
    function() { 
 
    $('.border-div').css('display','block'); 
 
    
 
    $('.border-div').css('width',$(this).width()+5+'px'); 
 
    $('.border-div').css('height',$(this).height()+5+'px'); 
 

 
     $('.border-div').css('left',$(this).offset().left-1.2+'px'); 
 
    $('.border-div').css('top',$(this).offset().top-2+'px'); 
 
     
 
    }, 
 
    function() { 
 
    $('.border-div').css('display','none'); 
 
    } 
 
);
.imageStyle{ 
 
    width:100px; 
 
    height:100px; 
 
    margin: 3px 3px 3px 3px; 
 
    padding: 2px 2px 2px 2px; 
 
    box-sizing:border-box; 
 
    cursor:pointer; 
 
} 
 

 
#top{ 
 
    border-radius: 3px 3px 0px 0px;   
 
\t border-top: 1px solid #333333;   
 
\t border-right: 1px solid #333333;   
 
\t border-left: 1px solid #333333;   
 

 
} 
 

 
#left{ 
 
    border-left: 1px solid #333333;   
 
\t width: 5px; 
 
} 
 

 
#right { 
 
    border-right: 1px solid #333333;   
 
    width: 5px; 
 
} 
 

 
#bottom { 
 
    border-radius: 0px 0px 3px 3px;   
 
\t border-bottom: 1px solid #333333;   
 
\t border-right: 1px solid #333333;   
 
\t border-left: 1px solid #333333; 
 
position:absolute; 
 
width:100%; 
 
bottom:0px; 
 

 
} 
 

 
img { 
 
    display:block; 
 
    z-index:9; 
 
    position:relative; 
 
} 
 
.border-div { 
 
    position:absolute; 
 
    display:none; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<div> 
 
    <img src="https://2.bp.blogspot.com/-zasBPCmkmm4/V4S6jz0bOeI/AAAAAAAAHAI/qq7mYlCBjvsE4NWKWxyYi3IV9qHfpXgVwCLcB/s1600/seamlessly-repeating-background-with-abstract-composition.jpg" class="imageStyle"> 
 
</div> 
 
<div> 
 
    <img src="https://2.bp.blogspot.com/-zasBPCmkmm4/V4S6jz0bOeI/AAAAAAAAHAI/qq7mYlCBjvsE4NWKWxyYi3IV9qHfpXgVwCLcB/s1600/seamlessly-repeating-background-with-abstract-composition.jpg" class="imageStyle"> 
 
</div> 
 
<div> 
 
    <img src="https://2.bp.blogspot.com/-zasBPCmkmm4/V4S6jz0bOeI/AAAAAAAAHAI/qq7mYlCBjvsE4NWKWxyYi3IV9qHfpXgVwCLcB/s1600/seamlessly-repeating-background-with-abstract-composition.jpg" class="imageStyle"> 
 
</div> 
 
<div> 
 
    <img src="https://2.bp.blogspot.com/-zasBPCmkmm4/V4S6jz0bOeI/AAAAAAAAHAI/qq7mYlCBjvsE4NWKWxyYi3IV9qHfpXgVwCLcB/s1600/seamlessly-repeating-background-with-abstract-composition.jpg" class="imageStyle"> 
 
</div> 
 

 
<div class="border-div"> <!-- This is the border div --> 
 
<div id="top" class="imageBorder" style="display: block;">Top</div> 
 
<div id="left" class="imageBorder" style="display: block; "></div> 
 
<div id="right" class="imageBorder" style="display: block; "></div> 
 
<div id="bottom" class="imageBorder" style="display: block;">Bottom</div> 
 
</div>

重要...すべての作品を作るために、CSSにいくつかの変更を加えました:そう...ボーダーのdivは、画像の下に配置され、ホバー上の問題を避けるために、があるかもしれませんいくつかの点滅(画像と境界divの重複が発生した場合)。

関連する問題