Jump to content
André Ciappina

Como fazer um efeito crossfade em mudança de src da mesma tag <img/> [JQUERY]

Recommended Posts

E aí pessoal! Eu tô desenvolvendo um modelo de portfólio fotográfico, por razões de aprendizado mesmo, mas travei em um momento e passei o dia pesquisando como fazer isso.

Basicamente, é uma espiral áurea de imagens que trocam de lugar, dando a impressão de infinidade.

  • Se você clicar na maior, ela fica em tela cheia;
  • Clicando nas outras, todas as imagens se movem ao quadrado seguinte.

 

Até agora há pouco, eu estava fazendo isso mudando a posição de cada div onde a imagem fica, por meio de addClass() e removeClass(). Só que assim tava muito difícil imaginar como eu alcançaria o efeito de infinidade das imagens, já que apenas seis imagens aparecem de cada vez, então são seis DIVs se movimentando a cada clique - isso se complicaria quando eu tentasse colocar muitas imagens a serem disponibilizadas na página.

 

Mas hoje eu tentei outro método: agora são 6 divs com uma imagem dentro cada um, mas não é a posição deles que mudará, e sim o atributo src="" da tag <img/>. Pra isso, usei attr().

Então cada src altera de valor em fila, cada vez que eu clico no gatilho.

 

Só que mudar o src vai além de CSS, então eu não posso usar transition como antes. Agora o máximo que eu posso fazer é um crossfade entre as imagens. Só que o fadeOut() e fadeIn() também não funcionam! Tecnicamente, funcionam, mas não visualmente. Pra consertar isso eu já tentei delay(), stop(), finish(), promise(), toggleClass() entre outros jeitos.

 

Bom, já falei demais, vocês podem ver a página funcionando no CodePen:

https://codepen.io/dehciappina/pen/yjWOdM

 

Nesse código eu usei toggleClass, pois foi o único jeito que consegui ver um fade de verdade. Mas, obviamente, não funciona, já que o toggle se aplica à mesma tag <img/> e ou faz ela desaparecer completamente com um clique, ou eu uso dois toggle e eles se anulam quando a função é chamada.

 

