Я создаю гексагональные плитки, используя SVG так:
<style>
.tile:hover {
fill: red;
}
</style>
<svg width="1000" height="1000">
<g>
<path
d="M-17.32050807568877,-10L0,-20L17.32050807568877,-10L17.32050807568877,10.000000000000002L0,20.000000000000004L-17.32050807568877,10.000000000000002"
class="tile"></path>
...
</g>
</svg>
У меня около 400 плиток на экране. Вы можете проверить, как это выглядит здесь: https://337706.playcode.io/
Попробуйте навести курсор на несколько плиток. Нависшие плитки должны стать красными, и нет проблем с производительностью.
Также не проблема, если я залью все плитки цветом:
<style>
.tile {
fill: green;
}
</style>
Я бы хотел заполнить плитки изображением, поэтому я создал шаблон:
<defs>
<pattern patternUnits="objectBoundingBox" id="grass" width="70" height="80">
<image href="https://i.ibb.co/9ZZgDhy/tiles.png"></image>
</pattern>
</defs>
А затем заполните плитки этим:
<style>
.tile {
fill: url(#grass);
}
.tile:hover {
fill: red;
}
</style>
После этого производительность резко падает. (вы можете проверить это здесь, но имейте в виду, что это может даже вызвать сбой вашего браузера: https://337697.playcode.io/)
Я проверил профилировщик в Chrome, он говорит, что 98% времени тратится на «Составные слои».
![enter image description here](https://i.stack.imgur.com/Kt86E.png)
Я заметил, что проблема не в самом изображении, а в <pattern>
, потому что даже если я удаляю изображение и помещаю вместо него только зеленый прямоугольник, производительность остается такой же плохой. Если я уберу узор и просто заполню плитку цветом, это не проблема ...
Как мне заполнить плитки изображением и устранить эту проблему с производительностью? Есть ли лучший способ установить фоновое изображение?