Я соединил эту функцию jQuery. Его целью является вычисление полей всех элементов img внутри div.article
, чтобы сбалансировать высоту изображения с базовой сеткой документа, которая составляет 20 пикселей. Чтобы соответствовать моей базовой сетке, каждая высота изображения должна быть кратна 20. Если это не так, например, высота одного изображения составляет 154 пикселя, функция добавляет поле img в 6 пикселов, чтобы восстановить баланс с сеткой базовой линии.
Функция работает правильно , поэтому мой актуальный вопрос: Поскольку я не программист, мне интересно, если мой код очень дрянной, хотя он работает, и если Итак, как можно улучшить код?
Код jQuery:
$('div.article img').each(function() {
// define line height of CSS baseline grid:
var line_height = 20;
// capture the height of the img:
var img_height = $(this).attr('height');
// divide img height by line height and round up to get the next integer:
var img_multiply = Math.ceil(img_height / line_height);
// calculate the img margin needed to balance the height with the baseline grid:
var img_margin = (img_multiply * line_height) - img_height;
// if calculated margin < 5 px:
if (img_margin < 5) {
// then add another 20 px to avoid too small whitespace:
img_margin = img_margin + 20;
}
// if img has caption:
if ($($(this)).next().length) {
// then apply margin to caption instead of img:
$($(this)).next().attr('style', "margin-bottom: " + img_margin + "px;");
} else {
// apply margin to img:
$(this).attr('style', "margin-bottom: " + img_margin + "px;");
}
});
Пример HTML-кода, img с подписью:
<div class="article">
<!-- [...] -->
<p class="image">
<img src="http://example.com/images/123.jpg" width="230" height="154" alt="Image alt text goes here" />
<small>Image Caption Goes Here</small>
</p>
<!-- [...] -->
</div>
Пример HTML-кода, img без заголовка:
<div class="article">
<!-- [...] -->
<p class="image">
<img src="http://example.com/images/123.jpg" width="230" height="154" alt="Image alt text goes here" />
</p>
<!-- [...] -->
</div>
Редактировать: уточненный код на основе предложений Russ Cam:
var line_height = 20;
var min_margin = 5;
$('div.article img').each(function() {
var $this = $(this); // prefixed variable name with $ to remind it's a jQuery object
var img_height = $this.height();
var img_margin = ((Math.ceil(img_height / line_height)) * line_height) - img_height;
img_margin = (img_margin < min_margin)? img_margin + line_height : img_margin;
if ($this.next().length) {
$this.next().css({'margin-bottom' : img_margin + 'px'});
} else {
$this.css({'margin-bottom' : img_margin + 'px'});
}
});