Efeito de esmaecimento amarelo com JQuery

100

Eu gostaria de implementar algo semelhante ao efeito Yellow Fade da 37Signals.

Estou usando o Jquery 1.3.2

O código

(function($) {
   $.fn.yellowFade = function() {
    return (this.css({backgroundColor: "#ffffcc"}).animate(
            {
                backgroundColor: "#ffffff"
            }, 1500));
   }
 })(jQuery);

e a próxima chamada mostra o esmaecimento amarelo do elemento DOM com a identificação da caixa .

$("#box").yellowFade();

Mas isso só o torna amarelo. Nenhum fundo branco após 15.000 milissegundos.

Alguma ideia de por que não está funcionando?

Solução

Você pode usar:

$("#box").effect("highlight", {}, 1500);

Mas você precisa incluir:

effects.core.js
effects.highlight.js

Sergio del Amo
fonte
A fonte de destaque está aqui: github.com/jquery/jquery-ui/blob/master/ui/…
styfle

Respostas:

98

Esta função faz parte do jQuery effects.core.js :

$("#box").effect("highlight", {}, 1500);

Como Steerpike apontou nos comentários, effects.core.js e effects.highlight.js precisam ser incluídos para usar isso.

Baldu
fonte
1
Eu vi a demonstração no site jquery docs.jquery.com/UI/Effects/Highlight#overview Eu tentei no meu código, mas não faço nada. Preciso baixar algum extra. Diz dependências: Effects Core. É este outro plugin.
Sergio del Amo
Resposta correta, mas vou apenas mencionar que é uma função incorporada ao jQuery effects.core.js, não ao arquivo jQuery principal como animate (). Achei que valia a pena esclarecer.
Steerpike de
5
Heh, como Sergio obviamente acabou de descobrir ... sim Sergio, você precisa incluir o arquivo effects.core.js e effects.highlight.js (verifique a fonte aqui: docs.jquery.com/UI/Effects/Highlight )
Steerpike de
2
Disponível na IU do jQuery: docs.jquery.com/UI/Effects/Highlight#overview
Matt Scilipoti
7
Como uma atualização para comentários anteriores, você não inclui mais effects.core.js e effects.highlight.js (e aqueles URLs antigos não funcionam mais). A nova maneira de incluir isso é incluir a biblioteca jquery-ui: code.jquery.com/ui/1.10.4/jquery-ui.min.js
Sean Colombo
66

Adorei a resposta de Sterling Nichols, já que era leve e não exigia um plugin. No entanto, descobri que não funcionava com elementos flutuantes (ou seja, como quando o elemento é "float: right"). Então, reescrevi o código para exibir o destaque adequadamente, não importa como o elemento está posicionado na página:

jQuery.fn.highlight = function () {
    $(this).each(function () {
        var el = $(this);
        $("<div/>")
        .width(el.outerWidth())
        .height(el.outerHeight())
        .css({
            "position": "absolute",
            "left": el.offset().left,
            "top": el.offset().top,
            "background-color": "#ffff99",
            "opacity": ".7",
            "z-index": "9999999"
        }).appendTo('body').fadeOut(1000).queue(function () { $(this).remove(); });
    });
}

Opcional:
use o seguinte código se você também quiser corresponder o raio da borda do elemento:

jQuery.fn.highlight = function () {
    $(this).each(function () {
        var el = $(this);
        $("<div/>")
        .width(el.outerWidth())
        .height(el.outerHeight())
        .css({
            "position": "absolute",
            "left": el.offset().left,
            "top": el.offset().top,
            "background-color": "#ffff99",
            "opacity": ".7",
            "z-index": "9999999",
            "border-top-left-radius": parseInt(el.css("borderTopLeftRadius"), 10),
            "border-top-right-radius": parseInt(el.css("borderTopRightRadius"), 10),
            "border-bottom-left-radius": parseInt(el.css("borderBottomLeftRadius"), 10),
            "border-bottom-right-radius": parseInt(el.css("borderBottomRightRadius"), 10)
        }).appendTo('body').fadeOut(1000).queue(function () { $(this).remove(); });
    });
}
Doug S
fonte
9
Eu amo essa solução. Funciona muito bem em linhas de mesa.
Perry Tew
Melhor solução até agora. Se ele copiasse o raio da borda do elemento também, seria ainda melhor.
Stijn Van Bael,
Código @StijnVanBael agora atualizado para copiar border-radius. Obrigado pela sugestão.
Doug S
Isso é incrível, não há necessidade da biblioteca de interface do usuário agora para mim, mas meu problema é que ela não realçará toda a minha div no primeiro uso, provavelmente porque parte dela está vazia e o texto é definido pouco antes de ser chamado.
NaughtySquid
Legal, mas isso não parece funcionar em modais como o FeatherlightJs.
Ryan
64

