Пользовательские элементы позволяют разработчикам определять свои собственные элементы HTML с именами пользовательских тегов, которые очень похожи на их компоненты дизайна. W3C определяет пользовательские элементы в качестве спецификации, которая:
Позволяет авторам определять и использовать новые типы элементов DOM в документе.
Определение выглядит довольно простым в теории, но на практике процесс создания и использования пользовательского элемента включает в себя:
- Приличное количество JavaScript
- Знание JavaScript API (ов) для создания пользовательского элемента
- Обработка кросс-браузерных несоответствий.
Если вам удастся пережить эти трудности, вам все равно придется беспокоиться о тех браузерах, которые не поддерживают пользовательские элементы. К счастью, Polymer экономит время, предоставляя простую в использовании инфраструктуру для создания и использования пользовательских элементов.
Если вам нужно быстро освежить информацию о Polymer и Web-компонентах, я настоятельно рекомендую прочитать мою предыдущую статью о SitePoint, в которой подробно рассматриваются эти понятия.
В этой статье мы рассмотрим очень простой пример создания пользовательского элемента с помощью Polymer для рендеринга кавычек . Идея возникла из этой статьи Луиса Лазариса, где он спровоцировал дискуссию о семантической ценности использования blockquote
vs для создания вытяжных цитат в вашей разметке.
Довольно часто можно видеть блок-кавычки, в aside
или даже простой элемент div
, используемый для разметки кавычек. Настало время покончить с этой загадкой, создав новый пользовательский элемент с именем <pull-quote>
который может точно представлять наш контент. К концу этой статьи вы сможете создать что-то вроде этого:
Настройка пользовательского элемента
Прежде чем мы начнем с нашего пользовательского элемента, мы быстро настроим папку проекта, установив Polymer и все зависимости через Bower .
$ bower install --save Polymer/polymer
Как правило, создание нового пользовательского элемента включает в себя следующие шаги:
- Создайте файл HTML с именем пользовательского элемента.
- Импортируйте файл
bower_components
папкиbower_components
с помощью<link>
. - Объявите свой пользовательский элемент, используя
<polymer-element>
- Добавьте стили и разметку, необходимые для определения вашего пользовательского элемента, используя
<template>
. - Если ваш пользовательский элемент включает JavaScript, вызовите конструктор
Polymer()
чтобы зарегистрировать элемент в DOM.
Основной подход заключается в том, чтобы сначала решить, как вы собираетесь использовать пользовательский элемент в разметке, а затем вернуться назад, чтобы создать шаблон для пользовательского элемента. В этом случае мы планируем использовать следующую разметку каждый раз, когда намереваемся использовать кавычки в нашем документе:
<pull-quote>Sample text and can even contain other HTML tags.</pull-quote>
Мы начнем с создания файла с именем pull-quote.html
в корневом каталоге. Отредактируйте файл и импортируйте файл bower_components
который находится в папке bower_components
:
<link rel="import" href="bower_components/polymer/polymer.html">
Мы объявим наш новый элемент <pull-quote>
с помощью атрибута name
<polymer-element>
следующим образом:
<polymer-element name="pull-quote" noscript> <!-- More to come --> </polymer-element>
Несколько замечаний:
- Имя пользовательского элемента должно содержать символ дефиса (U + 002D HYPHEN-MINUS), чтобы анализаторы HTML могли отличать пользовательские элементы от обычных элементов HTML.
- Атрибут
noscript
указывает, что этому элементу для работы не требуется JavaScript, и, следовательно, его можно немедленно зарегистрировать в DOM.
Добавление контента
Содержимое, составляющее пользовательский элемент, определяется внутри <template>
. Тег <template>
обеспечивает отделение презентации от контента. В нашем случае все, что мы напишем внутри <pull-quote>
будет составлять содержимое пользовательского элемента, а примененные к нему стили будут формировать представление.
В двух словах, есть три типа элементов DOM, с которыми мы имеем дело:
- Light DOM — включает в себя то, что мы пишем внутри пользовательского элемента. Следовательно, пользователь пользовательского элемента предоставляет Light DOM.
- Shadow DOM — включает в себя все, что мы определяем в
<template>
. Он является внутренним по отношению к элементу и охватывает все, что требуется для работы настраиваемого элемента. - Составной DOM — это то, что на самом деле отображает браузер. Для рендеринга легкий DOM распределяется в теневом DOM для создания составного DOM.
Тег <content>
представляет точку вставки, в которую содержимое Light DOM будет введено в Shadow DOM. Тег <content>
имеет гораздо более сложное применение при выборе только определенного контента, который вы пишете внутри пользовательского элемента. Однако ради этого примера мы будем придерживаться основного использования этого тега.
<polymer-element name="pull-quote" noscript> <template> <content></content> </template> </polymer-element>
Стилизация пользовательского элемента
Для стилизации нашего пользовательского элемента Polymer предоставляет набор полезных селекторов. Например:
-
:host
— Нацелен на сам пользовательский элемент. -
:host(<pseudo-class>)
— нацеливает различные состояния пользовательского элемента, такие как:host(:hover)
:host(:active)
и т. д. -
:host(<class-name>)
— нацеливается только на те пользовательские элементы, которые имеют указанное имя класса. -
:host-context(<selector>)
— этот псевдокласс нацелен на элемент host, если он или любой из его предков соответствует<selector>
. Это особенно полезно для создания тем, когда вы применяете связанные с темой классы к тегам<html>
или<body>
.
Совет для профессионалов — если вы просто используете селекторы (например,
p
,#id
или.class
) без:host
то они автоматически станут наследующими селекторами. Например, чтобы нацелить тег абзаца внутри<pull-quote>
мы можем просто использоватьp { ... }
и тогда он будет автоматически расширен какpull-quote p { ... }
.
Мы можем выбрать стиль нашего пользовательского элемента, используя <style>
:
<template> <style> :host { display: inline-block; font-style: italic; text-align: justify; width: 325px; line-height: 30px; } </style> <content></content> </template>
Или мы можем написать наш CSS в новом файле, таком как pull-quote.css
а затем импортировать этот файл в наш файл pull-quote.html
используя <link>
:
<link rel="stylesheet" href="pull-quote.css">
Несколько замечаний:
- По умолчанию все пользовательские элементы установлены как
display: inline
. Следовательно, мы должны явно объявитьdisplay: inline-block
. - Селектор
:host
имеет самую низкую специфичность. Следовательно, пользователи могут переопределять ваши стили вне пользовательского элемента.
На момент написания статьи использование псевдоэлементов ( ::before
и ::after
) в селекторе :host
, например :host::before {...}
, не работает должным образом в браузерах Blink (Chrome и Opera). Похоже, это известная ошибка , которая была исправлена и скоро будет поставлена с Chrome 38. Но это не должно помешать нам использовать их в целом.
Чтобы окружить наши pull-кавычки реальными кавычками, у нас есть три варианта.
Добавление цитат с помощью :host
псевдоэлементов :host
Первый вариант — использовать :host::before
и :host::after
из пользовательского элемента для добавления двойных кавычек:
:host::before { content: '\201C'; } :host::after { content: '\201D'; }
Как описано выше, это будет работать только в не Blink браузерах. Если вы можете позволить себе подождать, пока другие браузеры исправят ошибку, придерживайтесь этого метода.
Добавление кавычек с регулярными псевдоэлементами
Вы также можете использовать pull-quote::before
и pull-quote::after
для добавления двойных кавычек извне пользовательского элемента.
pull-quote::before { content: '\201C'; } pull-quote::after { content: '\201D'; }
Это работает во всех браузерах, но, возможно, не самое идеальное решение, учитывая, что стили для одного и того же пользовательского элемента теперь фрагментированы в двух разных файлах.
Добавление цитат с дополнительным HTML
Последний вариант — использовать HTML для добавления двойных кавычек в сам шаблон:
<template> <span>"</span> <content></content> <span>"</span> </template>
Это работает во всех браузерах тоже! Кроме того, вы можете также стилизовать кавычки с помощью CSS, который затем может находиться внутри <template>
.
Используя наш готовый элемент pull-quote
Убедитесь, что вы добавили polyfill platform.js
в <head>
вашего документа. Этот polyfill гарантирует, что ваши пользовательские элементы продолжат работать должным образом даже в браузерах, которые их не поддерживают.
<script src="bower_components/platform/platform.js"></script>
Чтобы использовать пользовательские элементы, мы делаем именно то, что я описал в моей предыдущей статье :
- Загрузите пакет Custom Element через Bower.
- Импортируйте соответствующий файл
.html
в ваш документ. -
Используйте разметку пользовательского элемента в любом месте вашего документа.
<html> <head> <script src="bower_components/platform/platform.js"></script> <link rel="import" href="pull-quote.html"> </head> <body> <pull-quote>Sample text inside pull quote</pull-quote> <pull-quote> <p>Can also contain other tags</p> </pull-quote> </body> </html>
Ознакомьтесь с полным кодом вместе с демонстрацией на Plunker . Я также настроил репозиторий проекта на Github для пользовательского элемента pull-quote
. И если вам нужно больше, CustomElements.io , проект Zeno Rocha, имеет полезную коллекцию пользовательских элементов, созданных с использованием Polymer, X-Tag и т. Д.
Библиотека Polymer предоставляет огромное количество мощных функций и API для взаимодействия с пользовательскими элементами и другими веб-компонентами. Мы едва затронули эту тему, и у нас еще много возможностей для изучения. Тем не менее, я надеюсь, что это введение будет достаточно простым для всех, чтобы понять и послужить трамплином для создания множества новых пользовательских элементов.