Efekt blaknięcia żółtego z JQuery

100

Chciałbym zaimplementować coś podobnego do efektu Yellow Fade w 37Signals.

Używam Jquery 1.3.2

Kod

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

a następne wywołanie pokaże żółty zanik elementu DOM z identyfikatorem pola .

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

Ale to tylko sprawia, że ​​jest żółty. Brak białego tła po 15000 milisekundach.

Masz jakiś pomysł, dlaczego to nie działa?

Rozwiązanie

Możesz użyć:

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

Ale musisz dołączyć:

effects.core.js
effects.highlight.js

Sergio del Amo
źródło
Źródło podświetlenia jest tutaj: github.com/jquery/jquery-ui/blob/master/ui/…
styfle

Odpowiedzi:

98

Ta funkcja jest częścią jQuery effects.core.js :

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

Jak zauważył Steerpike w komentarzach, żeby z tego skorzystać, należy uwzględnić efekty.core.js i effects.highlight.js .

Baldu
źródło
1
Widziałem demo w witrynie jquery docs.jquery.com/UI/Effects/Highlight#overview Próbowałem w moim kodzie, ale nic nie robiłem . Czy muszę pobierać dodatkowe pliki. Mówi o zależnościach: rdzeń efektów. To jest kolejna wtyczka.
Sergio del Amo
Prawidłowa odpowiedź, ale wspomnę tylko, że jest to funkcja wbudowana w jQuery effects.core.js, a nie do podstawowego pliku jQuery jako animate (). Pomyślałem, że warto to wyjaśnić.
Steerpike
5
Heh, jak Sergio właśnie odkrył ... tak Sergio, musisz dołączyć plik effects.core.js i effects.highlight.js (sprawdź źródło tutaj: docs.jquery.com/UI/Effects/Highlight )
Steerpike
2
Jest to dostępne w interfejsie użytkownika jQuery: docs.jquery.com/UI/Effects/Highlight#overview
Matt Scilipoti,
7
W ramach aktualizacji poprzednich komentarzy nie dodajesz już efektów effects.core.js i effects.highlight.js (a te stare adresy URL już nie działają). Nowym sposobem na uwzględnienie tego jest dołączenie biblioteki jquery-ui: code.jquery.com/ui/1.10.4/jquery-ui.min.js
Sean Colombo,
66

Uwielbiałem odpowiedź Sterling Nichols, ponieważ była lekka i nie wymagała wtyczki. Jednak odkryłem, że nie działa z elementami pływającymi (np. Gdy element jest „float: right”). Dlatego ponownie napisałem kod, aby poprawnie wyświetlać wyróżnienie bez względu na to, jak element jest umieszczony na stronie:

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

Opcjonalnie:
użyj poniższego kodu, jeśli chcesz również dopasować border-radius elementu:

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.
źródło
9
Uwielbiam to rozwiązanie. Świetnie sprawdza się w wierszach tabeli.
Perry Tew
Jak dotąd najlepsze rozwiązanie. Gdyby skopiował również promień obramowania elementu, byłby jeszcze lepszy.
Stijn Van Bael
Kod @StijnVanBael został teraz zaktualizowany, aby kopiować border-radius. Dziękuję za sugestię.
Doug S
To jest niesamowite, nie potrzebuję teraz biblioteki UI, ale moim problemem jest to, że nie podświetli całego mojego div przy pierwszym użyciu, prawdopodobnie dlatego, że jego część jest pusta, a tekst jest ustawiony tuż przed wywołaniem tego?
NaughtySquid
Fajnie, ale wygląda na to, że nie działa na modach, takich jak FeatherlightJs.
Ryan
64

Biblioteka efektów jQuery dodaje trochę niepotrzebnych kosztów do Twojej aplikacji. Możesz osiągnąć to samo tylko z 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
źródło
4
Dzięki, to jest lepsze i szukałem czegoś, dzięki czemu mogę uniknąć włączenia pełnego rdzenia interfejsu użytkownika, który był całkowicie niepotrzebny.
deej
Rządzisz. Dokładnie to, czego szukałem, bez dodawania kolejnej wtyczki. I podoba mi się, że robi faktyczną nakładkę całego elementu, w przeciwieństwie do zwykłej zmiany koloru tła elementu (który może być zakryty tekstem, przyciskami itp.).
Doug S,
3
AKTUALIZACJA: Ten kod często kończy się niepowodzeniem przy próbie podświetlenia elementów pływających (tj. Gdy element ma wartość „float: right”). Dlatego ponownie napisałem kod, aby poprawnie wyświetlać wyróżnienie bez względu na to, jak element jest umieszczony na stronie: stackoverflow.com/a/13106698/1145177
Doug S
Dzięki za aktualizację Doug… Będę musiał zaktualizować moje własne biblioteki.
Sterling Nichols
2
Ładne, lekkie rozwiązanie - działa naprawdę dobrze. Zauważyłem, że moje wyróżnienia nie zawierały wypełnienia elementów, więc użyłem .width(el.outerWidth())i .height(el.outerHeight())do wyróżnienia wszystkich pól formularza.
Mark B,
13

Zdefiniuj swój CSS w następujący sposób:

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

I po prostu dodaj klasę yftdo dowolnego elementu$('.some-item').addClass('yft')

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

Kamran Ahmed
źródło
8
(function($) {
  $.fn.yellowFade = function() {
    this.animate( { backgroundColor: "#ffffcc" }, 1 ).animate( { backgroundColor: "#ffffff" }, 1500 );
  }
})(jQuery);

Powinien załatwić sprawę. Ustaw go na żółty, a następnie zmień go na biały


