私は流動的なレイアウトプロジェクトに取り組んでいます。ドキュメントに高さの固定DIVがあり、高さはすべて異なります。ブラウザのサイズ変更時にこれらのDIVの高さを比例的に変更する必要があります。これがマークアップです。
<body>
<div id="a" class="target"></div>
<div id="b" class="target"></div>
<div id="c" class="target"></div>
</body>
そしてCSS:
<style>
body { width: 90%; margin: 0 auto;}
.target { width:30%; float:left; margin:1.6%; cursor:pointer; }
#a { height: 200px; background-color: yellow;}
#b { height: 400px; background-color: green;}
#c { height: 600px; background-color: grey;}
</style>
簡単そうですね!主な条件は、i ターゲットDIVとそのIDの正確な量がわからないです。これが、.each(function())を使用している理由です。ここに私が書いたスクリプトがあります:
$(document).ready(function(){
//set the initial body width
var originalWidth = 1000;
/*I need to go through all target divs because i don't know
how many divs are here and what are their initial height*/
$(".target").each(function()
{
//get the initial height of every div
var originalHeight = $(this).height();
//get the new body width
var bodyWidth = $("body").width();
//get the difference in width, needed for hight calculation
var widthDiff = bodyWidth - originalWidth;
//new hight based on initial div height
var newHeight = originalHeight + (widthDiff / 10);
//sets the different height for every needed div
$(this).css("height", newHeight);
});
});
このスクリプトは、ユーザーがページを再読み込みしたときに完全に機能します。ユーザーがリロードせずにブラウザーのサイズを変更した場合、どうすれば同じ結果を動的に得ることができますか? $(window).resizeイベントリスナーを適用する必要があることはわかっています。しかし、問題は、DIVの初期の高さがイベント内で計算され、結果がエンドレスループのように大きくなることです。つまり、最終的な高さが巨大な進行で増減します。要らない!イベント関数の外でeach DIV初期高さ計算を作成し、イベント関数の中でこれらの高さを使用するにはどうすればよいですか?または、同じ結果を得る別のアプローチがあるかもしれませんか?
各divの元の高さを保存する必要があります。これを行うにはさまざまな方法があります。1つはハックです。DOMノード自体に格納します(より適切な方法はありますが、これはすばやく簡単です)。
$(document).ready(function(){
//set the initial body width
var originalWidth = 1000;
/*I need to go through all target divs because i don't know
how many divs are here and what are their initial height*/
function resize() {
//This will only set this._originalHeight once
this._originalHeight = this._originalHeight || $(this).height();
//get the new body width
var bodyWidth = $("body").width();
//get the difference in width, needed for hight calculation
var widthDiff = bodyWidth - originalWidth;
//new hight based on initial div height
var newHeight = this._originalHeight + (widthDiff / 10);
//sets the different height for every needed div
$(this).css("height", newHeight);
}
$(".target").each(resize);
$(document).resize(function(){
$(".target").each(resize);
});
});
サイズ変更機能をまとめ、ウィンドウサイズ変更イベントをサブスクライブします。
$(document).ready(function(){
//set the initial body width
var originalWidth = 1000;
resizeTargets();
$(window).resize(resizeTargets);
});
function resizeTargets()
{
$(".target").each(function()
{
//get the initial height of every div
var originalHeight = $(this).height();
//get the new body width
var bodyWidth = $("body").width();
//get the difference in width, needed for hight calculation
var widthDiff = bodyWidth - originalWidth;
//new hight based on initial div height
var newHeight = originalHeight + (widthDiff / 10);
//sets the different height for every needed div
$(this).css("height", newHeight);
});
}
jqueryでバインドできるresizeイベントを見てください。
.dataを使用して、divの初期サイズを$ .each関数内に格納します
$(this).data('height', $(this).height());
$(this).data('width', $(this).width());
後でサイズ変更コールバック内で古いサイズを取得できます
var old_height = $(this).data('height');
var old_width = $(this).data('width');
お役に立てれば