Изучаю SVG графику. Пытаюсь сделать логотип, хочу что бы при наведении заливка менялась у самого блока и у буквы, это сделать получилось, так же хотелось, чтобы появлялась обводка у блока, но если делать это средствами SVG, то она получается совершенно не четкая.
<svg height='50' width='50' vievBox='0 0 50 50'>
<style>
.polylogobox {
fill: #ef402a;
transition: .2s;
}
.polylogobox:hover {
fill: #fff;
stroke: #ef402a;
stroke-width: 3px;
}
.polylogobox:hover + text {
fill: #ef402a;
}
text {
font-size: 30px;
fill: #fff;
font-family: Arial, sans-serif;
transition: .2s;
}
</style>
<polygon class='polylogobox' points='0,0 24,0 28,5 50,5, 50,50 0,50 '/>
<text x='14' y='38'>E</text>
</svg>
Как это можно исправить?
В первый ответ добавил красную рамку style="border:1px solid red;"чтобы видно было реальные границы svg.
Именно столько места 150x150px будет занимать иконка при верстке Html странички, образуя тем самым большие отступы от остальных элементов странички.
Нужно расширить viewBox но всего на 6px, чтобы сделать отступы минимальными - 3px
И так: viewBox="-3 -3 56 56"
Ниже полный код. Красную рамку оставил для наглядности:
<svg height="56" width="56" viewBox="-3 -3 56 56" style="border:1px solid red;" >
<style>
.polylogobox {
fill:#ef402a;
transition: .2s;
}
.polylogobox:hover {
fill: #fff;
stroke: #ef402a;
stroke-width: 3px;
}
.polylogobox:hover + text {
fill: #ef402a;
}
text {
font-size: 30px;
fill: #fff;
font-family: Arial, sans-serif;
transition: .2s;
}
</style>
<polygon class='polylogobox' points='0,0 24,0 28,5 50,5, 50,50 0,50 '/>
<text x='14' y='38' pointer-events="none">E</text>
</svg>
По замечаниям в комментариях
Текст находится на слой выше полигона <polygon> поэтому экранирует :hover на букве.
Для устранения экранирования применим к тексту стиль pointer-events="none", который сделает текст прозрачным для событий мышки.
<text x='14' y='38' pointer-events="none">E</text>
В вашем примере stroke везде одинаковой толщины, нужно лишь изменить поле видимости, то есть viewBox и размеры самого SVG, вот исправленный пример:
.polylogobox {
fill: #ef402a;
transition: 0.2s;
}
.polylogobox:hover {
fill: #fff;
}
.polylogobox:hover+text {
fill: #ef402a;
}
text {
font-size: 30px;
fill: #fff;
font-family: Arial, sans-serif;
transition: 0.2s;
pointer-events: none;
}
<svg height='150' width='150' viewBox="-10 -10 150 150" style="Border:1px solid red;">
<polygon class='polylogobox' points='0,0 24,0 28,5 50,5, 50,50 0,50' stroke-width="4" stroke="#ef402a"/>
<text x='14' y='38'>E</text>
</svg>
Сборка персонального компьютера от Artline: умный выбор для современных пользователей