A biblioteca de efeitos jQuery adiciona um pouco de sobrecarga desnecessária ao seu aplicativo. Você pode realizar a mesma coisa apenas com jQuery. http://jsfiddle.net/x2jrU/92/

jQuery.fn.highlight = function() {
   $(this).each(function() {
        var el = $(this);
        el.before("<div/>")
        el.prev()
            .width(el.width())
            .height(el.height())
            .css({
                "position": "absolute",
                "background-color": "#ffff99",
                "opacity": ".9"   
            })
            .fadeOut(500);
    });
}

$("#target").highlight();
Sterling Nichols
fonte
4
Obrigado, isso é melhor e eu estava procurando por algo com o qual posso evitar a inclusão de um núcleo de IU completo, o que era completamente desnecessário.
dia
Você é demais. Exatamente o que eu estava procurando, sem adicionar outro plugin. E eu gosto que ele faz uma sobreposição real de todo o elemento, ao invés de apenas mudar a cor de fundo do elemento (que pode ser coberta por texto, botões, etc).
Doug S de
3
ATUALIZAÇÃO: Este código frequentemente falhará ao tentar destacar elementos flutuantes (ou seja, quando o elemento é "float: right"). Então eu reescrevi o código para exibir o destaque corretamente, não importa como o elemento está posicionado na página: stackoverflow.com/a/13106698/1145177
Doug S
Obrigado pela atualização Doug .. Vou ter que atualizar minhas próprias bibliotecas.
Sterling Nichols
2
Ótima solução leve - funciona muito bem. No entanto, descobri que meus destaques não incluíam o preenchimento de elemento, então usei .width(el.outerWidth())e .height(el.outerHeight())para destacar todos os campos do meu formulário.
Mark B
13

Defina seu CSS da seguinte maneira:

@-webkit-keyframes yellowfade {
    from { background: yellow; }
    to { background: transparent; }
}

@-moz-keyframes yellowfade {
    from { background: yellow; }
    to { background: transparent; }
}

.yft {
    -webkit-animation: yellowfade 1.5s;
       -moz-animation: yellowfade 1.5s;
            animation: yellowfade 1.5s;
}

E basta adicionar a classe yfta qualquer item$('.some-item').addClass('yft')

Demonstração: http://jsfiddle.net/Q8KVC/528/

Kamran Ahmed
fonte
8
(function($) {
  $.fn.yellowFade = function() {
    this.animate( { backgroundColor: "#ffffcc" }, 1 ).animate( { backgroundColor: "#ffffff" }, 1500 );
  }
})(jQuery);

Deve fazer o truque. Defina-o como amarelo e, em seguida, esmaeça para branco


fonte
Obrigado pela resposta. Mas não está funcionando. Parece que o animado não faz nada.
Sergio del Amo
qual versão do jQuery você está usando?
1.3.2. Eu adicionei isso à minha pergunta
Sergio del Amo
Isso funcionou bem para meus objetivos, sem dependências além do vanilla jquery.
gojomo
3
Isso precisa do plugin jQuery.Color () para funcionar: github.com/jquery/jquery-color
Dia Kharrat
7

Acabei de resolver um problema semelhante a este em um projeto em que estava trabalhando. Por padrão, a função animar não pode animar cores. Tente incluir animações em cores jQuery .

Todas as respostas aqui usam este plugin, mas ninguém o menciona.

Travis
fonte
3

Na verdade, tenho uma solução que só precisa de jQuery 1.3x, e nenhum plugin adicional.

Primeiro, adicione as seguintes funções ao seu script

