Effetto dissolvenza giallo con JQuery


100

Vorrei implementare qualcosa di simile all'effetto Yellow Fade di 37Signals.

Sto usando Jquery 1.3.2

Il codice

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

e la chiamata successiva mostra il giallo che sbiadisce l'elemento DOM con box id.

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

Ma lo rende solo giallo. Nessuno sfondo bianco dopo 15000 millisecondi.

Qualche idea sul perché non funziona?

Soluzione

Puoi usare:

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

Ma dovresti includere:

effects.core.js
effects.highlight.js


Risposte:


98

Questa funzione fa parte di jQuery effects.core.js :

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

Come ha sottolineato Steerpike nei commenti, gli effects.core.js e gli effects.highlight.js devono essere inclusi per poterlo utilizzare.


1
Ho visto la demo nel sito jquery docs.jquery.com/UI/Effects/Highlight#overview Ho provato nel mio codice ma non fa nulla. Devo scaricare qualche extra. Dice dipendenze: Effects Core. È questo un altro plugin.
Sergio del Amo

Risposta corretta, ma menzionerò solo che è una funzione integrata in jQuery effects.core.js, non nel file jQuery principale come animate (). Ho solo pensato che valesse la pena chiarire.
Steerpike

5
Eh, come Sergio ha così ovviamente appena scoperto ... sì Sergio, devi includere il file effects.core.js e effects.highlight.js (controlla la fonte qui: docs.jquery.com/UI/Effects/Highlight )
Steerpike

2
Questo è disponibile nell'interfaccia utente di jQuery: docs.jquery.com/UI/Effects/Highlight#overview
Matt Scilipoti

7
Come aggiornamento ai commenti precedenti, non includi più effects.core.js ed effects.highlight.js (e quei vecchi URL non funzionano più). Il nuovo modo per includerlo è includere la libreria jquery-ui: code.jquery.com/ui/1.10.4/jquery-ui.min.js
Sean Colombo

66

Ho adorato la risposta di Sterling Nichols, poiché era leggera e non richiedeva un plug-in. Tuttavia, ho scoperto che non funzionava con gli elementi flottanti (ad esempio, come quando l'elemento è "float: right"). Quindi ho riscritto il codice per visualizzare correttamente l'evidenziazione indipendentemente da come l'elemento è posizionato sulla pagina:

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(); });
    });
}

Facoltativo:
utilizza il codice seguente se desideri far corrispondere anche il raggio del bordo dell'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(); });
    });
}

9
Amo questa soluzione. Funziona alla grande sulle righe della tabella.
Perry Tew

La migliore soluzione finora. Se copiasse anche il raggio del bordo dell'elemento, sarebbe sempre meglio.
Stijn Van Bael

Codice @StijnVanBael ora aggiornato per copiare border-radius. Grazie per il suggerimento.
Doug S

Questo è fantastico, non ho bisogno della libreria dell'interfaccia utente ora per me, ma il mio problema è che non evidenzierà il mio intero div al primo utilizzo, probabilmente perché una parte è vuota e il testo è impostato appena prima che venga chiamato?
NaughtySquid

Bello, ma questo non sembra funzionare su modali come FeatherlightJs.
Ryan

64

La libreria di effetti jQuery aggiunge un bel po 'di overhead non necessario alla tua app. Puoi fare la stessa cosa solo con 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();

4
Grazie, è meglio e stavo cercando qualcosa con cui evitare di includere il core dell'interfaccia utente completo che era completamente inutile.
deej

Sei forte. Esattamente quello che stavo cercando, senza aggiungere un altro plugin. E mi piace che faccia una vera sovrapposizione dell'intero elemento, invece di cambiare semplicemente il colore di sfondo dell'elemento (che potrebbe essere coperto da testo, pulsanti, ecc.).
Doug S

