我的jQuery代码正在运行,但从程序员的角度来看它是非常糟糕的吗?

uni*_*ers 3 javascript jquery vertical-rhythm

我拼凑了这个jQuery函数.它的目的是计算内部所有img元素的边距,div.article以便平衡图像的高度与文档的基线网格,为20像素.为了匹配我的基线网格,每个图像高度应为20的倍数.如果不是这种情况,例如一个图像的高度为154像素,则该函数会为img添加6 px的余量,以便与基线平衡网格已恢复.

该函数正常工作,所以我的实际问题是:由于我不是程序员,我想知道我的代码是否非常糟糕,虽然它正在工作,如果是这样,代码如何改进?

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;");
    }
});
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

编辑:基于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'});
    }
});
Run Code Online (Sandbox Code Playgroud)

Rus*_*Cam 12

我可以推荐一些改进

1.cache $(this)each()局部变量中

$('div.article img').each(function() {

    var $this = $(this); // prefixed variable name with $ 
                         // to remind it's a jQuery object

    // ....

   if ($this.next().length) {

   // ....

   }

});
Run Code Online (Sandbox Code Playgroud)

2.而不是设置attr('style'),使用css()命令

3.不需要这样做

$($(this))
Run Code Online (Sandbox Code Playgroud)

虽然它不会破坏jQuery,但是将jQuery对象传递给另一个jQuery对象是不必要的.

4.使用$(this).height()$(this).outerHeight()获取浏览器中元素的高度

5.没有jQuery特定,但可以使用三元条件运算符来分配此值

// if calculated margin < 5 px:
if (img_margin < 5) {

    // then add another 20 px to avoid too small whitespace:
    img_margin = img_margin + 20;  
}
Run Code Online (Sandbox Code Playgroud)

// if calculated margin < 5 px then add another 20 px 
// to avoid too small whitespace
img_margin = (img_margin < 5)? img_margin + 20 : img_margin;  
Run Code Online (Sandbox Code Playgroud)

正如亚历克斯在评论中指出的那样,我还会删除那些仅仅重复代码告诉你的多余评论.即使这是调试脚本,在我看来,它们会降低可读性,注释应仅用于提供读取代码时不具备的细节.

  • +1使用$ this - 前缀.缓存jQuery指令时我总觉得很脏,因为这意味着失去了jQuery的可读性.你的练习解决了这个! (2认同)