function easeInOut(minValue,maxValue,totalSteps,actualStep,powr) {
    var delta = maxValue - minValue;
    var stepp = minValue+(Math.pow(((1 / totalSteps)*actualStep),powr)*delta);
    return Math.ceil(stepp)
}

function doBGFade(elem,startRGB,endRGB,finalColor,steps,intervals,powr) {
    if (elem.bgFadeInt) window.clearInterval(elem.bgFadeInt);
    var actStep = 0;
    elem.bgFadeInt = window.setInterval(
        function() {
            elem.css("backgroundColor", "rgb("+
                easeInOut(startRGB[0],endRGB[0],steps,actStep,powr)+","+
                easeInOut(startRGB[1],endRGB[1],steps,actStep,powr)+","+
                easeInOut(startRGB[2],endRGB[2],steps,actStep,powr)+")"
            );
            actStep++;
            if (actStep > steps) {
            elem.css("backgroundColor", finalColor);
            window.clearInterval(elem.bgFadeInt);
            }
        }
        ,intervals)
}

Em seguida, chame a função usando:

doBGFade( $(selector),[245,255,159],[255,255,255],'transparent',75,20,4 );

Vou deixar você adivinhar os parâmetros, eles são bastante autoexplicativos. Para ser honesto, o script não é meu, eu o peguei em uma página e mudei para que funcione com o jQuery mais recente.

NB: testado no firefox 3 e ie 6 (sim, funciona naquela coisa antiga também)


fonte
2
function YellowFade(selector){
   $(selector)
      .css('opacity', 0)
      .animate({ backgroundColor: 'Yellow', opacity: 1.0 }, 1000)
      .animate({ backgroundColor: '#ffffff', opacity: 0.0}, 350, function() {
             this.style.removeAttribute('filter');
              });
}

A linha this.style.removeAttribute('filter')é para um bug de anti-aliasing no IE.

Agora, chame YellowFade de qualquer lugar e passe seu seletor

YellowFade('#myDivId');

Crédito : Phil Haack teve uma demonstração mostrando exatamente como fazer isso. Ele estava fazendo uma demonstração em JQuery e ASPNet MVC.

Dê uma olhada neste vídeo

Atualização : Você deu uma olhada no vídeo? Esqueci de mencionar que isso requer o plugin JQuery.Color

Vin
fonte
O próximo erro está sendo lançado pela linha do filtro. Estou usando o fade amarelo em um elemento de linha da tabela (tr) "this.style.removeAttribute não é uma função [interromper este erro] this.style.removeAttribute ('filtro');"
Sergio del Amo
2

Eu odiava adicionar 23kb apenas para adicionar effects.core.js e effects.highlight.js, então escrevi o seguinte. Ele emula o comportamento usando fadeIn (que faz parte do próprio jQuery) para 'piscar' o elemento:

$.fn.faderEffect = function(options){
    options = jQuery.extend({
        count: 3, // how many times to fadein
        speed: 500, // spped of fadein
        callback: false // call when done
    }, options);

    return this.each(function(){

        // if we're done, do the callback
        if (0 == options.count) 
        {
            if ( $.isFunction(options.callback) ) options.callback.call(this);
            return;
        }

        // hide so we can fade in
        if ( $(this).is(':visible') ) $(this).hide();

        // fade in, and call again
        $(this).fadeIn(options.speed, function(){
            options.count = options.count - 1; // countdown
            $(this).faderEffect(options); 
        });
    });
}

em seguida, chame-o com $ ('. item'). faderEffect ();

Corey
fonte
Este não é o mesmo que o desbotamento amarelo que o usuário solicitou.
Jon Winstanley
2
Certo. Estou sugerindo uma alternativa ou "algo semelhante".
Corey
2

esta é a minha solução para o problema. funciona excelente. ele passa na validação de erro do jslint e também funciona decentemente no IE8 e no IE9. Claro que você pode ajustá-lo para aceitar códigos de cores e retornos de chamada:

