2

我在下面有以下代码用于幻灯片放映。我想优化此代码,并希望与 SO 联系以尝试获得一些帮助。我知道我正在使用的这些选择器正在工作,但我很好奇是否有更有效的方式来编写我的画廊。我经常写这些相同的情况,并想知道其他人是否觉得我做得对。

我只是在寻找有关格式的总体建议,以及我的 JS 性能优化以及 DRY 代码方法。看看其他人如何编写类似的代码有助于我磨练自己的技能。

标记

  <a id="next">next</a><a id="prev">prev</a>
    <ul id="thumbnails">
      <li><a href="/path/to/src"><img src="50x50.jpg"></a></li>
      <li><a href="/path/to/src"><img src="50x50.jpg"></a></li>
      <li><a href="/path/to/src"><img src="50x50.jpg"></a></li>
    </ul>
   <img id="main-image" src="path/to/src">         

JS

$("#thumbnails a").click(function(e){      
  e.preventDefault();

  var $this = $(this),
      thesrc  = $this.attr('href'),
      desc = $this.attr('alt');    

  $this.addClass('current');
  $this.parent().siblings().children('a').removeClass('current');

  $("#main-image").fadeOut(400, function(){
    $('<img/>').attr('src', thesrc).load(function(){
      $("#main-image").attr('src', this.src).fadeIn(400);
      $("#caption").text(desc);
    });
  });                            
});

$("#next").click(function(e){
   e.preventDefault();     
   $('.current').parent().next().children('a').trigger('click');
});                                                                          

$("#prev").click(function(e){
  e.preventDefault();       
  $('.current').parent().prev().children('a').trigger('click');      
});      
4

2 回答 2

1

jsBin 演示

HTML:

  <p>
     <a id="prev">prev</a>
     <a id="next">next</a>    
  </p>
        
   <div id="thumbnails">
      <img src="1.jpg">
      <img src="2.jpg">
      <img src="3.jpg">
   </div>
  
  <div id="main-img-container">
       <div id="main-img"></div>
  </div>

基本的 CSS:

#thumbnails img{
  height:30px;
}
div#main-img-container{
  height:200px;
  background: #eee url(loading_transparent.gif) no-repeat center center;  
}
div#main-img{
  width:100%;
  height:100%;
  background: transparent no-repeat center center;
  background-size:cover; 
}
#next, #prev{
  cursor:pointer;
  background:#eee;
  padding:4px 10px;
  -webkit-border-radius:5px;
          border-radius:5px;
}

jQuery:

var $imgs = $('#thumbnails img');
var imgsN = $imgs.length;
var $main = $('#main-img');
var c = 0; // a 'current' counter

function loadImage(){
  c= c===-1? c=imgsN-1 : c%imgsN; 
  var getSrc = $imgs.eq(c).attr('src');  
  $main.stop().fadeTo(200, 0.7, function(){ // just to make loading a bit visible :)
     $('<img>').attr('src', getSrc).load(function(){
       $main.css({backgroundImage: 'url('+ this.src +')'}).fadeTo(300,1);        
     });
  });  
}
loadImage(); // first kick! :)

$imgs.click(function(){  
  c = $(this).index(); 
  loadImage();  
});

$('#prev, #next').click(function(){
  var myID = this.id=='next' ? c++ : c--;
  loadImage();
}); 
于 2012-09-24T22:08:38.910 回答
0

优化和美化:

e.preventDefault()
var $this = $(this),
    thesrc = $this.attr('href'),
    desc = $this.attr('alt')
    $this.addClass('current')
    $this.parent()
        .siblings()
        .children('a')
        .removeClass('current')
    $("#main-image").fadeOut(400, function () {
        $('<img/>').attr('src', thesrc)
            .load(function () {
            $("#main-image").attr('src', this.src)
                .fadeIn(400)
            $("#caption").text(desc)
        })
    })
    })
    $("#next").click(function (e) {
        e.preventDefault()
        $('.current').parent()
            .next()
            .children('a')
            .trigger('click')
    })
    $("#prev").click(function (e) {
        e.preventDefault()
        $('.current').parent()
            .prev()
            .children('a')
            .trigger('click')
    })
于 2012-09-24T20:58:35.997 回答