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.