Как добавить и удалить свечение для элемента Рафаэля?
Я пытаюсь настроить зависание элемента raphael, так что когда мышь находится на элементе, у него есть свечение, и когда мышь уходит, свечение удаляется. Я понял, как добавить свечение, но у меня проблемы с его устранением. Вот как выглядит мой script:
$(document).ready(function() {
var paper = Raphael(0,0,360,360);
var myCircle = paper.circle(180,180,30).attr('stroke','#FFF');
myCircle.hover(function() {
myCircle.glow().attr('stroke','#FFF');
}, function() {
// removing the glow from the circle??
});
});
Итак, часть, которая работает, добавляет свечение к кругу, когда я навис над ним. Тем не менее, я не знаю, как удалить свечение, когда мышь удаляется от элемента круга. Знаете ли вы, как я могу удалить свечение из элемента?
Примечание. Фон элемента body установлен на черный (# 000).
Используемые библиотеки:
Ответы
Ответ 1
Решение, вероятно, более просто, чем вы думали.
http://jsfiddle.net/vszkW/2/ (fork from Matt скрипка)
Вам просто нужно запастись "свечением", который является элементом. Как обычно в Рафаэле, элементы имеют .remove():
myCircle.hover(
// When the mouse comes over the object //
// Stock the created "glow" object in myCircle.g
function() {
this.g = this.glow({color: "#FFF", width: 100});
},
// When the mouse goes away //
// this.g was already created. Destroy it!
function() {
this.g.remove();
});
Ответ 2
Хорошо, немного взломать.
Вы не сможете легко удалить свечение, потому что свечение на самом деле представляет собой массив элементов, по какой-то причине не существует функции removeGlow, которая захватывает и прибивает их.
Вот что я придумал, у меня на самом деле есть проект прямо сейчас, который нуждался в этой функции, пришел сюда, чтобы исправить это, и решил, что я придумаю что-то, увидев ваш пост.
Хорошо, шаг 1:
Добавьте пустой массив над вашим материалом init, это будет держать ваши свечения.
var glowsToBeRemoved = [];
Шаг 2. Перейдите в raphael.js и найдите (в пределах elproto.glow):
for (var i = 1; i < c + 1; i++) {
out.push(r.path(path).attr({
stroke: s.color,
fill: s.fill ? s.color : "none",
"stroke-linejoin": "round",
"stroke-linecap": "round",
"stroke-width": +(s.width / c * i).toFixed(3),
opacity: +(s.opacity / c).toFixed(3)
}));
}
Сразу после этого (и до возвращения) добавьте:
glowsToBeRemoved.push(out);
Итак, что это делает, толкает все свечения, когда они создаются в массив.
Теперь, чтобы удалить их, вы должны создать цикл с .remove(); на ваших зависаниях. Вот как это будет выглядеть:
var i = 0;
var size=glowsToBeRemoved.length;
for(i=0; i < size; i++)
{
glowsToBeRemoved[i].remove();
}
Вы можете разбить это на функцию и прикрепить ее к вашему зависанию или тому, что вы хотите с ней сделать.
Хорошо выглядеть?
Ответ 3
В то время как ответ Lajarre определенно подходит, в настоящее время есть ошибка в Raphael, в результате чего метод remove() не только удаляет элемент свечения, но также и элемент, к которому применяется свечение.
Почему это все еще работает в скрипке Ладжарра, не в моих силах.
Подробнее об этой проблеме см. здесь:
https://github.com/DmitryBaranovskiy/raphael/issues/508
Ответ 4
Это странное поведение. Например (я проделал это в течение нескольких минут):
http://jsfiddle.net/FPE6y/
Насколько я могу судить, это не должно происходить. Возможно, ошибка. У RaphaelJS, как представляется, исторически сложилось впечатление, что у него нет проблем: Как сделать элемент неустранимым в Рафаэле?
Извините, я не могу представить решение, за исключением того, что, возможно, круг стирается и сразу заменяется новым, у которого никогда не было эффекта свечения?
Между тем сообщать о поведении в GitHub, если он еще не существует. Вы можете ссылаться на мой jsFiddle в отчете, если хотите (или разблокировать его и отправить самостоятельно).
Ответ 5
Вот как я добавляю/удаляю эффект свечения с помощью Raphael:
paper.circle(x, y, r)
.attr({fill: "lightblue", stroke: "lightblue", "stroke-width": 6})
.hover(function() {
this.glowEffect = this.glow({color:"#1693A5", width: 2});
}, function() {
this.glowEffect.remove();
})
.id = "example";
Я просто добавляю ".hover" к элементу Рафаэля.
Вы также можете сделать что-то вроде:
var c = paper.circle(x, y, r);
c.hover(function() {
this.glowEffect = this.glow({color:"#1693A5", width: 2});
}, function() {
this.glowEffect.remove();
});