2009-05-11 8 views
94

Je voudrais mettre en œuvre quelque chose de similaire à 37Signals's Yellow Fade effect.effet de fondu jaune avec JQuery

J'utilise JQuery 1.3.2

Le code

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

et le spectacle d'appel suivant fondu jaune DOM Elment avec case id.

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

Mais cela ne fait que le rendre jaune. Pas de fond blanc après 15 000 millisecondes.

Une idée de pourquoi cela ne fonctionne pas?

Solution

Vous pouvez utiliser:

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

Mais vous devez inclure:

effects.core.js
effects.highlight.js

+0

La source de mise en évidence est ici: https://github.com/jquery/jquery-ui/blob/master/ui/jquery.ui.effect-highlight.js – styfle

Répondre

94

Cette fonction fait partie de jQuery effects.core.js:

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

Comme Steerpike a souligné dans les commentaires, effects.core.js et effects.highlight.js doivent être inclus afin d'utiliser.

+1

J'ai vu la démo sur le site de jquery http://docs.jquery.com/UI/Effects/Highlight#overview J'ai essayé dans mon code mais je ne fais rien. Dois-je télécharger un extra? Il dit dépendances: Effets Core. C'est un autre plugin. –

+0

Bonne réponse, mais je vais juste mentionner que c'est une fonction intégrée à jQuery effects.core.js, pas au fichier jQuery de base comme animate(). Je pensais juste que ça valait la peine d'être clarifié. – Steerpike

+5

Heh, comme Sergio a si évidemment juste découvert ... oui Sergio, vous devez inclure le fichier effects.core.js et effects.highlight.js (vérifiez la source ici: http://docs.jquery.com/UI/Effets/Surlignage) – Steerpike

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

Doit faire l'affaire. Réglez-le sur le jaune, puis fondu à blanc

+0

Merci pour la réponse. Cela ne fonctionne pas bien. Il semble que l'animation ne fasse rien. –

+0

quelle version de jQuery utilisez-vous? –

+0

1.3.2. J'ai ajouté ceci à ma question –

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 ligne this.style.removeAttribute('filter') est un bug anti-aliasing dans IE.

Maintenant, appelez YellowFade d'où, et passez votre sélection

YellowFade('#myDivId'); 

Crédit: Phil Haack avait une démo montrant exactement comment faire cela. Il faisait une démo sur JQuery et ASPNet MVC.

Take a look at this video

Mise à jour: Avez-vous jetez un oeil à la vidéo? J'ai oublié de mentionner que cela nécessite le JQuery.Color plugin

+0

La prochaine erreur est lancée par la ligne de filtre. J'utilise un fondu jaune dans un élément de ligne de tableau (tr) "this.style.removeAttribute n'est pas une fonction [Break on this error] this.style.removeAttribute ('filter');" –

7

Je viens de résoudre un problème similaire à celui-ci sur un projet sur lequel je travaillais. Par défaut, la fonction animée ne peut pas animer les couleurs. Essayez d'inclure jQuery Color Animations.

Toutes les réponses ici utilisent ce plugin mais personne ne le mentionne.

+1

Lien a déménagé: https://github.com/jquery/jquery-color –

+0

Merci Steven. J'ai mis à jour le post. – Travis

2

Je détestais ajouter 23kb juste pour ajouter effects.core.js et effects.highlight.js donc j'ai écrit ce qui suit.('Point').: Il émule le comportement en utilisant fadeIn (qui fait partie de jQuery lui-même) à 'flash' l'élément

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

puis appelez avec $ faderEffect();

+0

Ce n'est pas la même chose que le fondu jaune requis par l'utilisateur. –

+2

Droite. Je suggère une alternative ou "quelque chose de similaire". – Corey

3

En fait, j'ai une solution qui a seulement besoin de jQuery 1.3x, et pas de plugin additionnel.

D'abord, ajoutez les fonctions suivantes à votre 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) 
} 

Ensuite, appelez la fonction en utilisant ceci:

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

Je vous laisse deviner les paramètres, ils sont assez explicites. Pour être honnête, le script ne vient pas de moi, je l'ai pris sur une page puis l'ai changé pour qu'il fonctionne avec le dernier jQuery.

NB: testé sur Firefox 3 et IE 6 (oui, il fonctionne sur cette vieille chose aussi)

1

Ceci est une option non-jQuery vous pouvez utiliser pour l'effet de fondu des couleurs. Dans le tableau "couleurs", vous ajoutez les couleurs de transition dont vous avez besoin de la couleur initiale jusqu'à la dernière couleur. Vous pouvez ajouter autant de couleurs que vous le souhaitez.

<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

Si vous souhaitez essayer une technique de fondu jaune alternative qui ne dépend pas de .effect jQuery UI, vous pouvez placer un jaune (ou une autre couleur) div derrière votre contenu et utiliser le 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> 
60

La bibliothèque d'effets jQuery ajoute un peu de frais généraux inutiles à votre application. Vous pouvez accomplir la même chose avec jQuery seulement. 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

Merci, c'est mieux et je cherchais quelque chose avec lequel je peux éviter d'inclure le noyau de l'interface utilisateur qui était complètement inutile. – Dharmavir

+0

Vous rock. Exactement ce que je cherchais, sans ajouter un autre plugin. Et j'aime qu'il fasse une superposition de l'élément entier, au lieu de simplement changer la couleur d'arrière-plan de l'élément (qui pourrait être masquée par du texte, des boutons, etc.). –

+3

MISE À JOUR: ce code échouera souvent lors de la tentative de mise en évidence d'éléments flottants (c'est-à-dire lorsque l'élément est "float: right"). J'ai donc réécrit le code pour afficher la surbrillance correctement, peu importe comment l'élément est positionné sur la page: http://stackoverflow.com/a/13106698/1145177 –

60

J'aimé réponse Sterling Nichols, car il était léger et n'a pas besoin d'un plug-in. Cependant, j'ai découvert qu'il ne fonctionnait pas avec des éléments flottants (c'est-à-dire quand l'élément est "float: right"). Donc, je re-écrit le code pour afficher le point fort bien, peu importe la façon dont l'élément est positionné sur la page:

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

En option:
Utilisez le code suivant si vous voulez aussi correspondre au rayon de la frontière de l'élément:

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

J'adore cette solution. Fonctionne très bien sur les rangées de table. –

+0

Meilleure solution jusqu'à présent. S'il copiait également le rayon de la bordure de l'élément, ce serait toujours mieux. –

+0

@StijnVanBael Code maintenant mis à jour pour copier border-radius. Merci pour la suggestion. –

2

Ceci est ma solution au problème. cela fonctionne excellent. il passe la validation d'erreur de jslint et fonctionne également décent dans IE8 et IE9. Bien sûr, vous pouvez modifier pour accepter les codes couleurs et callbacks:

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

quel avantage cela at-il sur le point culminant de jQuery? http://docs.jquery.com/UI/Effects/Highlight –

+1

bien dans mon cas, je ne pouvais pas utiliser JQuery ui. donc je suis parti avec la fixation d'une solution avec seulement Jquery. – many

0

J'ai simplement utilisé ...

<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

Un script simple/brut pour un "fadeout jaune", aucun plug-ins, sauf jquery lui-même.couchait arrière-plan avec rgb (255255, highlightcolor) dans une minuterie:

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

Définir votre CSS comme suit:

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

Et ajouter la classe yft à tout élément $('.some-item').addClass('yft')

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

Questions connexes