Skip to content

Туториал по работе с svg #53

@tyanas

Description

@tyanas
  1. добавление свг напрямую (<svg:svg>...). Зачем нужен namespace

  2. типичный кейс свг для иконок как symbol (<b:svg>...)
    2.1 symbol надо готовить

    2.2 типичный пример <b:svg use="/pathToSvgDefs/symbol-defs.svg#iconSvg-desktop"></b:svg> (c) @sm0g

    2.3 символы хороши тем, что
    - они эффективно переиспользуются на странице ( в отличие от "инлайн" svg)
    - можно менять цвет с помощью css (on hover) (в отличие от вставки svg как background: url(icon.svg))

  3. надо заресерчить, почему по некоторым (или по всем?) иконкам в ИЕ не получается кликать

вопросы из https://gitter.im/basisjs/basisjs

  1. @sm0g почему не ренднрятся SVG элементы (Chrome) в темплейтах?
<svg aria-hidden="true" class="octicon octicon-plus" width="12" height="16" role="img" version="1.1" viewBox="0 0 12 16">
    <path d="M12 9H7v5H5V9H0V7h5V2h2v5h5v2z"></path>
</svg>

Ответ: нужен namespace, см ниже

  1. @harvyso февр. 07 12:43
    работает ли basisjs c SVG также как c HTML DOM, есть примеры?
    template: "<b:svg><circle cx='10' cy='20' r='10' /></b:svg>"
    svg добавлен как element, но почему circle как text node?
    добавление xmlns:svg = 'http://www.w3.org/2000/svg' и изменение circle на svg:circle не помогает.
    можете пояснить как обстоит дело с SVG!?

ответы к 2:

Alexey Smirnov @sm0g февр. 07 13:34
Я делал через use <b:svg use="/pathToSvgDefs/symbol-defs.svg#iconSvg-desktop"></b:svg>
попробуйте объявить svg элементы в отдельном файле (спрайты) добавить в шаблон. Далее использовать через use

Roman Dvornov @lahmatiy февр. 07 22:09
работает так же как с HTML, но нужно добавлять префикс svg:, то есть правильно будет
template: "<svg:svg><svg:circle cx='10' cy='20' r='10' /></svg:svg>"

Когда svg вставляется в html, то браузерный парсер неявно добавляет неймспейс узлам
Но если вы сделаете document.createElement('svg'), то будет создана HTML нода, а не SVG. Для того чтобы сделать правильно, нужно document.createElementNS('svg', 'http://www.w3.org/2000/svg')
по идее при вставке в html нужно писать так
<svg:svg xmlns:svg="http://www.w3.org/2000/svg"><svg:circle cx='10' cy='20' r='10' /></svg:svg>
но это сложно для большинства, потому, как писал выше, разработчики браузеров это упростили

Roman Dvornov @lahmatiy февр. 07 22:16
кстати да, нужно
template: '<svg:svg><svg:circle cx="10" cy="20" r="10" /></svg:svg>'
одинарные кавычки не разрешены для атрибутов в XML/XHTML, парсер шаблонизатора ведет себя как XHTML парсер, поэтому встретив ' он посчитал конструкцию неверной для тега и сконвертировал все в текст
так вот, в шаблонизаторе basis'е нет словарей для тегов, что что-то относится к другому неймспейсу, но он умеет работать с неймспейсами
сейчас там зашиты неймспейсы svg и xlink https://github.com/basisjs/basisjs/blob/master/src/basis/template/namespace.js

конец ответов к 2

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions