2015-06-25 2 views
4

Итак, я просмотрел несколько статей и вопросов здесь, но не святой Грааль.Использование SVG и применение CSS из таблицы стилей

У меня есть внешний файл icon.svg, и я хочу использовать его в нескольких файлах HTML и иметь разные размеры и размеры для каждого использования.

Я не могу использовать <object> из того, что я собираю, так как он не позволяет стилям из листов CSS, если вы не ссылаетесь на этот лист из самого файла SVG, какой вид поражения цели.

Единственный способ, которым я нашел, как это сделать, как это:

<svg class="icon"> 
    <use xlink:href="icon.svg#symbolid"></use> 
</svg> 

и применяет CSS. Но я могу только это сделать, если я добавлю symbol узлы в SVG-файле и дам им идентификатор, который я бы предпочел не делать.

Также может быть, что это может не поддерживаться во всех основных браузерах?

Любой способ достичь этого?

Update:

Добавлены теги для JavaScript/angularjs, так как решение было основано JS. (См ответа)

+0

Считаете ли вы использование inline svg? – Obsidian

+0

Да, и отказался от этого, так как я предпочитаю читать HTML. –

+0

Или вводя стили в SVG во время выполнения с использованием DOM, если вы используете тег ''. (SVG и контейнер должны быть в том же домене) –

ответ

0

Я закончил с использованием <object> и манипулирования его после того, как SVG было вынесено, таким образом, что помогло бы мне изменить стиль.

Для всех, кто интересуется более техническими деталями, я написал процесс here in my blog.

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

Редактировать: Написал беседка для него, вы можете получить его here.

1

ВАРИАНТ 1 - Использование общих стили CSS

Лично я создаю несколько цвета заливки и просто применить класс к SVG, где требуется.

HTML

<svg class="icon red"> 
    <use xlink:href="icon.svg#symbolid"></use> 
</svg> 

CSS

.icon{ 
    fill:#000; 
} 
.red{ 
    fill:#b00; 
} 
.blue{ 
    fill:#ddf; 
} 

ВАРИАНТ 2 - SVG была нацелена на уникальный класс

Если ваш svg имеет несколько путей, вы можете настроить таргетинг на каждый из них, используя другие классы.

HTML

<svg class="icon symbol"> 
    <use xlink:href="icon.svg#symbolid"></use> 
</svg> 

CSS

.icon{ 
    fill:#000; 
    height:20px; 
    width:20px; 
} 
.symbol{ 
    height:40px; 
    width:40px; 
} 
.symbol .path1{ 
    fill:#b00; 
} 
.symbol .path2{ 
    fill:#ddf; 
} 

ВАРИАНТ 3 - SVG в качестве фоновых изображений

DEMO

Чтобы использовать похожие изображения svg, они могут быть нацелены на css и даже использоваться в качестве фоновых изображений в css, но каждый символ svg должен быть уникальным файлом.

<div class="icon"></div> 

.icon{ 
    display:block; 
    height:20px; 
    width:20px; 
    background: url(icon.svg); 
    background-size: 20px 20px; 
} 

Чтобы использовать SVG как разной высоты и ширины просто изменить в CSS, используя дополнительные классы для перезаписи по умолчанию, используя специфичность:

.svg40{ 
    height:40px; 
    width:40px; 
} 
.svg100{ 
    height:100px; 
    width:100px; 
} 

ВАРИАНТ 4 - Встроенный SVGs (Моя рекомендация)

DEMO

Поместите файл svg непосредственно в свой html, чтобы уменьшить HTTP-запросы и улучшить контроль.

HTML

Место только после того, как ваше тело тега в верхней части HTML

<div style="height:0;width:0;position:absolute;visibility:hidden;"> 
    <svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> 
    <symbol id="symbolid1" viewBox="0 0 64 64"> 
    <title>symbol 1</title> 
    <path ... /> 
    </symbol> 
    <symbol id="symbolid2" viewBox="0 0 64 64"> 
    <title>symbol 2</title> 
    <path ... /> 
    </symbol> 
</div> 

Тогда вы можете вызвать от SVG в любом месте, используя идентификатор SVG в.

<svg class="icon"><use xlink:href="#symbolid"/></svg> 

CSS

.icon{ 
    display:inline-block; 
    fill:currentColor; 
    width:20px; 
    height:20px; 
} 
+0

Да, так работает, и в настоящее время я использую его, но заметьте '# symbolid', что означает, что я должен использовать' 'в файле SVG. В любом случае, чтобы избежать этого? –

+0

Да. Вот почему я решил использовать inline svg. Он чище и быстрее, поскольку он уменьшает количество HTTP-запросов в браузере. Чтобы ваш html был чистым во время кодирования, вы можете использовать пользовательский элемент управления областью шаблонов для хранения svg в другом месте вашего проекта. – Obsidian

+0

Не ссылаясь на идентификатор символа, как бы вы указали, какой svg использовать? – Obsidian

Смежные вопросы