Bom, é isso, espero ter me explicado o suficiente. Obrigado!!!

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Similar Content

    • By gersonab
      Bom dia.
      utilizava um código para completar o endereço conforme o cep, funcionando perfeitamente, só que preciso pegar o cep caso não tenha, pelo endereço digitado, pesquisando pela internet encontrei o código abaixo, funciona perfeitamente para os dois casos, só que .... no meu formulário tenho dois campos de endereço, um residencial e outro de trabalho, o código que utilizava antes funcionava para os dois campos, erá só mudar o id do campo do formulário, tipo se eu tinha id="logadouro" em um campo no outro id="logadouro1", só que .... no código atualizado para ambas as pesquisas esta forma não funciona, gostaria da ajuda de vocês para este problema.
      código antigo:
      function limpa_formulário_cep() { $("#logradouro").val(""); $("#bairro").val(""); $("#localidade").val(""); $("#uf").val(""); } $("#cep").blur(function() { var cep = $(this).val().replace(/\D/g, ''); if (cep != "") { var validacep = /^[0-9]{8}$/; if(validacep.test(cep)) { $("#logradouro").val("..."); $("#bairro").val("..."); $("#localidade").val("..."); $("#uf").val("..."); $.getJSON("https://viacep.com.br/ws/"+ cep +"/json/?callback=?", function(dados) { if (!("erro" in dados)) { $("#logradouro").val(dados.logradouro); $("#bairro").val(dados.bairro); $("#localidade").val(dados.localidade); $("#uf").val(dados.uf); } else { limpa_formulário_cep(); alert("CEP não encontrado."); } }); } else { limpa_formulário_cep(); alert("Formato de CEP inválido."); } } else { limpa_formulário_cep(); } }); como podem ver era só duplicar e mudar o id, agora neste ja não consigo
      var inputsCEP = $('#logradouro, #bairro, #localidade, #uf'); var inputsRUA = $('#cep, #bairro'); var validacep = /^[0-9]{8}$/; function limpa_formulário_cep(alerta) { if (alerta !== undefined) { alert(alerta); } inputsCEP.val(''); } function get(url) { $.get(url, function(data) { if (!("erro" in data)) { if (Object.prototype.toString.call(data) === '[object Array]') { var data = data[0]; } $.each(data, function(nome, info) { $('#' + nome).val(nome === 'cep' ? info.replace(/\D/g, '') : info).attr('info', nome === 'cep' ? info.replace(/\D/g, '') : info); }); } else { limpa_formulário_cep("CEP não encontrado."); } }); } // Digitando RUA/CIDADE/UF $('#logradouro, #localidade, #uf').on('blur', function(e) { if ($('#logradouro').val() !== '' && $('#logradouro').val() !== $('#logradouro').attr('info') && $('#localidade').val() !== '' && $('#localidade').val() !== $('#localidade').attr('info') && $('#uf').val() !== '' && $('#uf').val() !== $('#uf').attr('info')) { inputsRUA.val('...'); get('https://viacep.com.br/ws/' + $('#uf').val() + '/' + $('#localidade').val() + '/' + $('#logradouro').val() + '/json/'); } }); // Digitando CEP $('#cep').on('blur', function(e) { var cep = $('#cep').val().replace(/\D/g, ''); if (cep !== "" && validacep.test(cep)) { inputsCEP.val('...'); get('https://viacep.com.br/ws/' + cep + '/json/'); } else { limpa_formulário_cep(cep == "" ? undefined : "Formato de CEP inválido."); } }); desde já agradeço.
    • By Marcos PP
      Preciso colocar a o atributo fadeIN e fadeOut em uma lista de acordo com o numero que o usuário clicar.
      Porem não estou conseguindo formular a função do script para isso
      No id #RESPOSTA tenho os números 1 - 5 - 10 - 20 - 30 - 40 - 50 - 100 - 200 - 300
      O que estou tentando e ao clicar na resposta 10 por exemplo, Todos os resultados da lista maiores que 10 sumam
      e logo depois se eu clicar em 50, permaneça os abaixo de 10 e apareça os ID's ate 50

      Como se fosse um filtro, clico em 10, só aparece os de 1 ate 10, clico em 50, so aparece os entre 1 ate 50 e assim por diante.

      Porem dinamicamente, so adicionando fadeOut e fadeIn
    • By Sapinn
      Salveee! Certo a dúvida que trarei aqui agora é bem complexa e eu sinceramente não sei se é realmente possível mas acho que não custa nada perguntar.
       
      Fiz um site de envio de textos, onde o aluno envia um texto e o professor corrigi até ai blz, queria saber como eu poderia fazer pra quando o professor marcar uma palavra aprece-se uma caixa de dialogo onde ele colocaria, por exemplo, a correção da palavra ou alguma explicação e essas informações seriam enviadas para o banco de dados quando o aluno acessa a correção desse texto e o ele passa-se  mouse por cima dessa palavra apareceria a correção em um balãozinho. Como exemplo desse comportamento que acabei de citar temos o google documents que faz algo desse jeito. Queria saber se isso pode ser possível sem exigir muito código ou muita coisa. Desde já agradeço.
    • By Luiz Henrique
      Olá,
      Como posso utilizar o success com jquery?
      $.post('pagina.php',{valores...},function(data){ $('#result').html(data); var result = $(".class_div").text(); }); Depois da linha: var result = $(".class_div").text();    
      preciso executar uma outra requisição, porém se pagina.php já não tiver sido processada não funciona.
       
      tentei o code abaixo, mas não funciona, trava todo js.
      success: function(){ alert('executado'); } Obrigado.
    • By Luiz Henrique de Sousa
      Estou utilizando rich faces e seu componente JQuery, para realizar formatação de campos decimais, estou utilizando o maskMoney e atribui uma precisão de 3 casas no meu input text, e tenho um campo disabled que é booleano, ele é acionado caso tenha mais coisas associadas a outro item no form abaixo, mesmo sabendo que a função disabled é apenas vísivel ela não faz nada de diferente, quando a minha função disabled é acionada tem como eu tirar as casas decimais dela.
      Fiz dessa forma abaixo:
       
      <f:facet name="header"> <h:outputLabel value="#{messages.conversion}"/> </f:facet> <h:inputText id="fldConversion" value="#{row.vlConversion}" label="#{messages.conversion}" maxLength="25" disabled="#{defaultMBean.canDisabledConversion(row)}"> <a4j:ajax event="change" immediate="true" render="@all, partnerItem, dataModel"/> <f:converter converterId="javax.faces.BigDecimal"/> <f:validateLength maximum="30" /> </h:outputText> <rich:jQuery selector="#fldConversion" query="maskMoney({decimal:''.'',allowNegative:false, showSymbol:false, thousands: '''',precision: 3})"/> E criei esse método para quando estiver desativado o campo:
       
      public BigDecimal canDisableConversionE(TypeDTO row) { BigDecimal r = row.getConversionValue().setScale(0, RoundingMode.HALF_EVEN); System.out.println(r); return r; } public Boolean canDisableConversion(TypeDTO row) { if (row.getId() == 1L && !canDisableConversionE()) { return false; } if (IsWeight(row.getId())) { return true; } return getConfigFacade().canDisableConversionE(row.getConversionValue()); }  
×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.