Можете ли вы установить атрибуты высоты и ширины SVG где-нибудь на листе спрайта?

#html #css #svg

Вопрос:

Я пытаюсь использовать SVG самым чистым способом, используя лист спрайта, но что-то перемалывает мое снаряжение. Загруженные мной SVG-файлы поставляются с width height атрибутами a и примерно такими:

 <svg id="icon-ellipsis" width="21" height="5">
  <use href="/icons.svg#icon-ellipsis"></use>
</svg>
 

Я бы хотел, чтобы эти атрибуты были на листе спрайта, а не в разметке, потому что я думаю, что это было бы чище, тогда разметка ссылается только на значок и не имеет отношения к тому, как он должен выглядеть

Это также было бы более удобно. Если по какой-то причине вы хотите перечислить все свои SVG-файлы на листе спрайтов без какой-либо разметки (например, в начале проекта), то, если у них нет этих атрибутов, они будут выглядеть не так, как ожидалось, когда вы собираетесь их вызывать

Так или иначе, я попытался поместить их на <symbol> элемент, как это сделали бы вы, viewBox но, похоже, это не работает:

 <svg xmlns="http://www.w3.org/2000/svg">
  <symbol id="icon-ellipsis" width="21" height="5">
    <path d="M2.5 0a2.5 2.5 0 1 1 0 5 2.5 2.5 0 0 1 0-5Zm8 0a2.5 2.5 0 1 1 0 5 2.5 2.5 0 0 1 0-5Zm8 0a2.5 2.5 0 1 1 0 5 2.5 2.5 0 0 1 0-5Z" fill-rule="evenodd" />
  </symbol>
</svg>
 

Есть ли способ это сделать?

Ответ №1:

Вы можете использовать viewBox на symbol , width и height = 100% на svg , и, наконец, использовать width и height на use элементе.

  <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="100%" height="100%">
      <symbol id="icon-ellipsis" viewBox="0 0 21 5">
        <path d="M2.5 0a2.5 2.5 0 1 1 0 5 2.5 2.5 0 0 1 0-5Zm8 0a2.5 2.5 0 1 1 0 5 2.5 2.5 0 0 1 0-5Zm8 0a2.5 2.5 0 1 1 0 5 2.5 2.5 0 0 1 0-5Z" />
      </symbol>
      <use xlink:href="#icon-ellipsis" x="0" y="0" width="21" height="5" fill="blue" />
      <use xlink:href="#icon-ellipsis" x="0" y="100" width="100" height="25" fill="#eef" />
      <!-- Even uses with different width/height ratio get rendered ok because of viewBox attribute -->
      <use xlink:href="#icon-ellipsis" x="100" y="100" width="200" height="10" fill="#ff0" />
    </svg> 

Комментарии:

1. Спасибо @Alexandr_TT.

Ответ №2:

Короткий ответ: нет, вы не можете. Не с листом спрайта.

В любом случае это на самом деле не имеет смысла. Если вы хотите зафиксировать ширину и высоту ваших символов SVG в определенных значениях пикселей, то зачем использовать SVG? С таким же успехом вы можете просто использовать таблицу спрайтов PNG.