Com o advento do CSS3, tornou-se possível fazer animações sem o uso de bibliotecas JS, como, por exemplo, jQuery. A propriedade de transição CSS3 permite alterar sem problemas outras propriedades de um elemento (largura, altura, margem, opacidade etc.), definindo o tempo e a lei da transformação como parâmetros. Eu ofereço um carrossel pequeno, mas bastante funcional, em Javascript puro. Pequena como uma formiga, que é muito menor que uma
coruja . Mas com quase os mesmos recursos.
O carrossel de formigas permite:
- mostre um ou mais elementos;
- os elementos podem ser mostrados na forma de uma faixa finita ou infinita (em um loop);
- itens de rolagem automática;
- a navegação é realizada por setas, pontos indicadores ou virar (para telas táteis);
- ajusta automaticamente a qualquer largura da tela.
Colocamos nosso carrossel no arquivo index.html (veja o arquivo de exemplo abaixo):
HTML<div class="ant-carousel"> <div class="ant-carousel-hider"> <ul class="ant-carousel-list"> <li class="ant-carousel-element"><img src="images/img1.jpg" alt="1"> <p> 1</p> </li> <li class="ant-carousel-element"><img src=" images /img2.jpg" alt="2"> <p>2</p> </li> … <li class="ant-carousel-element"><img src=" images /imgN.jpg" alt="N"> <p> N</p> </li> </ul> </div> <div class="ant-carousel-arrow-left"></div><div class="ant-carousel-arrow-right"></div> <div class="ant-carousel-dots"></div> </div>
Os elementos <ul> <li> são usados aqui, mas <div> <div> pode ser usado, se você preferir. Setas e pontos indicadores são posicionados absolutamente nos respectivos contêineres. Para as setas, são utilizados padrões na forma de colchetes triangulares, que, se desejado, você pode substituir por seus padrões ou geração de imagens pelos pseudo-elementos
: antes e
: depois .
Crie um carrossel com três elementos visíveis e uma largura de 270 pixels. A largura máxima do carrossel é de 810 pixels. Nós incluímos o arquivo CSS:
CSS .ant-carousel { max-width: 810px; position: relative; } .ant-carousel-hider { overflow: hidden; } .ant-carousel-list { width: auto; margin: 0; padding: 0; list-style-type: none; display: flex; justify-content: flex-start; } .ant-carousel-element { display: block; flex: 0 0 auto; width: 270px; text-align: center; } div.ant-carousel-arrow-left, div.ant-carousel-arrow-right { width: 22px; height: 40px; position: absolute; cursor: pointer; opacity: 0.6; z-index: 2; display: block; } div.ant-carousel-arrow-left { left: -40px; top: 40%; background: url(“ant-arrow-left.png”) no-repeat; } div.ant-carousel-arrow-right { right: -40px; top: 40%; background: url(“ant-arrow-right.png”) no-repeat; } div.ant-carousel-arrow-left: hover { opacity: 1.0; } div.ant-carousel-arrow-right: hover { opacity: 1.0; } div.ant-carousel-dots { width: 100%; height: auto; position: absolute; left: 0; bottom: -30px; z-index: 2; text-align: center; } span.ant-dot { width: 10px; height: 10px; margin: 5px 7px; padding: 0; display: inline-block; background-color: #BBB; border-radius: 5px; cursor: pointer; }
Colocamos os elementos no container
ant-carrossel-list , configuramos a propriedade
display: flex e pressionamos todos os elementos na borda esquerda do
justify-content: flex-start . A propriedade
flex: 0 0 define
automaticamente o encolhimento flexível como 0 (o padrão é 1). A rolagem dos elementos do carrossel é realizada usando a propriedade
transiton , alterando suavemente o recuo da
margem esquerda de zero para a largura do elemento (em uma direção) ou da largura do elemento para zero (na outra direção). Para a função de transformação (rolagem), o valor da
facilidade é usado .
Passamos para o programa. Nas opções do programa você pode configurar:
- número de elementos visíveis;
- visualizar elementos na forma de uma fita do primeiro ao último ou em um loop infinito (a fita fecha em um anel);
- rolagem automática ou manual de elementos;
- intervalo de rolagem automática;
- velocidade de animação;
- ativar / desativar elementos de navegação: setas, pontos indicadores, movimento por toque (para telas táteis).
A inicialização do programa começa com o fato de que o número de elementos do carrossel é determinado, os valores iniciais são atribuídos às variáveis internas, os manipuladores de eventos são atribuídos às setas e pontos (se conectados). Se a opção de rolagem automática estiver ativada, são atribuídos manipuladores adicionais que param de rolar quando você passa o mouse sobre os elementos do carrossel. A rolagem por toque é acionada se houver mais de 20 pixels entre o ponto em que o dedo toca na tela e o ponto em que o dedo é arrancado da tela e o tempo total em que o dedo toca na tela é inferior a 80 ms. O autor ainda não possui muita experiência com este carrossel; portanto, os valores fornecidos podem precisar de esclarecimentos. Para uma resposta mais confiável do manipulador de rolagem, a distância entre os pontos pode ser reduzida para 10 ou 15 pixels e o tempo de toque deve ser aumentado para 100 ou 120 ms. O usuário deste carrossel pode corrigir esses valores sozinho depois de adquirir alguma experiência em seu uso.
O algoritmo de rolagem para elementos difere dependendo se a opção de loop está ativada ou não. Se ativada, ao rolar para a direita (função
elemPrev ), a propriedade
margem-esquerda de toda a linha
desses elementos
this.crslList diminui de zero para um valor negativo igual à largura do elemento
elemWidth . Ao mesmo tempo, o último elemento à direita é clonado e inserido antes do primeiro elemento, após o qual o último elemento é excluído. É atribuída à linha a propriedade
'transição: margem' + opções . velocidade
+ 'ms facilidade' , em que
opções. velocidade é a velocidade da animação, a
facilidade é a função de animação. Agora você pode rolar. A propriedade
margem esquerda muda suavemente de um valor negativo para zero, a régua inteira muda suavemente para a direita e o último item vem primeiro. Após microssegundos
options.speed , a linha recebe o valor anterior
'transição: nenhuma' .
var elm, buf, this$ = this; elm = this.crslList.lastElementChild; buf = elm.cloneNode(true); this.crslList.insertBefore(buf, this.crslList.firstElementChild); this.crslList.removeChild(elm); this.crslList.style.marginLeft = '-' + this.elemWidth + 'px'; window.getComputedStyle(this.crslList). marginLeft; this.crslList.style.cssText = 'transition: margin '+this.options.speed+'ms ease;'; this.crslList.style.marginLeft = '0px'; setTimeout(function() { this$.crslList.style.cssText = 'transition: none;' }, this.options.speed);
Se você precisar rolar n elementos ao mesmo tempo, a permutação dos elementos é realizada em um loop n vezes, e a distância da
margem esquerda aumenta n vezes.
A rolagem para a esquerda (função
elemNext ) ocorre na ordem inversa. Primeiro, a propriedade
'transição: margem' + opções. velocidade + 'facilidade MS' é atribuída à linha
this.crslList e a linha rola suavemente para a esquerda (
crslList.style.marginLeft = '-' + elemWidth + 'px' ). Além disso, após microssegundos
options.speed , o primeiro elemento é clonado e inserido no final da régua, após o qual o primeiro elemento é excluído. A régua retorna o valor 'transição: nenhuma'. Se você precisar rolar n elementos ao mesmo tempo, o rearranjo dos elementos, como no caso anterior, é realizado n vezes em um loop e a distância da
margem esquerda aumenta n vezes.
var elm, buf, this$ = this; this.crslList.style.cssText = 'transition: margin '+this.options.speed+'ms ease;'; this.crslList.style.marginLeft = '-' + this.elemWidth + 'px'; setTimeout(function() { this$.crslList.style.cssText = 'transition: none;'; elm = this$.crslList.firstElementChild; buf = elm.cloneNode(true); this$.crslList.appendChild(buf); this$.crslList.removeChild(elm) this$.crslList.style.marginLeft = '0px' }, this.options.speed);
Se a opção de ciclo estiver desativada, nesse caso, não haverá permutações dos elementos e toda a linha de elementos será deslocada como um todo para a esquerda ou direita para seus pontos extremos. A linha de elementos
this.crslList propriedade
'transição: margem' + opções. velocidade + 'ms facilidade' é atribuída mesmo quando o carrossel é inicializado e não é mais excluído.
O carrossel é chamado pelo nome da classe ant-carrossel ou pelo identificador. No segundo caso, você pode colocar vários carrosséis em uma página. Um arquivo index.html do carrossel pode ficar assim:
<!DOCTYPE html> <html lang="ru"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <meta name="viewport" content="width=device-width; initial-scale=1.0"> <title>Ant-Carousel</title> <link rel="stylesheet" type="text/css" href="ant-files/ant-carousel-styles.css"> </head> <body> … <div class="ant-carousel"> … </div> … <footer> … </footer> <script src="ant-files/ant-carousel. js"></script> <script>new Ant()</script> </body> </html>
Para colocar vários carrosséis em uma página, é necessário chamá-los por ID. Carrosséis diferentes podem ter um número diferente de elementos.
<div class="ant-carousel" id=”first”> … <div class="ant-carousel" id=”second”> … <script>new Ant("first"); new Ant("second");</script>
Todas as imagens são tiradas de fontes abertas.Obrigado pela atenção!