私は jQuery ベースのソリューションに取り組んできました — おそらく gilly3 によって投稿されたものほどエレガントではありません;) また、遅くて少し肥大化しています...
私の秘訣は<div>
、セクションに 2 つの s を追加することです。セクションは左にフロートされ、幅 0 の非表示の幅になります。画像と同じ寸法を持つ指定されたゴースト要素である div の 1 つは、別の div の下に配置されます。それが指定の高さスペーサーです。このスクリプトは、while ループを使用して、ゴースト要素が親セクション要素の下部に到達したかどうかを確認します。これが発生していない場合は、条件が満たされるまで高さスペーサーの高さを 1 ずつ増やします。
私が使用したマークアップは次のとおりです。HTML5 属性data-bottom-image
を使用して、画像を下に浮かせるセクションを識別しています。もちろん、正しいセクション要素をどのように選択したいかによっては、必須ではありません。
<section id="c1" data-bottom-image>
<h2>...</h2>
<p>...</p>
<img src="http://placehold.it/250x100" />
</section>
そしてjQueryスクリプト:
$(function () {
$("section > img:last-child").each(function () {
// Offset image based on the bottom and right padding of parent
var $par = $(this).parent();
$(this).css({
bottom: $par.css('padding-bottom'),
right: $par.css('padding-right')
});
});
// Function: adjust height of height-spacer, pixel by pixel
function adjustHeightSpacer($par, $hs, $is) {
// Stretch height spacer
$hs.height(0);
$hs.css({
height: $par.find("img").position().top - parseInt($par.css('padding-top'))
});
// Adjust height spacer
while($par.height() - $is.height() > $is.position().top - parseInt($par.css('padding-top'))) {
$hs.height("+=1");
}
while($par.height() - $is.height() < $is.position().top - parseInt($par.css('padding-top'))) {
$hs.height("-=1");
}
};
$("section[data-bottom-image]").each(function() {
// Append two spacers:
$(this).prepend('<div class="ghost height-spacer" /><div class="ghost image-spacer" />')
var $hs = $(this).find(".height-spacer"),
$is = $(this).find(".image-spacer");
// Adjust image spacer dimension
$is.css({
height: $(this).find("img").height(),
width: $(this).find("img").width()
});
// Adjust height spacer
adjustHeightSpacer($(this), $hs, $is);
});
$(window).resize($.debounce(250,function() {
$("section[data-bottom-image]").each(function() {
// Adjust height spacer
adjustHeightSpacer($(this), $(this).find(".height-spacer"), $(this).find(".image-spacer"));
});
}));
});
そして、これが実際のフィドルです: http://jsfiddle.net/teddyrised/xmkAP/5/