3
AGGIORNAMENTO: Questo codice spesso fallisce quando si cerca di evidenziare elementi fluttuanti (cioè quando l'elemento è "float: right"). Quindi ho riscritto il codice per visualizzare correttamente l'evidenziazione indipendentemente da come l'elemento è posizionato sulla pagina: stackoverflow.com/a/13106698/1145177
Doug S

Grazie per l'aggiornamento Doug .. dovrò aggiornare le mie librerie.
Sterling Nichols

2
Bella soluzione leggera: funziona davvero bene. Ho scoperto che i miei punti salienti non includevano il riempimento degli elementi, quindi ho usato .width(el.outerWidth())e .height(el.outerHeight())per evidenziare tutti i campi del mio modulo.
Mark B

13

Definisci il tuo CSS come segue:

@-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 aggiungi semplicemente la classe yfta qualsiasi elemento$('.some-item').addClass('yft')

Demo: http://jsfiddle.net/Q8KVC/528/


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

Dovrebbe fare il trucco. Impostalo sul giallo, quindi sfumalo in bianco


Grazie per la risposta. Tuttavia non funziona. Sembra che animato non faccia nulla.
Sergio del Amo

quale versione di jQuery stai usando?

1.3.2. Ho aggiunto questo alla mia domanda
Sergio del Amo

Ha funzionato bene per i miei scopi senza dipendenze oltre a vanilla jquery.
gojomo

3
Questo richiede il plugin jQuery.Color () per funzionare: github.com/jquery/jquery-color
Dia Kharrat

7

Ho appena risolto un problema simile a questo su un progetto su cui stavo lavorando. Per impostazione predefinita, la funzione di animazione non può animare i colori. Prova a includere jQuery Color Animations .

Tutte le risposte qui usano questo plugin ma nessuno lo menziona.


3

In realtà, ho una soluzione che richiede solo jQuery 1.3x e nessun plug-in aggiuntivo.

Innanzitutto, aggiungi le seguenti funzioni al tuo 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)
}

Quindi, chiama la funzione usando questo:

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

Ti lascio indovinare i parametri, sono abbastanza autoesplicativi. Ad essere onesti lo script non è mio, l'ho preso su una pagina e poi l'ho cambiato in modo che funzioni con l'ultimo jQuery.

NB: testato su firefox 3 e ie 6 (sì, funziona anche su quella vecchia cosa)


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');
              });
}

La linea this.style.removeAttribute('filter')è per un bug anti-aliasing in IE.

Ora, chiama YellowFade da qualsiasi luogo e passa il tuo selettore

YellowFade('#myDivId');

Credito : Phil Haack aveva una demo che mostrava esattamente come farlo. Stava facendo una demo su JQuery e ASPNet MVC.

Dai un'occhiata a questo video

Aggiornamento : hai dato un'occhiata al video? Ho dimenticato di menzionare che richiede il plug-in JQuery.Color


Il prossimo errore viene generato dalla riga del filtro. Sto usando la dissolvenza gialla in un elemento riga della tabella (tr) "this.style.removeAttribute non è una funzione [Interrompi su questo errore] this.style.removeAttribute ('filter');"
Sergio del Amo

2

Odiavo aggiungere 23kb solo per aggiungere effects.core.js ed effects.highlight.js, quindi ho scritto quanto segue. Emula il comportamento usando fadeIn (che fa parte di jQuery stesso) per 'lampeggiare' l'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); 
        });
    });
}

quindi chiamalo con $ ('. item'). faderEffect ();


Questo non è lo stesso della dissolvenza gialla richiesta dall'utente.
Jon Winstanley

2
Destra. Sto suggerendo un'alternativa o "qualcosa di simile".
Corey

2

questa è la mia soluzione per il problema. funziona in modo eccellente. supera la convalida dell'errore jslint e funziona anche in modo decente in IE8 e IE9. Ovviamente puoi modificarlo per accettare codici colore e richiamate:

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});
};

1
che vantaggio ha questo rispetto all'evidenziazione di jQuery? docs.jquery.com/UI/Effects/Highlight
Nathan Koop,

1
bene nel mio caso non ho potuto usare l'interfaccia utente di Jquery. quindi mi è rimasto il compito di fissare una soluzione con solo Jquery.
molti

1

Questa è un'opzione non jQuery che puoi usare per l'effetto dissolvenza colore. Nell'array "colors", aggiungi i colori di transizione necessari dal colore iniziale fino all'ultimo colore. Puoi aggiungere tutti i colori che desideri.

   <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> 

0

Se desideri provare una tecnica alternativa di dissolvenza gialla che non dipende da jQuery UI .effect, puoi posizionare un div giallo (o un altro colore) dietro il tuo contenuto e utilizzare 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>

0

Ho semplicemente usato ...

<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>

0

Uno script semplice / grezzo per una "dissolvenza gialla", nessun plugin eccetto jquery stesso . Basta impostare lo sfondo con rgb (255,255, highlightcolor) in un timer:

<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>
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.