2015-04-30 1 views
1

У меня есть слайд-шоу, которое вытаскивает его первое изображение из div, а затем вытягивает остальную часть изображений из массива элементов списка. Я следую учебному пособию точно с . Карманный справочник по JavaScript от Burdette (печать в 2010 году), и, хотя все остальное работает, я не могу получить ни одну из картин после того, как первый центрирован или выровнен по-разному. Они плавают влево и на вершину дива.JS и CSS Центрирование изображений слайд-шоу

HMTL:

<!DOCTYPE html> 
<hmtl class="no-js"> 

<head> 
    <title>Slideshow</title> 
    <link rel="stylesheet" href="slideshow.css" type="text/css" /> 

    <script type="text/javascript"> 
    (function(d, c) { d[c] = d[c].replace(/\bno-js\b/,"js";})(document.documentElement, "className"); 
    </script> 

</head> 


<body> 
     <div id="slideshow"> 

      <div class="slides"> 
       <img src="picture01.jpg" width="450" height="336" alt="stuff" /> 
      </div> 

      <ul> 
       <li><a href="picture02.jpg" data-size="350x263"</li> 
       <li><a href="picture03.jpg" data-size="350x263"</li> 
       <li><a href="picture04.jpg" data-size="350x263"</li> 
      </ul> 

     </div> 

    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.1/jquery.min.js" type="text/javascript"> 
    </script> 

    <script src="slideshow.js" type="text/javascript"> 
    </script> 


</body> 

</hmtl> 

CSS:

#slideshow { 
    background-color: #103f1c; 
    width:500px; 
    height:450px; 
    margin-left: auto; 
    margin-right: auto; 
    top:0px; 
    position: relative; 
} 

#slideshow .slides { 
    position: relative; 
    margin-left: auto; 
    margin-right: auto; 
    width: 450px; 
} 

#html.js #slideshow .slides img{ 
    position: absolute; 
    margin-left: auto; 
    margin-right: auto; 
} 

#slideshow .next, 
#slideshow .prev { 
    position: absolute; 
    top: 50%; 
    margin-top: -0.5em; 
    width: 40px; 
    font-size: 32px; 
    text-decoration: none; 
} 

#slideshow .next{ 
    right: -50px; 
    padding-left:10px; 
} 

#slideshow .prev { 
    left:-50px; 
    padding-right: 10px; 
    text-align: right; 
} 

JS:

(function($) { 

    // Include utility jQuery plug-ins 

    $.fn.tallest = function(outer, margins) { 
     var fn = outer ? "height" : "outerHeight"; 
     return Math.max.apply(Math, $.map(this, function(el) { 
      return $(el)[fn](margins); 
     })); 
    }; 

    $.fn.widest = function(outer, margins) { 
     var fn = outer ? "width" : "outerWidth"; 
     return Math.max.apply(Math, $.map(this, function(el) { 
      return $(el)[fn](margins); 
     })); 
    }; 

    // Declare initial variables 

    var slideshow = $("#slideshow"); 
    var slides = slideshow.find(".slides"); 
    var currentImageIndex = 0; 

    // Create images from the link list 

    slideshow.find("ul a").each(function() { 

     var link = $(this); 
     var size = link.attr("data-size").split("x"); 

     $("<img />").attr({ 
      src : link.attr("href"), 
      width : size[0], 
      height : size[1], 
      alt : link.text()   
     }).hide().appendTo(slides); 
    }); 

    // Collect all images in one node set and hide the list 

    var images = slides.find("img"); 
    slideshow.find("ul").hide(); 

    // Resize slides <div> to hold the largest images 

    var slidesWidth = images.widest(); 
    var slidesHeight = images.tallest(); 

    slides.css({ 
     width : slidesWidth, 
     height : slidesHeight 
    }); 

    // Center each image 

    images.each(function() { 
     var image = $(this); 
     image.css({ 
      left: slidesHeight/2 - image.width()/2, 
      top: slidesHeight/2 - image.height()/2, 
     }); 
    }); 

    // Save a reference to the first image 

    var activeImage = images.eq(currentImageIndex); 

    // The function to show the next or previous image 

    function showImage(newIndex) { 
     currentImageIndex = newIndex >= images.length ? 0 : newIndex; 
     currentImageIndex = currentImageIndex < 0 ? images.length - 1 : currentImageIndex; 
     activeImage.fadeOut(0); 
     activeImage = images.eq(currentImageIndex).fadeIn(150); 

    } 

    // Start timer to cycle through images 

    var interval = setInterval(function() { 
     showImage(currentImageIndex + 1); 
    }, 5000); 

    // Create next and previous controls 

    $('<a href="#" class="next" style="color:white">\u232A</a>').appendTo(slides).bind("click", +1, onClick); 
    $('<a href="#" class="prev" style="color:white">\u2329</a>').appendTo(slides).bind("click", -1, onClick); 

    // The event handler for the controls 

    function onClick(event) { 
     event.preventDefault(); 
     clearInterval(interval); 
     showImage(currentImageIndex + event.data); 
    } 

})(jQuery); // Self-invoking function executes automatically 
+0

Почему вы добавить этот кусок кода 'images.each (функция() { вар изображение = $ (это); image.css ({ слева slidesHeight/2 - image.width()/2, top: slidesHeight/2 - image.height()/2, }); }); '? – IvanJ

+0

Из вашего css '# html.js #slideshow .slides img' remove' position: absolute'. Таким образом вам не нужно указывать свойство 'top' и' left' в javascript. – IvanJ

+0

вы выложили много кода. добавьте jsfiddle или аналогичный –

ответ

1

Основная проблема здесь заключается в вашем CSS:

#html.js #slideshow .slides img{ 
    position: absolute; 
    margin-left: auto; 
    margin-right: auto; 
} 

Маржа: авто; будет работать только с объектами с определенной шириной. Поскольку изображение является замененным встроенным блоком, реальной ширины не существует. Это усугубляется тем фактом, что вы позиционировали его абсолютно, что изменяет способ работы полей - элемент всегда будет поднимать свою позицию относительно определенного родителя и применять поля после этого за пределами потока, поэтому авто будет не имеют значения.

Первый шаг - удалить абсолютное позиционирование на изображении, здесь это не полезно.

По умолчанию изображения представляют собой тип встроенного блока, поэтому просто добавьте «text-align: center;» селектор «#slideshow .slides» будет центрировать изображения.

С другой стороны, если мы просто хотим, чтобы редактировать изображения и заставить их центрировать себя, изменить вышеупомянутый блок:

#html.js #slideshow .slides img{ 
    display:block; 
    margin-left: auto; 
    margin-right: auto; 
} 

и все должно выстраиваться как вы хотели.

+0

Добавление 'text-align: center;' to '#slideshow .slides' отлично работает. Спасибо! –

Смежные вопросы