Ð ÑÑой главе Ð¼Ñ Ð¿Ð¾ÑмоÑÑим на иÑоговÑй пÑÐ¸Ð¼ÐµÑ Ð²ÐµÐ±-компоненÑа, вклÑÑаÑÑий в ÑÐµÐ±Ñ Ð¾Ð¿Ð¸ÑаннÑе Ñанее ÑÐµÑ Ð½Ð¾Ð»Ð¾Ð³Ð¸Ð¸: Custom Elements, Shadow DOM, CSS Scoping и, конеÑно же, Imports.
ÐÐ¾Ð¼Ð¿Ð¾Ð½ÐµÐ½Ñ ui-message
ÐÐ¾Ð¼Ð¿Ð¾Ð½ÐµÐ½Ñ ui-message бÑÐ´ÐµÑ Ð¾Ð¿Ð¸Ñан в оÑделÑном Ñайле ui-message.html.
Ðго иÑполÑзование бÑÐ´ÐµÑ Ð²ÑглÑдеÑÑ ÑледÑÑÑим обÑазом:
<link rel="import" id="link" href="ui-message.html">
<style>
ui-message {
width: 80%;
margin: auto;
}
</style>
<ui-message class="info">ÐобÑое ÑÑÑо, ÑÑÑана!</ui-message>
<ui-message class="warning">Ðнимание-внимание! ÐовоÑÐ¸Ñ Ð¸Ð½ÑоÑмбÑÑо!</ui-message>
ÐÑÐ¾Ñ ÐºÐ¾Ð´ ниÑем не оÑлиÑаеÑÑÑ Ð¾Ñ Ð¸ÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¾Ð±ÑÑного ÑлеменÑа, поÑÑÐ¾Ð¼Ñ Ð¿ÐµÑейдÑм далÑÑе, к ÑодеÑÐ¶Ð¸Ð¼Ð¾Ð¼Ñ ui-message.html
Шаблон Ð´Ð»Ñ ui-message
Файл ui-message.html можно наÑаÑÑ Ñ Ñаблона:
<template id="tmpl">
<style>
.content {
min-height: 20px;
padding: 19px;
margin-bottom: 20px;
background-color: #f5f5f5;
border: 1px solid #e3e3e3;
border-radius: 4px;
box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05);
}
:host {
display: block;
}
:host(.info) .content {
color: green;
}
:host(.warning) .content {
color: red;
}
</style>
<div class="content">
<content></content>
</div>
</template>
ÐÑÐ¾Ñ Ñаблон ÑиÑÑÐµÑ <div class="content"> и заполнÑÐµÑ ÐµÐ³Ð¾ ÑодеÑжимÑм ÑлеменÑа-Ñ
озÑина.
ÐажнÑе деÑали:
-
Самое важное пÑавило здеÑÑ
:host { display:block }.Ðно обÑзаÑелÑно! . ÐÑо пÑавило задаÑÑ, ÑÑо коÑÐµÐ½Ñ DOM-деÑева бÑÐ´ÐµÑ Ð¸Ð¼ÐµÑÑ
display:block. Ðо ÑмолÑаниÑ:hostне ÑоздаÑÑ CSS-блок, а ÑÑо знаÑиÑ, ÑÑо ни ÑиÑÐ¸Ð½Ñ Ð½Ð¸ оÑÑÑÑÐ¿Ñ ÑказаÑÑ Ð½Ðµ полÑÑиÑÑÑ. -
ÐоÑледÑÑÑие пÑавила
:host(.info) .contentи:host(.warning) .contentÑÑилизÑÑÑ ÑодеÑжимое в завиÑимоÑÑи Ð¾Ñ Ñого, какой на Ñ Ð¾Ð·Ñине клаÑÑ.
СкÑÐ¸Ð¿Ñ Ð´Ð»Ñ ui-message
Ð Ñайле ui-message.html Ð¼Ñ Ñоздадим новÑй ÑÐ»ÐµÐ¼ÐµÐ½Ñ <ui-message>:
// (1) полÑÑиÑÑ Ñаблон
var localDocument = document.currentScript.ownerDocument;
var tmpl = localDocument.getElementById('tmpl');
// (2) ÑоздаÑÑ ÑлеменÑ
var MessageProto = Object.create(HTMLElement.prototype);
MessageProto.createdCallback = function() {
var root = this.createShadowRoot();
root.appendChild(tmpl.content.cloneNode(true));
};
// (3) заÑегиÑÑÑиÑоваÑÑ Ð² DOM
document.registerElement('ui-message', {
prototype: MessageProto
});
ÐÑе компоненÑÑ ÑÑого кода Ð¼Ñ Ð¿Ð¾Ð´Ñобно ÑазбиÑали Ñанее:
- ÐолÑÑаем Ñаблон из ÑекÑÑего докÑменÑа, Ñо еÑÑÑ Ð¸Ð· Ñамого импоÑÑа.
- ÐпиÑÑваем ÑлеменÑ. Ðн доволÑно пÑоÑÑ â пÑи Ñоздании запиÑÑÐ²Ð°ÐµÑ Ð² Ñвой
Shadow DOMÑаблон. ÐÑи ÑÑом ÑодеÑжимое иÑÑ Ð¾Ð´Ð½Ð¾Ð³Ð¾ ÑлеменÑа бÑÐ´ÐµÑ Ð¿Ð¾ÐºÐ°Ð·Ð°Ð½Ð¾ в<content>, но делаÑÑ Ð¿Ñавила на ÑамcontentбеÑÑмÑÑленно â они не ÑÑабоÑаÑÑ. ÐÑжно либо пеÑейÑи внÑÑÑÑ<content>пÑи помоÑи::content-ÑелекÑоÑа, либо ÑказаÑÑ Ð´Ð»Ñ Ð²Ð½ÐµÑнего ÑлеменÑа.content, ÑÑо в данном ÑлÑÑае и Ñделано. - С моменÑа ÑегиÑÑÑаÑии вÑе Ñже ÑÑÑеÑÑвÑÑÑие ÑлеменÑÑ
<ui-message>бÑдÑÑ Ð¿ÑевÑаÑÐµÐ½Ñ Ð² опиÑаннÑе здеÑÑ. РбÑдÑÑие, конеÑно, Ñоже.
ÐÐ¾Ð¼Ð¿Ð¾Ð½ÐµÐ½Ñ Ð² дейÑÑвии:
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<link rel="import" id="link" href="ui-message.html">
<style>
ui-message {
width: 80%;
margin: auto;
}
</style>
</head>
<body>
<ui-message class="info">ÐобÑое ÑÑÑо, ÑÑÑана!</ui-message>
<ui-message class="warning">Ðнимание-внимание! ÐовоÑÐ¸Ñ Ð¸Ð½ÑоÑмбÑÑо!</ui-message>
</body>
</html><!DOCTYPE HTML>
<html>
<body>
<template id="tmpl">
<style>
.content {
min-height: 20px;
padding: 19px;
margin-bottom: 20px;
background-color: #f5f5f5;
border: 1px solid #e3e3e3;
border-radius: 4px;
box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05);
}
:host {
display: block;
}
:host(.info) .content {
color: green;
}
:host(.warning) .content {
color: red;
}
</style>
<div class="content">
<content></content>
</div>
</template>
<script>
! function() {
var localDocument = document.currentScript.ownerDocument;
var tmpl = localDocument.getElementById('tmpl');
var MessageProto = Object.create(HTMLElement.prototype);
MessageProto.createdCallback = function() {
var root = this.createShadowRoot();
root.appendChild(tmpl.content.cloneNode(true));
};
document.registerElement('ui-message', {
prototype: MessageProto
});
}();
</script>
</body>
</html>ÐÐ¾Ð¼Ð¿Ð¾Ð½ÐµÐ½Ñ ui-slider Ñ jQuery
ÐÐ¾Ð¼Ð¿Ð¾Ð½ÐµÐ½Ñ Ð¼Ð¾Ð¶ÐµÑ Ð¸ÑполÑзоваÑÑ Ð¸ внеÑние библиоÑеки.
ÐÐ»Ñ Ð¿ÑимеÑа Ñоздадим ÑÐ»Ð°Ð¹Ð´ÐµÑ Ñ Ð¸ÑполÑзованием библиоÑеки jQuery UI.
ÐÐ¾Ð¼Ð¿Ð¾Ð½ÐµÐ½Ñ ui-slider бÑÐ´ÐµÑ Ð¿Ð¾ÐºÐ°Ð·ÑваÑÑ ÑÐ»Ð°Ð¹Ð´ÐµÑ Ñ Ð¼Ð¸Ð½Ð¸Ð¼Ð°Ð»ÑнÑм и макÑималÑнÑм знаÑением из аÑÑибÑÑов min/max и генеÑиÑоваÑÑ ÑобÑÑие slide пÑи его пеÑемеÑении.
ÐÑполÑзование:
<link rel="import" id="link" href="ui-slider.html">
<ui-slider min="0" max="1000" id="elem"></ui-slider>
<script>
elem.addEventListener("slide", function(e) {
value.innerHTML = e.detail.value;
});
</script>
<div id="value">0</div>
Файл компоненÑа ui-slider
Файл ui-slider.html, задаÑÑий компоненÑ, Ð¼Ñ ÑазбеÑÑм по ÑаÑÑÑм.
Ðаголовок
РнаÑале подклÑÑим jQuery и jQuery UI.
ÐÑ Ð¸Ð¼Ð¿Ð¾ÑÑиÑÑем в ÑÐ»Ð°Ð¹Ð´ÐµÑ jquery.html, коÑоÑÑй ÑодеÑÐ¶Ð¸Ñ Ñеги <script> вмеÑÑо Ñого, ÑÑÐ¾Ð±Ñ ÑвнÑм обÑазом пÑопиÑÑваÑÑ Ð·Ð°Ð³ÑÑÐ·ÐºÑ ÑкÑипÑов:
<head>
<link rel="import" href="jquery.html">
</head>
ÐÑо Ñделано Ð´Ð»Ñ Ñого, ÑÑÐ¾Ð±Ñ Ð´ÑÑгие компоненÑÑ, коÑоÑÑм Ñоже могÑÑ Ð¿Ð¾Ð½Ð°Ð´Ð¾Ð±Ð¸ÑÑÑ ÑÑи библиоÑеки, Ñакже могли импоÑÑиÑоваÑÑ jquery.html. ÐÑи повÑоÑном импоÑÑе ниÑего не пÑоизойдÑÑ, ÑкÑипÑÑ Ð½Ðµ бÑдÑÑ Ð¿Ð¾Ð´Ð³ÑÑÐ¶ÐµÐ½Ñ Ð¸ иÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ñ Ð´Ð²Ð° Ñаза.
То еÑÑÑ, ÑÑо ÑÑедÑÑво опÑимизаÑии.
СодеÑжимое jquery.html:
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
<script src="https://code.jquery.com/ui/1.11.4/jquery-ui.js"></script>
Шаблон
Шаблон бÑÐ´ÐµÑ Ð¿Ð¾Ð¼ÐµÑÑн в Shadow DOM. РнÑм Ð´Ð¾Ð»Ð¶Ð½Ñ Ð±ÑÑÑ ÑÑили и ÑлеменÑÑ, Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ñе ÑлайдеÑÑ.
ÐонкÑеÑно Ð´Ð»Ñ ÑлайдеÑа из ÑазмеÑки доÑÑаÑоÑно одного ÑлеменÑа <div id="slider"></div>, коÑоÑÑй заÑем бÑÐ´ÐµÑ Ð¾Ð±ÑабоÑан jQuery UI.
ÐÑоме Ñого, в Ñаблоне Ð´Ð¾Ð»Ð¶Ð½Ñ Ð±ÑÑÑ ÑÑили:
<template id="tmpl">
<style>
@import url(https://code.jquery.com/ui/1.11.4/themes/ui-lightness/jquery-ui.css);
:host {
display: block;
}
</style>
<div id="slider"></div>
</template>
СкÑипÑ
СкÑÐ¸Ð¿Ñ Ð´Ð»Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ ÑлеменÑа Ð¿Ð¾Ñ Ð¾Ð¶ на ÑоÑ, ÑÑо делали ÑанÑÑе, но ÑепеÑÑ Ð¾Ð½ иÑполÑзÑÐµÑ jQuery UI Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÑлайдеÑа внÑÑÑи Ñвоего Shadow DOM.
ÐÐ»Ñ ÐµÐ³Ð¾ Ð¿Ð¾Ð½Ð¸Ð¼Ð°Ð½Ð¸Ñ Ð¶ÐµÐ»Ð°ÑелÑно знаÑÑ jQuery, Ñ Ð¾ÑÑ Ð² коде ниже Ñ Ð½Ð°Ð¼ÐµÑенно ÑвÑл иÑполÑзование ÑÑой библиоÑеки к минимÑмÑ.
var localDocument = document.currentScript.ownerDocument;
var tmpl = localDocument.getElementById('tmpl');
var SliderProto = Object.create(HTMLElement.prototype);
SliderProto.createdCallback = function() {
// (1) иниÑиализиÑоваÑÑ Shadow DOM, полÑÑиÑÑ Ð¸Ð· него #slider
var root = this.createShadowRoot();
root.appendChild(tmpl.content.cloneNode(true));
this.$slider = $(root.getElementById('slider'));
var self = this;
// (2) иниÑиализиÑоваÑÑ ÑлайдеÑ, пÑобÑоÑиÑÑ Ð¿Ð°ÑамеÑÑÑ
this.$slider.slider({
min: this.getAttribute('min') || 0,
max: this.getAttribute('max') || 100,
value: this.getAttribute('value') || 0,
slide: function() {
// (3) пÑобÑоÑиÑÑ ÑобÑÑие
var event = new CustomEvent("slide", {
detail: {
value: self.$slider.slider("option", "value")
},
bubbles: true
});
self.dispatchEvent(event);
}
});
};
document.registerElement('ui-slider', {
prototype: SliderProto
});
ФÑнкÑÐ¸Ñ createdCallback по Ñагам:
- СоздаÑм Shadow DOM, ÑлеменÑ
#sliderполÑÑаем из него, он не в оÑновном докÑменÑе. - ÐÑполÑзÑÑ jQuery UI, ÑÐ»Ð°Ð¹Ð´ÐµÑ ÑоздаÑÑÑÑ Ð²Ñзовом jQuery UI меÑодом slider, коÑоÑÑй Ð¸Ð¼ÐµÐµÑ Ð²Ð¸Ð´
$elem.slider({...паÑамеÑÑÑ...});. ÐаÑамеÑÑÑ Ð¿Ð¾Ð»ÑÑаем из аÑÑибÑÑов<ui-slider>(он жеthis) и оÑдаÑм библиоÑеке. Ðна Ð´ÐµÐ»Ð°ÐµÑ Ð²ÑÑ ÑабоÑÑ. - ÐаÑамеÑÑ
slideзадаÑÑ ÑÑнкÑиÑ-колбÑк, коÑоÑÐ°Ñ Ð²ÑзÑваеÑÑÑ Ð¿Ñи пеÑедвижении ÑлайдеÑа и бÑÐ´ÐµÑ Ð³ÐµÐ½ÐµÑиÑоваÑÑ DOM-ÑобÑÑие на ÑлеменÑе, на коÑоÑое можно бÑÐ´ÐµÑ Ð¿Ð¾ÑÑавиÑÑ Ð¾Ð±ÑабоÑÑик пÑи помоÑиaddEventListener. Рего деÑалÑÑ Ð¼Ñ ÑказÑваем новое знаÑение ÑлайдеÑа.
ÐолнÑй код Ñ Ð¿ÑимеÑом:
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<link rel="import" id="link" href="ui-slider.html">
<style>
ui-slider {
width: 300px;
margin: 10px;
}
</style>
</head>
<body>
<ui-slider min="0" max="1000" id="elem"></ui-slider>
<script>
elem.addEventListener("slide", function(e) {
value.innerHTML = e.detail.value; // = this.value
});
</script>
<div id="value">0</div>
</body>
</html><script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
<script src="https://code.jquery.com/ui/1.11.4/jquery-ui.js"></script><!DOCTYPE HTML>
<html>
<head>
<link rel="import" href="jquery.html">
</head>
<body>
<template id="tmpl">
<style>
@import url(https://code.jquery.com/ui/1.11.4/themes/ui-lightness/jquery-ui.css);
:host {
display: block;
}
</style>
<div id="slider"></div>
</template>
<script>
! function() {
var localDocument = document.currentScript.ownerDocument;
var tmpl = localDocument.getElementById('tmpl');
var SliderProto = Object.create(HTMLElement.prototype);
SliderProto.createdCallback = function() {
var root = this.createShadowRoot();
root.appendChild(tmpl.content.cloneNode(true));
this.$slider = $(root.getElementById('slider'));
var self = this;
this.$slider.slider({
min: +this.getAttribute('min') || 0,
max: +this.getAttribute('max') || 100,
value: this.getAttribute('value') || 0,
slide: function() {
var event = new CustomEvent("slide", {
detail: {
value: self.$slider.slider("option", "value")
},
bubbles: true
});
self.dispatchEvent(event);
}
});
};
document.registerElement('ui-slider', {
prototype: SliderProto
});
}();
</script>
</body>
</html>Ðго можно далее ÑлÑÑÑаÑÑ, напÑÐ¸Ð¼ÐµÑ Ð´Ð¾Ð±Ð°Ð²Ð¸ÑÑ Ð³ÐµÑÑÐµÑ Ð¸ ÑеÑÑÐµÑ Ð´Ð»Ñ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ value:
Object.defineProperty(SliderProto, 'value', {
get: function() {
return this.$slider.slider("option", "value");
},
set: function(value) {
this.$slider.slider('option', 'value', value);
}
});
ÐÑли добавиÑÑ ÑÑÐ¾Ñ ÐºÐ¾Ð´, Ñо к знаÑÐµÐ½Ð¸Ñ <ui-slider> можно бÑÐ´ÐµÑ Ð¾Ð±ÑаÑаÑÑÑÑ ÐºÐ°Ðº elem.value, аналогиÑно вÑÑким вÑÑÑоеннÑм <input>.
ÐÑоблема Ñ jQuery
ÐопÑобÑйÑе пÑÐ¸Ð¼ÐµÑ Ð²ÑÑе. Ðн не ÑовÑем ÑабоÑаеÑ. Ð¡Ð»Ð°Ð¹Ð´ÐµÑ Ð¿ÑокÑÑÑиваеÑÑÑ Ð¿ÐµÑвÑй Ñаз, но вÑоÑой Ñаз он как-Ñо ÑÑÑанно «пÑÑгаеÑ».
ЧÑÐ¾Ð±Ñ Ð¿Ð¾Ð½ÑÑÑ, поÑÐµÐ¼Ñ ÑÑо пÑоиÑÑ Ð¾Ð´Ð¸Ñ, Ñ Ð·Ð°Ð³Ð»ÑнÑл в иÑÑ Ð¾Ð´Ð½Ð¸ÐºÐ¸ jQuery UI и, поÑле оÑладки пÑоиÑÑ Ð¾Ð´ÑÑего, наÑолкнÑлÑÑ Ð½Ð° пÑоблемнÑй код.
Ðн бÑл в меÑоде offset, коÑоÑÑй пÑедназнаÑен Ð´Ð»Ñ Ñого, ÑÑÐ¾Ð±Ñ Ð¾Ð¿ÑеделÑÑÑ ÐºÐ¾Ð¾ÑдинаÑÑ ÑлеменÑа. ÐÑÐ¾Ñ Ð¼ÐµÑод не ÑÑабаÑÑвал, поÑколÑÐºÑ Ð² нÑм еÑÑÑ Ð¿ÑовеÑка, коÑоÑÐ°Ñ Ð²ÑглÑÐ´Ð¸Ñ Ð¿ÑимеÑно Ñак:
var box = {
top: 0,
left: 0
};
...
// Make sure it's not a disconnected DOM node
if(!jQuery.contains(elem.ownerDocument, elem)) {
return box;
}
То еÑÑÑ, jQuery пÑовеÑÑеÑ, наÑ
одиÑÑÑ Ð»Ð¸ ÑÐ»ÐµÐ¼ÐµÐ½Ñ elem внÑÑÑи Ñвоего докÑменÑа elem.ownerDocument. ÐÑли Ð½ÐµÑ â Ñо ÑÑиÑаеÑÑÑ, ÑÑо ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð²Ð½Ðµ DOM, и его ÑазмеÑÑ ÑÐ°Ð²Ð½Ñ Ð½ÑлÑ.
ÐÑли копнÑÑÑ ÑÑÑÑ Ð³Ð»Ñбже, Ñо jQuery.contains в ÑовÑеменнÑÑ
бÑаÑзеÑаÑ
ÑводиÑÑÑ Ðº обÑÑÐ½Ð¾Ð¼Ñ Ð²ÑÐ·Ð¾Ð²Ñ contains.
ÐаÑÐ°Ð´Ð¾ÐºÑ Ñ Shadow DOM заклÑÑаеÑÑÑ Ð² Ñом, ÑÑо вÑзов elem.ownerDocument.contains(elem) веÑнÑÑ false!
ÐолÑÑилоÑÑ, ÑÑо ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð½Ðµ в докÑменÑе и одновÑеменно он Ð¸Ð¼ÐµÐµÑ ÑазмеÑÑ. Такого ÑазÑабоÑÑики jQuery не пÑедÑÑмоÑÑели.
Ðожно, конеÑно, побежаÑÑ Ð¸ÑпÑавлÑÑÑ jQuery, но давайÑе подÑмаем, Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ñак оно и должно бÑÑÑ?
С ÑоÑки зÑÐµÐ½Ð¸Ñ Ð·Ð´Ñавого ÑмÑÑла, Shadow DOM ÑвлÑеÑÑÑ ÑаÑÑÑÑ ÑекÑÑего докÑменÑа. ÐÑо ÑооÑвеÑÑÑвÑÐµÑ Ð¸ дÑÑ Ñ ÑекÑÑей ÑпеÑиÑикаÑии, где shadow tree ÑаÑÑмаÑÑиваеÑÑÑ Ð² конÑекÑÑе document tree.
ÐоÑÑÐ¾Ð¼Ñ Ð½Ð° Ñамом деле document.contains(elem) Ñледовало Ð±Ñ Ð²Ð¾Ð·Ð²ÑаÑаÑÑ true.
ÐоÑÐµÐ¼Ñ Ð¶Ðµ false? ÐÑиÑина пÑоÑÑа â опиÑаннÑй в дÑÑгом ÑÑандаÑÑе меÑ
анизм ÑабоÑÑ contains по ÑÑÑи ÑоÑÑÐ¾Ð¸Ñ Ð² пÑоÑ
оде ввеÑÑ
Ð¾Ñ elem по ÑепоÑке parentNode, пока либо вÑÑÑеÑим иÑкомÑй ÑлеменÑ, Ñогда оÑÐ²ÐµÑ true, а инаÑе false. Ð ÑлÑÑае Ñ Shadow DOM ÑÑÐ¾Ñ Ð¿ÑÑÑ Ð·Ð°ÐºÐ¾Ð½ÑиÑÑÑ Ð½Ð° коÑне Shadow DOM-деÑева, оно Ð²ÐµÐ´Ñ Ð½Ðµ ÑвлÑеÑÑÑ Ð¿Ð¾Ñомком Ñ
озÑина.
ÐеÑод contains опиÑан ÑÑандаÑÑом без ÑÑÑÑа Shadow DOM, поÑÑÐ¾Ð¼Ñ Ð²Ð¾Ð·Ð²ÑаÑил невеÑнÑй ÑезÑлÑÑÐ°Ñ false.
ÐÑо один из ÑÐµÑ Ð½ÐµÐ±Ð¾Ð»ÑÑÐ¸Ñ , но важнÑÑ Ð½ÑанÑов, коÑоÑÑе показÑваÑÑ, ÑÑо ÑÑандаÑÑÑ Ð²ÑÑ ÐµÑÑ Ð² ÑазÑабоÑке.
ÐÑого
- С иÑполÑзованием ÑовÑеменнÑÑ ÑÐµÑ Ð½Ð¾Ð»Ð¾Ð³Ð¸Ð¹ можно делаÑÑ ÐºÐ¾Ð¼Ð¿Ð¾Ð½ÐµÐ½ÑÑ. Ðо ÑÑо, вÑÑ Ð¶Ðµ, дело бÑдÑÑего. ÐÑе ÑÑандаÑÑÑ Ð½Ð°Ñ Ð¾Ð´ÑÑÑÑ Ð² пÑоÑеÑÑе доÑабоÑки, гоÑовÑÑÑÑ Ð½Ð¾Ð²Ñе.
- Ðожно иÑполÑзоваÑÑ Ð¿ÑоизволÑнÑÑ Ð±Ð¸Ð±Ð»Ð¸Ð¾ÑекÑ, ÑакÑÑ ÐºÐ°Ðº jQuery, и ÑабоÑаÑÑ Ñ Shadow DOM Ñ ÐµÑ Ð¸ÑполÑзованием. Ðо Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ñ Ð¿Ñоблемки. ÐÑÑе бÑла пÑодемонÑÑÑиÑована одна из Ð½Ð¸Ñ , могÑÑ Ð±ÑÑÑ Ð¸ дÑÑгие.
Ðока веб-компоненÑÑ ÐµÑÑ Ð½Ðµ ÑвлÑÑÑÑÑ Ð·Ð°ÐºÐ¾Ð½ÑеннÑми ÑÑандаÑÑами, можно попÑобоваÑÑ Polymer â ÑÑо ÑамÑй извеÑÑнÑй из полиÑилов на ÑÐµÐ¼Ñ Ð²ÐµÐ±-компоненÑ.
Ðн ÑÑаÑаеÑÑÑ Ð¸Ñ ÑмÑлиÑоваÑÑ Ð¿Ð¾ возможноÑÑи кÑоÑÑ-бÑаÑзеÑно, но пока ÑÑо ÑÑо доволÑно-Ñаки Ñложно, в ÑаÑÑноÑÑи, Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð° дополниÑелÑÐ½Ð°Ñ ÑазмеÑка.
ÐомменÑаÑии
<code>, Ð´Ð»Ñ Ð½ÐµÑколÑÐºÐ¸Ñ ÑÑÑок кода — Ñег<pre>, еÑли болÑÑе 10 ÑÑÑок — ÑÑÑÐ»ÐºÑ Ð½Ð° пеÑоÑниÑÑ (plnkr, JSBin, codepenâ¦)