Ответ 1
Эта функция является частью jQuery effects.core.js:
$("#box").effect("highlight", {}, 1500);
Как заметил Стирпайк в комментариях, effects.core.js и effects.highlight.js необходимо включить, чтобы использовать это.
Я хотел бы реализовать нечто похожее на 37Signals Yellow Fade effect.
Я использую JQuery 1.3.2
Код
(function($) {
$.fn.yellowFade = function() {
return (this.css({backgroundColor: "#ffffcc"}).animate(
{
backgroundColor: "#ffffff"
}, 1500));
}
})(jQuery);
а следующий вызов показывает, что желтый цвет исчезает с идентификатором DOM с идентификатором окна.
$("#box").yellowFade();
Но это только делает его желтым. Без белого фона после 15000 миллисекунд.
Любая идея, почему она не работает?
Решение
Вы можете использовать:
$("#box").effect("highlight", {}, 1500);
Но вам нужно будет включить:
effects.core.js
effects.highlight.js
Эта функция является частью jQuery effects.core.js:
$("#box").effect("highlight", {}, 1500);
Как заметил Стирпайк в комментариях, effects.core.js и effects.highlight.js необходимо включить, чтобы использовать это.
Библиотека эффектов jQuery добавляет в приложение довольно много лишних накладных расходов. Вы можете выполнить одно и то же с помощью 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();
Мне понравился ответ Стерлинга Николса, поскольку он был легким и не требовал плагина. Однако я обнаружил, что он не работает с плавающими элементами (например, когда элемент "float: right" ). Поэтому я переписал код, чтобы правильно отображать выделение независимо от того, как элемент расположен на странице:
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(); });
});
}
Дополнительно:
Используйте следующий код, если вы также хотите сопоставить граничный радиус элемента:
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(); });
});
}
(function($) {
$.fn.yellowFade = function() {
this.animate( { backgroundColor: "#ffffcc" }, 1 ).animate( { backgroundColor: "#ffffff" }, 1500 );
}
})(jQuery);
Должен сделать трюк. Установите его на желтый, затем потушите его до белого.
Я только что решил проблему, подобную этой, над проектом, над которым я работал. По умолчанию функция анимации не может анимировать цвета. Попробуйте включить jQuery Color Animations.
Все ответы здесь используют этот плагин, но никто не упоминает об этом.
Определите свой CSS следующим образом:
@-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;
}
И просто добавьте класс yft
к любому элементу $('.some-item').addClass('yft')
На самом деле, у меня есть решение, для которого требуется только jQuery 1.3x, и никакого плагина aditionnal.
Сначала добавьте следующие функции в 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)
}
Затем вызовите функцию, используя следующую команду:
doBGFade( $(selector),[245,255,159],[255,255,255],'transparent',75,20,4 );
Я дам вам угадать параметры, они довольно понятны. Честно говоря, script не от меня, я взял его на странице и изменил его, чтобы он работал с последним jQuery.
NB: проверено на firefox 3 и ie 6 (да, это работает и на этой старой вещи)
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');
});
}
Линия this.style.removeAttribute('filter')
предназначена для ошибки сглаживания в IE.
Теперь вызовите функцию YellowFade откуда угодно и передайте селектор
YellowFade('#myDivId');
Кредит. У Фила Хаака была демонстрация, показывающая, как это сделать. Он делал демонстрацию в JQuery и ASPNet MVC.
Обновление. Вы посмотрели видео? Для этого требуется плагин JQuery.Color
Я ненавидел добавление 23kb только для добавления эффектов .core.js и effects.highlight.js, поэтому я написал следующее. Он эмулирует поведение, используя fadeIn (который является частью самого jQuery) для "flash" элемента:
$.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);
});
});
}
затем вызовите его с помощью $('. item'). faderEffect();
Это мое решение проблемы. он отлично работает. он передает проверку ошибок jslint, а также работает достойно в IE8 и IE9. Конечно, вы можете настроить его, чтобы принимать цветовые коды и обратные вызовы:
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});
};
Это параметр, отличный от jQuery, который вы можете использовать для эффекта затухания цвета. В массиве "colors" вы добавляете цвета перехода, которые вам нужны, от начального цвета до последнего цвета. Вы можете добавить столько цветов, сколько хотите.
<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>
Если вы хотите попробовать альтернативную технологию желтого затухания, которая не зависит от jQuery UI.effect, вы можете поместить желтый (или другой цвет) div за свой контент и использовать jQuery.fadeOut().
<div class="yft">
<div class="content">This is some content</div>
<div class="yft_fade"> </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>
Я просто использовал...
<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>
Простой/raw script для "желтого fadeout", нет плагинов, кроме самого jquery. Просто установите фон с rgb (255,255, highlightcolor) в таймере:
<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>