źródło
Dziękuję za odpowiedź. To jednak nie działa. Wygląda na to, że animacja nic nie robi.
Sergio del Amo
jakiej wersji jQuery używasz?
1.3.2. Dodałem to do mojego pytania
Sergio del Amo
To działało dobrze dla moich celów bez żadnych zależności poza waniliowym jquery.
gojomo
3
Do działania potrzebna jest wtyczka jQuery.Color (): github.com/jquery/jquery-color
Dia Kharrat Kwietnia
7

Właśnie rozwiązałem problem podobny do tego w projekcie, nad którym pracowałem. Domyślnie funkcja animacji nie może animować kolorów. Spróbuj dołączyć animacje kolorów jQuery .

Wszystkie odpowiedzi tutaj używają tej wtyczki, ale nikt o niej nie wspomina.

Travis
źródło
3

Właściwie mam rozwiązanie, które wymaga tylko jQuery 1.3x i żadnej dodatkowej wtyczki.

Najpierw dodaj do skryptu następujące funkcje

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

Następnie wywołaj funkcję za pomocą tego:

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

Pozwolę ci odgadnąć parametry, są one dość oczywiste. Szczerze mówiąc, skrypt nie jest ode mnie, wziąłem go na stronę, a następnie zmieniłem, aby działał z najnowszym jQuery.

Uwaga: testowane na Firefoksie 3 i tj. 6 (tak, działa też na tej starej rzeczy)


źródło
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');
              });
}

Linia this.style.removeAttribute('filter')dotyczy błędu wygładzania krawędzi w IE.

Teraz zadzwoń do YellowFade z dowolnego miejsca i przekaż swój selektor

YellowFade('#myDivId');

Kredyt : Phil Haack miał demo pokazujące dokładnie, jak to zrobić. Robił demo na JQuery i ASPNet MVC.

Spójrz na ten film

Aktualizacja : czy obejrzałeś wideo? Zapomniałem wspomnieć, że wymaga to wtyczki JQuery.Color

Vin
źródło
Kolejny błąd jest generowany przez linię filtra. Używam żółtego zanikania w elemencie wiersza tabeli (tr) "this.style.removeAttribute nie jest funkcją [Przerwa w tym błędzie] this.style.removeAttribute ('filter');"
Sergio del Amo
2

Nienawidziłem dodawania 23kb tylko po to, aby dodać efekty.core.js i effects.highlight.js, więc napisałem co następuje. Emuluje to zachowanie, używając fadeIn (który jest częścią samego jQuery) do „flashowania” elementu:

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

następnie wywołaj go za pomocą $ ('. item'). faderEffect ();

Corey
źródło
To nie to samo, co żółte zanikanie, którego wymagał użytkownik.
Jon Winstanley,
2
Dobrze. Proponuję alternatywę lub „coś podobnego”.
Corey
2

to jest moje rozwiązanie problemu. działa doskonale. przechodzi walidację błędów jslint, a także działa przyzwoicie w IE8 i IE9. Oczywiście możesz go dostosować, aby akceptował kody kolorów i wywołania zwrotne:

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});
};
wiele
źródło
1
jakie ma to zalety w porównaniu z wyróżnieniem jQuery? docs.jquery.com/UI/Effects/Highlight
Nathan Koop
1
cóż, w moim przypadku nie mogłem użyć interfejsu użytkownika Jquery. więc zostałem z naprawieniem rozwiązania za pomocą tylko Jquery.
wiele
1

Jest to opcja inna niż jQuery, której można użyć w celu uzyskania efektu zanikania kolorów. W tablicy „colors” dodajesz potrzebne kolory przejścia od koloru początkowego do ostatniego. Możesz dodać tyle kolorów, ile chcesz.

   <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
źródło
0

Jeśli chcesz wypróbować alternatywną technikę żółtego zanikania, która nie zależy od efektu interfejsu użytkownika jQuery, możesz umieścić żółty (lub inny kolor) element div za treścią i użyć 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
źródło
0

Po prostu użyłem ...

<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
źródło
0

Prosty / surowy skrypt dla "żółtego zanikania", bez wtyczek z wyjątkiem samego jquery . Po prostu ustawiam tło za pomocą rgb (255,255, highlightcolor) w zegarze:

<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
źródło
0

POTRZEBUJESZ TYLKO HTML DO TO ZROBIENIA. Nie jest wymagany CSS ani JS!

Załóżmy, że na określonej stronie znajduje się tekst, który chcesz tymczasowo „podświetlić i pokazać” użytkownikom odwiedzającym stronę.

I niech treść na tej stronie będzie podświetlona jako tag h2 i zawartość tagu ap, jak pokazano poniżej:


<h2>Carbon Steel for Blacksmithing</h2>

<p>The vast majority of blacksmithing uses low and medium carbon steels. High carbon steel, sometimes called “carbon tool steel,” is very hard, and difficult to bend or weld; it gets very brittle once it’s been heat-treated.</p>
<p>You can buy steel, or you can find and recycle. I prefer the later.</p>

Podane poniżej: łącze, które RZECZYWISTE podświetli treść pokazaną powyżej. Za każdym razem, gdy użytkownik kliknie ten link ... zostaje przekierowany na stronę w to samo miejsce, w którym znajduje się treść, a także tekst jest podświetlony!

https://stackoverflow.com/questions/848797/yellow-fade-effect-with-jquery/63571443#:~:text=Carbon%20Steel%20for%20Blacksmithing,you%20can%20find%20and%20recycle.

Aby dać przykład na żywo: kliknij link podany powyżej, aby zobaczyć efekt podświetlenia treści, o którym wspomniałem w linku.

Ashutosh Khanduala
źródło