J'ai bricolé cette fonction jQuery. Son but est de calculer les marges de tous les éléments img à l'intérieur div.article
afin d'équilibrer la hauteur de l'image avec la grille de base du document, qui est de 20 px. Pour correspondre à ma grille de ligne de base, chaque hauteur d'image doit être un multiple de 20. Si ce n'est pas le cas, par exemple, La hauteur d'une image est de 154 px, la fonction ajoute une marge de 6 px à l'img, de sorte que l'équilibre avec la grille de ligne de base est restauré.Mon code jQuery fonctionne, mais est-il très moche du point de vue du programmeur?
La fonction fonctionne correctement, donc ma question réelle est: Puisque je ne suis pas un programmeur, je me demande si mon code est très merdique bien qu'il travaille, et si oui, comment le code pourrait être amélioré?
Le code 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;");
}
});
exemple de code HTML, img avec la légende:
<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>
exemple de code HTML, img sans légende:
<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>
Edit: Code raffiné basé sur les suggestions de 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'});
}
});
+1 pour l'utilisation de $ this - le préfixe. Je me sentais toujours sale quand je mettais en cache des directives jQuery, parce que cela signifiait perdre la lisibilité de jQuery. Votre pratique répond à cela! –
La réponse la plus complète, je voudrais ajouter: supprimer les commentaires inutiles sur ce que fait le code (par exemple: '// si la marge calculée <5 px'). J'ai dû lire le 4ème commentaire pour comprendre à quoi servait ce morceau de code. –
+1 ressemble à une liste décente pour moi :) –