Como criar um controle deslizante de imagem com javascript

Existem muitos controles deslizantes de imagem na Internet. A maioria deles é escrita por jQuery. Eu só quero aprender JS e ter um melhor entendimento dele, então eu uso javascript para completá-lo.

você pode encontrar a demonstração aqui:

1.básico: http://cssdeck.com/labs/image-slider-1

2.com o botão anterior / próximo: http://cssdeck.com/labs/imageslider-button

3.com pager: http://cssdeck.com/labs/imageslider-pager

A demonstração 1 é diferente da demonstração 2 e 3; e demo 2 e 3 estão usando os mesmos códigos básicos.

Abaixo está como fazer o básico – passar para a próxima imagem após um determinado intervalo de tempo. sem interrupção do usuário.

A ideia básica do controle deslizante de imagem é criar uma lista longa. na verdade é um longo ‘ul’

A parte html é:

<div class=”container”>
<div class=”image-slider-wrapper”>
<ul id=”image_slider”>
<li><img src=”./image/1.jpg”></li>
<li><img src=”./image/4.jpg”></li>
<li><img src=”./image/5.jpg”></li>
<li><img src=”./image/4.jpg”></li>
<li><img src=”./image/1.jpg”></li>
<li><img src=”./image/5.jpg”></li>
</ul>
</div>
</div>

a parte do envoltório do controle deslizante da imagem é para conveniência quando eu faço trabalhos futuros.

a parte css é:

.container{
width
:800px;
height
:400px;
padding
:20px;
border
:1px solid gray;
-webkit-box-sizing:border-box;
-moz-box-sizing:border-box;
box
-sizing:border-box;
background
: black;
}
.image-slider-wrapper{
overflow
: hidden;
}
#image_slider{
position
: relative;
height
: 280px;
padding
:0;
}
#image_slider li{
max
-width: 100%;
float:left;
list
-style: none;
}

O image-slider-wrapper precisa definir overflow: hidden cause ul será uma lista muito longa em uma linha. mas apenas uma imagem pode ser vista.

Não há largura definida para ul (id = image_slider) porque iremos definir em Javascript. Portanto, quando houver mais / menos imagens, não precisamos alterar o css.

O Webkit tem preenchimento e margem padrão para ul, portanto, iremos inicializá-lo com 0px.

Defina li como list-style: none e float left, então as imagens ficarão em uma linha longa.

Tudo bem, agora temos tudo pronto para mover.

A seguir está a parte JS.
Na função init (), 1. defina a largura ul 2. mova ul

var ul;
var liItems;
var imageWidth;
var imageNumber;

function init(){

ul
= document.getElementById(‘image_slider’);
liItems
= ul.children;
imageNumber
= liItems.length;
imageWidth
= liItems[0].children[0].offsetWidth;
// set ul’s width as the total width of all images in image slider.
ul
.style.width = parseInt(imageWidth * imageNumber) + px’;
slider
(ul);
}

.offsetWidht retorna um número! (typeof (imageWidth) retorna “número”).

offsetWidth é a largura que inclui conteúdo, preenchimento, barra de rolagem e borda. se houver bordas para cada imagem, a largura de ul também estará correta.

também podemos usar computedStyle para obter a largura de uma imagem, mas, nesse caso, o que obtemos é “760px”, não 760

var computedStyle = document.defaultView.getComputedStyle(liItems[i].childNodes[0], null);
imageWidth
= computedStyle.width;

aqui está o controle deslizante de função ()

/**delta function is to set how the image slide—keep still for a while and move to next picture.
*step function will be called many times until clearInterval() been called

* currentImage * imageWidth is the currentImage position of ul

* delta start from 0 to 1, delta * imageWidth is the pixels that changes

**/

function slider(ul){
animate
({
delay
:17,
duration
: 3000,
delta
:function(p){return Math.max(0, -1 + 2 * p)},
step
:function(delta){
ul
.style.left = ‘-’ + parseInt(currentImage * imageWidth + delta * imageWidth) + px’;
},
callback
:function(){
currentImage
++;
// if it doesn’t slied to the last image, keep sliding
if(currentImage < imageNumber-1){
slider
(ul);
}
// if current image it’s the last one, it slides back to the first one
else{
var leftPosition = (imageNumber - 1) * imageWidth;
// after 2 seconds, call the goBack function to slide to the first image
setTimeout
(function(){goBack(leftPosition)},2000);
setTimeout
(function(){slider(ul)}, 4000);
}
}
});
}

A função delta garante que cada animação fique parada por um tempo e depois passe para a próxima imagem. (se y <0, então y = 0;)

A função step faz a animação. Mas é só deslizar uma imagem. A função de retorno de chamada garantirá que haja um loop para todas as imagens. E se for a última imagem, ele chama a função “goBack” para deslizar para a primeira imagem.

function goBack(leftPosition){
currentImage
= 0;
var id = setInterval(function(){
if(leftPosition >= 0){
ul
.style.left = ‘-’ + parseInt(leftPosition) + px’;
leftPosition
-= imageWidth / 10;
}
else{
clearInterval
(id);
}
}, 17);
}

Aqui está a função de animação genérica que aprendi no tutorial de animação javascript que postei no link abaixo. A única diferença é depois de clearInterval () eu chamarei a função de retorno de chamada para manter o loop de animação em andamento.

A função animar é uma função genérica deste artigo:

Eu acho que é muito bom.

http://javascript.info/tutorial/animation#the-generic-animation

//generic animate function
function animate(opts){
var start = new Date;
var id = setInterval(function(){
var timePassed = new Date - start;
var progress = timePassed / opts.duration
if(progress > 1){
progress
= 1;
}
var delta = opts.delta(progress);
opts
.step(delta);
if (progress == 1){
clearInterval
(id);
opts
.callback();
}
}, opts.dalay || 17);
}
window
.onload = init;

Com o window.inload = init; como final, o controle deslizante da imagem foi finalizado com sucesso!

Eu sei que há muitos lugares para melhorar, por exemplo este não é um ágil, também a arquitetura pode ter problemas também. Estou aprendendo coisas novas todos os dias. Vou continuar praticando e escrever códigos melhores!

周 周 加油!