Слайдшоу на JavaScript. Часть III
В данном пункте, будет затронута одна из самых проблематичных тем; - позиционирование картинок в слайд-шоу.
В предыдущих Слайд-шоу на JavaScript и Слайд-шоу на JavaScript. Часть II, были раскрыты многие аспекты разработки слайд-шоу на JavaScript. Однако все они имели один большой недостаток - абсолютное позиционирование слайд-шоу. То есть, необходимо было задавать координаты размещения слайд-шоу. В этом случае, приводится пример, как сделать относительное позиционирование.
Сам скрипт вынесен в отдельный файл slide.js .
Привожу код файла index.html и slide.js:
Код файла index.html:
Code
<style>
.pic { position: absolute; top: 0px; left: 0px; display: none }
</style>
<table width="100%" height="100%">
<tr valign="center">
<td width="100%" height="100%" align="center">
<div id="after_div">
<img id="after" src="" width="300" height="220">
</div>
<div id="before_div" class="pic">
<img id="before" src="demo/london.jpg" width="300" height="220">
</div>
</td>
</tr>
</table>
<script src="slide.js"></script>
<script>
document.getElementById("after_div").style.display = "block";
StartSlideShow();
window.onresize = function () {
WinResize();
}
window.onload = function() {
WinResize();
}
function WinResize() {
pos = findPos(document.getElementById("after"));
document.getElementById("before_div").style.top = pos[1] + "px";
document.getElementById("before_div").style.left = pos[0] + "px";
document.getElementById("before_div").style.display = "block";
}
</script>
Код файла slide.js:
Code
var pic = new Image();
var timer;
var first_pic = 100;
var second_pic = 0;
var sec = 0;
var currentPictureId = 0;
var slideshow_started = false;
var disabled_opacity = false;
var step_opacity = 1;
var step_time = 200;
// Путь к слайдам
var picture_dir = "demo/";
// Список слайдов
var pictures = new Array("london.jpg", "berlin.jpg", "amsterdam.jpg", "venice.jpg", "milan.jpg");
var total_pictures = pictures.length;
var before = document.getElementById("before_div");
var after = document.getElementById("after_div");
function changePicture(pictureId) {
if (currentPictureId == pictureId || first_pic != 100) {
ShowNextImage();
return false;
}
currentPictureId = pictureId;
pic = new Image();
pic.src = picture_dir + pictures[pictureId];
timer = setTimeout("checkLoading()", 1000);
}
function checkLoading() {
if (pic.complete == true) {
if (disabled_opacity == true) {
document.getElementById("before").src = pic.src;
if (slideshow_started == true) {
ShowNextImage();
}
} else {
changeSlide();
document.getElementById("after").src = pic.src;
timer = setTimeout("changeSlide()", step_time);
}
} else {
timer = setTimeout("checkLoading()", 1000);
}
}
function changeSlide() {
first_pic = first_pic - step_opacity;
second_pic = second_pic + step_opacity;
before.style.opacity = first_pic / 100;
after.style.opacity = second_pic / 100;
after.style.filter = "alpha(opacity=" + second_pic + ")";
before.style.filter = "alpha(opacity=" + first_pic +")";
if (second_pic > 99) {
clearTimeout(timer);
document.getElementById("before").src = pic.src;
before.style.opacity = 100;
before.style.filter = "alpha(opacity=0)";
after.style.opacity = 0;
after.style.filter = "alpha(opacity=100)";
first_pic = 100;
second_pic = 0;
if (slideshow_started == true) {
ShowNextImage();
}
} else {
timer = setTimeout("changeSlide()", step_time);
}
}
function ShowNextImage() {
var pictureId = Math.floor(Math.random()*total_pictures);
changePicture(pictureId);
}
function StartSlideShow() {
if (slideshow_started == false) {
slideshow_started = true;
ShowNextImage();
} else {
slideshow_started = false;
}
}
function findPos(obj){
var posX = obj.offsetLeft;
var posY = obj.offsetTop;
while(obj.offsetParent){
if(obj == document.getElementsByTagName('body')[0]) {
break
} else {
posX=posX + obj.offsetParent.offsetLeft;
posY=posY + obj.offsetParent.offsetTop;
obj = obj.offsetParent;
}
}
var posArray=[posX,posY]
return posArray;
}
А теперь по порядку. Если, Вы уже заметили, слайд-шоу позиционируется в таблице. Единственные изменения, которые необходимо сделать при установке скрипта к Вам на сайт - изменить имена картинок и указать путь к папке с картинками:
// Путь к слайдам
var picture_dir = "demo/"; // Список слайдов
var pictures = new Array("london.jpg", "berlin.jpg", "amsterdam.jpg", "venice.jpg", "milan.jpg");
var total_pictures = pictures.length;
Для управления скорости смены картинок, Вы можете манипулировать следующими переменными:
var step_opacity = 1;
var step_time = 200;
Фактически позиционирование реализовывается достаточно просто.
Первая картинка размещается где угодно, а вторая налаживается на неё. При этом происходит поиск позиции (координат) первой картинки при помощи функции findPos. Данная функция возвращает абсолютные координаты любого объекта на экране. Уверен, что она будет вам полезна.
Так же необходимо заметить, что при помощи функции WinResize(), которая привязана к событию window.onresize - мы избегаем проблемы, когда при изменении размеров окна, вторая картинка остается на предыдущем месте, то есть не смещается относительно первой картинки.