Пользовательские элементы позволяют разработчикам определять свои собственные элементы 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 для взаимодействия с пользовательскими элементами и другими веб-компонентами. Мы едва затронули эту тему, и у нас еще много возможностей для изучения. Тем не менее, я надеюсь, что это введение будет достаточно простым для всех, чтобы понять и послужить трамплином для создания множества новых пользовательских элементов.


