Как сделать элемент <svg> разворачиваться или сжиматься до его родительского контейнера?
Цель состоит в том, чтобы элемент <svg>
расширялся до размера его родительского контейнера, в данном случае a <div>
, независимо от того, насколько большой или маленький этот контейнер может быть.
Код:
<style>
svg, #container{
height: 100%;
width: 100%;
}
</style>
<div id="container">
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" >
<rect x="0" y="0" width="100" height="100" />
</svg>
</div>
Наиболее распространенным решением этой проблемы является установка атрибута viewBox
в элементе <svg>
.
viewBox="0 0 widthOfContainer heightOfContainer"
Однако это не работает в тех случаях, когда элементы в элементе <svg>
имеют предопределенные ширины и/или высоты. Например, элемент <rect>
в приведенном выше коде имеет явно заданную ширину и высоту.
Таким образом, очевидным решением является использование% width и% высот для этих элементов. Но это даже нужно сделать? Тем более, что <img src=test.svg >
работает нормально и без каких-либо проблем расширяет/заключает контракты с явно установленными высотами и ширинами <rect>
.
Если такие элементы, как <rect>
и другие подобные ему элементы, должны иметь свои ширины и высоты, определенные в процентах, есть способ в Inkscape установить его так, чтобы все элементы с документом <svg>
использовали процентную ширину, высоты и т.д. вместо фиксированных размеров?
Ответы
Ответ 1
viewBox
не высота контейнера, а размер вашего чертежа. Определите, что ваш viewBox
должен быть 100 единиц по ширине, а затем укажите rect
как 10 единиц. После этого, насколько бы вы не масштабировали SVG, rect
будет на 10% шириной изображения.
Ответ 2
Предположим, что у меня есть SVG, который выглядит так:
![pic1]()
И я хочу поместить его в div и сделать его заполняющим div. Мой способ сделать это следующим образом:
Сначала я открываю SVG файл в приложении, таком как inkscape. В "Файл- > Свойства документа" установите ширину документа на 800 пикселей и высоту до 600 пикселей (вы можете выбрать другие размеры). Затем я вписываю SVG в этот документ.
![pic2]()
Затем я сохраняю этот файл как новый SVG файл и получаю данные пути из этого файла.
Теперь в HTML код, который делает магию, выглядит следующим образом:
<div id="containerId">
<svg
id="svgId"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
version="1.1"
x="0"
y="0"
width="100%"
height="100%"
viewBox="0 0 800 600"
preserveAspectRatio="none">
<path d="m0 0v600h800v-600h-75.07031l-431 597.9707-292.445315-223.99609 269.548825-373.97461h-271.0332z" fill="#f00"/>
</svg>
</div>
Обратите внимание, что ширина и высота SVG равны 100%, так как мы хотим, чтобы он заполнил контейнер вертикально и горизонтально, но ширина и высота viewBox совпадают с шириной и высотой документа в inkscape, что 800 пикселей x 600 пикселей. Следующее, что вам нужно сделать, это установить для параметра preserveAspectRatio значение "none". Если вам нужна дополнительная информация об этом атрибуте, используйте ссылку . И все это к нему.
Еще одна вещь заключается в том, что этот код работает почти во всех основных браузерах, даже в старых, но в некоторых версиях android и ios вам нужно использовать некоторый код javascrip/jQuery, чтобы он был последовательным. Я использую следующие функции документа и изменения размера:
$('#svgId').css({
'width': $('#containerId').width() + 'px',
'height': $('#containerId').height() + 'px'
});
Надеюсь, что это поможет!
Ответ 3
В последнее время мне удалось удалить все атрибуты height=""
и width=""
из тега <svg>
и всех дочерних тегов. Затем вы можете использовать масштабирование, используя процент от высоты или ширины родительского контейнера.
Ответ 4
@robertc имеет это право, но вы также должны заметить, что svg, #container
вызывает масштабирование svg экспоненциально для чего угодно, кроме 100% (один раз для #container
и один раз для svg
).
Другими словами, если бы я применил 50% ч/б к обоим элементам, это фактически 50% от 50% или .5 *.5, что равно 25 или 25%.
Один селектор отлично работает, когда используется, как предлагает @robertc.
svg {
width:50%;
height:50%;
}
Ответ 5
Для вашего iphone Вы можете использовать в своем головном баласте:
"width=device-width"