2011-01-12 20 views
2

ターゲット要素がどこでどこに移動するかにかかわらず、別の要素の上に配置する必要があるHTML/DOM要素があります。1つの要素を別の要素の上に置く

さまざまな(そして残念な)理由から、単純なCSSの相対的な配置ではこれを行うことができません。再配置したい要素は、対象要素の親の直下の子にすることはできません。

jQueryのoffset()関数を使用して、要素をターゲット要素に簡単に配置できます。ただし、ターゲット要素が移動すると、再配置された要素は追跡されません。ブラウザの寸法を変更することは、これが起こりうる1つの方法(そして私が心配する主な方法です)です。レイアウトが変更され、ターゲット要素のオフセットが変更されます。ここで

は私の文書の大まかな構造です:

<div id="common-ancestor"> 
    <div id="to-reposition-container"> 
    <div id="to-reposition"></div> 
    </div> 
    <div id="some-stuff-in-between"></div> 
    <div id="target-container"> 
    <div id="target"></div> 
    <div> 
</div> 

私は#to-repositionが視覚的にDOMツリーを変更することなく、#targetの上に置くことにしたいです。私は、#targetを自然界の外に#target-containerの位置に置くことは絶対にできません。

CSS、JavaScript、および/またはjQueryを使用するソリューションにはオープンしています。

+0

おそらく、共通の祖先をアンカーとして使用できます。しかし、その解決策は具体的なレイアウトに依存しています。私はあなたがレイアウトに関する詳細を提供すべきだと思います。 –

+0

いくつかのサンプルコードを提供し、あなたが試したことをお見せしてください。 – nedk

+0

@nedk:私がしたのは、jQueryの一度だけの再配置でした。 '$("#to-reposition ").offset($("#target ")。offset());'ページサイズが変更されるまでうまくいきました。 'target'のオフセットが変わったので、' to-reposition'のオフセットも変更しなければならないことに気付きました。 –

答えて

1

元のウィンドウサイズ変更イベントハンドラと同じ方法で要素の位置を変更する必要がありますが、フォントサイズの変更やスクロールなどの他のケースは処理できません。私はレイアウト変更イベントがないと思いますので、要素の移動のすべてのケースをキャッチしたい場合は、不幸にもタイマーイベントで常に再配置する必要があります。

+0

それは私が恐れていたものです。 :-P –

1

それはきれいではありませんが、それはトリックを行うだろう:

$(window).bind('resize',function() {/* reposition using offset */}); 

より良い方法は、(それはまた、シナリオをサイズ変更なしで動作しますので)供給のマークアップIで

をCSSを使用することです#common-ancestor { position: relative; }を設定して、#to-reposition-container &#target-containerをお互いの上に置くことをお勧めします。それは問題ではありません。

+2

注:このイベントの動作はブラウザによって異なります。イベントによってはイベントが連続的に発生するものもあれば、イベントが完了した後にイベントを発生させるイベントもあります。これにより、ユーザーエクスペリエンスが変わります。 –

+1

非常にtrue、イベントハンドラをデバウンスする場合、リサイズが最も効果的です –

+0

私は質問を更新しました。助けてくれることを望む。 –

関連する問題