Ответ 1
Что происходит, так это то, что события мыши не обнаружены, потому что заполнение является "none", просто добавьте:
.bar {
fill: none;
pointer-events: all;
}
Тогда все работает отлично.
В этом фрагменте SVG (в FF 8, Safari 5.1.2, Chrome 16, все на Mac), при перемещении мыши над панелью, ни один из браузеров не обнаруживает каждое событие на мыши-переключение/выключение, иногда оно работает иногда это не так. Но он согласован во всех браузерах, поэтому он, вероятно, что-то касается SVG-кода. Использование onmouseover
и onmouseout
дает тот же результат - не работает должным образом.
Каков был бы правильный способ реализации при наведении на rect
углы SVG?
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="800" height="600" version="1.1" style="display:inline">
<style type="text/css">
.bar {
fill: none;
}
.bar:hover {
fill: red;
}
</style>
<g>
<rect class="bar" x="220" y="80" width="20" height="180" stroke="black" stroke-width="1" />
</g>
</svg>
Что происходит, так это то, что события мыши не обнаружены, потому что заполнение является "none", просто добавьте:
.bar {
fill: none;
pointer-events: all;
}
Тогда все работает отлично.
fill: none; pointer-event: all;
должен работать в большинстве современных браузеров, но IE9 и IE10 не поддерживают pointer-events
. Кроме того, вы также можете установить pointer-events: fill
. Это значение fill
только для SVG, то есть значение fill
или visibility
не влияет на обработку событий указателя.
Обходной путь для IE9 и IE10 - установить CSS на fill: transparent
, если pointer-events
не поддерживается (вы можете использовать Modernizr для обнаружения функций браузера).
$("#rect").mouseenter(function() {
$(this).css("fill", "teal")
}).mouseout(function(){
$(this).css("fill","transparent")
})
#rect {
fill: transparent;
stroke: blue;
stroke-width: 1px
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.0/jquery.min.js"></script>
<svg width=300 height=300>
<rect id="rect" x=0 y=0 width=100 height=100></rect>
</svg>
.bar:hover {
fill: red !important;
}
Попробуйте дать ему непрозрачную заливку.
Кроме того, <style>
должен выйти за пределы <svg>
.
Попробуйте сделать это через jQuery:
$(".bar").attr("disable","True");
$(".bar").css("background-color","Red");
$(".bar").mouseenter(function() {
$(this).attr("disable","False");
});
$(".bar").mouseleave(function() {
$(this).attr("disable","True");
});
Или, альтернативно:
$(".bar").hide();
$(".bar").css("background-color","Red");
$(".bar").mouseenter(function() {
$(this).show();
});
$(".bar").mouseleave(function() {
$(this).hide();
});