#html #css #svg
#HTML #css #svg
Вопрос:
Я использую Bootstrap 4, и на моей веб-странице есть простой svg
элемент:
<svg>
<polygon points="0,0 20,5 0,10" style="fill: black; stroke: black;" />
<polygon points="20,0 40,5 20,10" style="fill: black; stroke: black;" />
</svg>
И чтобы показать, сколько дополнительного пространства использует элемент, я создал рамку вокруг элемента:
<style>
svg {
border: 1px solid black;
}
</style>
Графика очень простая и отображается в основном так, как должна, вот так:
Но я не понимаю, почему так много дополнительных пробелов справа и внизу. Я перепробовал все, что мог придумать, чтобы просто привести контейнер в соответствие с реальным содержимым: добавление viewBox="0 0 20 40"
к svg
тегу просто раздувает графику, делая ее огромной, и viewPort
ничего не делает. Я перепробовал кучу других «трюков» CSS и помещал графику внутри собственного div
элемента, но все это никак не повлияло на внешний вид графики.
Я не помню, чтобы раньше сталкивался с этой проблемой. Добавляет ли Bootstrap дополнительный стиль к svg
графике, который я должен переопределить, или это нормально? Ценю любую помощь о том, как это исправить.
Комментарии:
1. вы можете исправить эту проблему, указав ширину и высоту для вашего SVG элемента, я думаю.
2. Вы создаете это с помощью Adoce illustrator?
Ответ №1:
Когда у встроенного заменяемого элемента явно не заданы ни ширина, ни высота, по умолчанию он будет равен 300px * 150px. (Здесь указаны фактические правила)
Это правило касается <iframe> <video> <canvas> и <svg>.
Чтобы избежать этого, задайте ширину или высоту для вашего <svg> (либо с помощью его атрибутов, либо с помощью CSS.
svg {
border: 1px solid;
width: 150px;
height: 150px;
}
<svg viewBox="0 0 40 40">
<polygon points="0,0 20,5 0,10" style="fill: black; stroke: black;" />
<polygon points="20,0 40,5 20,10" style="fill: black; stroke: black;" />
</svg>
Ответ №2:
Как упоминает Кайидо, вам нужно объявить атрибут viewBox для svg элемента. Чтобы вычислить размер окна просмотра, я использую, чтобы обернуть все в <g>
элемент и использовать метод getBBox()
для этого <g>
элемента.
В этом случае метод возвращает следующую ограничивающую рамку: {x:0,y:0,height:40,width:10}
.
Окно просмотра, которое вам нужно, это: viewBox="0 0 40 10"
.
Поскольку ваши полигоны имеют обводку, вам нужно немного дополнительного пространства, поэтому я использовал viewBox="-1 -1 42 12"
Вам не нужно сохранять <g id="test">
перенос.
svg{border:1px solid}
<svg viewBox="-1 -1 42 12">
<g id="test">
<polygon points="0,0 20,5 0,10" style="fill: black; stroke: black;" />
<polygon points="20,0 40,5 20,10" style="fill: black; stroke: black;" />
</g>
</svg>