У меня сложная SVG-графика, которая является интерактивной. На этом рисунке есть конкретный значок, скажем, это значок конкретного человека в инфографике. Кроме того, SVG имеет 2000x2000 пикселей. Это означает, что на рабочем столе (альбомная компоновка) ему нужно будет обрезать некоторые элементы сверху и снизу, чтобы разместить их на экране. А в мобильном (портретный режим) нужно будет обрезать некоторые с правой и левой стороны. Учитывая это, я хотел бы, чтобы SVG был сосредоточен на этом человеке, и обрезал верх / низ в ландшафтном режиме и обрезал влево / вправо в портретном режиме. Это решает две задачи:
- Изображение всегда сосредоточено на этом человеке.
- Изображение всегда полностью заполняет доступное пространство, независимо от того, является ли это альбомным или портретным режимом.
Хотите знать, как это сделать. Если это должно быть сделано с помощью JavaScript, или если это может быть сделано исключительно в CSS.
Кроме того, этот SVG не может быть загружен в фоновое изображение для CSS, так как он является интерактивным. Это просто SVG.
Чтобы упростить задачу, можно сказать, что у нас есть <div>
с кучей вложенных элементов. Мы хотим, чтобы этот div центрировался на основе вложенного элемента, который он содержит. Похоже, для этого требуется какой-то JavaScript. То есть, при изменении размера окна или ориентации, получите смещение элемента, который мы хотим отцентрировать, затем выяснить, как настроить его для центрирования, а затем выяснить, как настроить parent.parent.parent ... и т. Д. пока вы не доберетесь до основного div-оболочки, который вы хотите закрепить в этой точке. Тогда мы просто переместим этот div на сколько угодно. Похоже, для этого требуется JavaScript, но я не знаю, может быть, есть способ сделать это простым CSS.
Хотите знать, можно ли продемонстрировать, как это сделать, в JS или CSS?
Вот что у меня есть.
// the box should be centered in the screen
<!doctype html>
<html>
<head>
<style>
html, body {
margin: 0;
padding: 0;
overflow: hidden;
width: 100vw;
height: 100vh;
}
svg {
display: block;
}
@media (orientation: landscape) {
svg {
width: 100vw;
height: auto;
}
}
@media (orientation: portrait) {
svg {
width: auto;
height: 100vh;
}
}
</style>
</head>
<body>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 2000 2000">
<rect width='100' height='100' x="1000" y="1000" />
</svg>
</body>
</html>
Обратите внимание, что (https://imgur.com/PnugEin) на мобильном телефоне не заполняет пространство должным образом. Черный ящик всегда должен быть в центре, а весь SVG должен масштабироваться так, чтобы он охватывал весь видовой экран, сохраняя при этом черный ящик в центре.
Обновление : Хорошо, разобрался с проблемой "заполнения окна просмотра", добавив медиа-запросы. Последнее, что нужно сделать, это отцентрировать его на основе прямоугольника / точки привязки.