Наилучшим вариантом является использование значения objectBoundingBox
для свойства clipPathUnits
, применяемого к элементу <clipPath />
. Это решение вообще не нуждается в js
.
Должно быть что-то вроде этого:
<svg class="svg">
<defs>
<clipPath id="clip" clipPathUnits="objectBoundingBox">
<path d="..."></path>
</clipPath>
</defs>
</svg>
Чтобы затем применить маску, как вы делаете здесь , что-то вроде:
.elem {
clip-path: url(#clip);
}
Здесь - это полный рабочий пример, а здесь - детали кода для игры.
Важный совет
Вы должны реэкспортировать svg
для совместимости с clipPathUnits
реквизитом.
Цитата Сары Соуэдан из этой полезной статьи
Здесь важно отметить, что при использовании значения objectBoundingBox
координаты, указанные для содержимого <clipPath>
, должны находиться в диапазоне [0, 1] - система координат становится системой единиц, и координаты фигур внутри clipPath
должны быть дробями в этом диапазоне.
Чтобы воспроизвести демо , я снова открываю svg
с помощью Adobe Illustrator (но это может быть любая программа векторного редактора) и масштабирую / помещаю path
в холст. 1x1 пикселей, затем реэкспортируется и вуаля!