jQuery.fn.highlight = function(level) {

  highlightIn = function(options){

    var el = options.el;
    var visible = options.visible !== undefined ? options.visible : true;

    setTimeout(function(){
      if (visible) {
        el.css('background-color', 'rgba('+[255, 64, 64]+','+options.iteration/10+')');
        if (options.iteration/10 < 1) {
          options.iteration += 2;
          highlightIn(options);
        }
      } else {
        el.css('background-color', 'rgba('+[255, 64, 64]+','+options.iteration/10+')');
        if (options.iteration/10 > 0) {
          options.iteration -= 2;
          highlightIn(options);
        } else {
          el.css('background-color', '#fff');
        }
      }
    }, 50);
  };

  highlightOut = function(options) {
    options.visible = false;
    highlightIn(options);
  };

  level = typeof level !== 'undefined' ? level : 'warning';
  highlightIn({'iteration': 1, 'el': $(this), 'color': level});
  highlightOut({'iteration': 10, 'el': $(this), 'color': level});
};
muitos
fonte
1
que benefício isso tem sobre o destaque do jQuery? docs.jquery.com/UI/Effects/Highlight
Nathan Koop
1
bem, no meu caso, eu não poderia usar Jquery ui. então fiquei com a fixação de uma solução apenas com Jquery.
muitos
1

Esta é uma opção não jQuery que você pode usar para o efeito de esmaecimento da cor. Na matriz "cores", você adiciona as cores de transição necessárias desde a cor inicial até a última cor. Você pode adicionar quantas cores quiser.

   <html lang="en">
   <head>
   <script type="text/javascript">
  //###Face Effect for a text box#######

var targetColor;
var interval1;
var interval2;
var i=0;
var colors = ["#FFFF00","#FFFF33","#FFFF66","#FFFF99","#FFFFCC","#FFFFFF"];

function changeColor(){
    if (i<colors.length){
        document.getElementById("p1").style.backgroundColor=colors[i];
        i++;
    } 
    else{
        window.clearInterval(interval1);
        i=0;
    }
}
addEventListener("load",function(){
    document.getElementById("p1").addEventListener("click",function(e){
        interval1=setInterval("changeColor()",80);              

    })
});
</script>

</head>

<body>
<p id="p1">Click this text box to see the fade effect</p>

<footer>
 <p>By Jefrey Bulla</p>
</footer>
</div>
</body>
</html> 
Jefrey Bulla
fonte
0

Se você quiser tentar uma técnica alternativa de esmaecimento do amarelo que não dependa do jQuery UI .effect, poderá posicionar um div amarelo (ou de outra cor) atrás do seu conteúdo e usar jQuery .fadeOut ().

http://jsfiddle.net/yFJzn/2/

<div class="yft">
    <div class="content">This is some content</div>
    <div class="yft_fade">&nbsp;</div>
</div>

<style>
  .yft_fade {
      background-color:yellow;
      display:none;
  }
  .content {
      position:absolute;
      top:0px;
  }
</style>

<script>
  $(document).ready(function() {
      $(".yft").click(function() {
          $(this).find(".yft_fade").show().fadeOut();
      });
  });​
</script>
tfmontague
fonte
0

Eu simplesmente usei ...

<style>
tr.highlight {
background: #fffec6;
}
</style>


<script>
//on page load, add class
$(window).load(function() {
$("tr.table-item-id").addClass("highlight", 1200);
}); 

//fade out class
setTimeout(function(){
$("tr.table-item-id").removeClass("highlight", 1200);   
}, 5200);

</script>
BENN1TH
fonte
0

Um script simples / bruto para um "fadeout amarelo", sem plug-ins, exceto o próprio jquery . Apenas definindo o fundo com rgb (255,255, realcecolor) em um cronômetro:

<script>

    $(document).ready(function () {
        yellowFadeout();
    });

    function yellowFadeout() {
        if (typeof (yellowFadeout.timer) == "undefined")
            yellowFadeout.timer = setInterval(yellowFadeout, 50);
        if (typeof (yellowFadeout.highlightColor) == "undefined")
            yellowFadeout.highlightColor = 0;
        $(".highlight").css('background', 'rgb(255,255,' + yellowFadeout.highlightColor + ')');
        yellowFadeout.highlightColor += 10;
        if (yellowFadeout.highlightColor >= 255) {
            $(".highlight").css('background','');
            clearInterval(yellowFadeout.timer);
        }
    }
</script>
Johan Danforth
fonte