ÐÑи Ñоздании гÑаÑиÑеÑÐºÐ¸Ñ ÐºÐ¾Ð¼Ð¿Ð¾Ð½ÐµÐ½Ñов («виджеÑов») в пеÑвÑÑ Ð¾ÑеÑÐµÐ´Ñ Ð¿ÑидÑмÑваеÑÑÑ Ð¸Ñ HTML/CSS-ÑÑÑÑкÑÑÑа.
Ðак бÑÐ´ÐµÑ Ð²ÑглÑдеÑÑ Ð²Ð¸Ð´Ð¶ÐµÑ Ð² обÑÑном ÑоÑÑоÑнии? Ðак бÑÐ´ÐµÑ Ð¼ÐµÐ½ÑÑÑÑÑ Ð² пÑоÑеÑÑе взаимодейÑÑÐ²Ð¸Ñ Ñ Ð¿Ð¾ÑеÑиÑелем?
ЧÑÐ¾Ð±Ñ ÑазÑабоÑка виджеÑа бÑла Ñдобной, пÑи вÑÑÑÑке полезно ÑоблÑдаÑÑ Ð½ÐµÑколÑко пÑоÑÑÑÑ , но оÑÐµÐ½Ñ Ð²Ð°Ð¶Ð½ÑÑ ÑоглаÑений.
СеманÑиÑеÑÐºÐ°Ñ Ð²ÑÑÑÑка
HTML-ÑазмеÑка и Ð½Ð°Ð·Ð²Ð°Ð½Ð¸Ñ CSS-клаÑÑов Ð´Ð¾Ð»Ð¶Ð½Ñ Ð¾ÑÑажаÑÑ Ð½Ðµ оÑоÑмление, а ÑмÑÑл.
ÐапÑимеÑ, ÑообÑение об оÑибке можно ÑвеÑÑÑаÑÑ Ñак:
<div style="color:red; border: 1px solid red">
ÐлоÑ
Ð°Ñ Ð²ÑÑÑÑка ÑообÑÐµÐ½Ð¸Ñ Ð¾Ð± оÑибке: аÑÑибÑÑ style!
</div>
â¦Ðли Ñак:
<div class="red red-border">
ÐлоÑ
Ð°Ñ Ð²ÑÑÑÑка ÑообÑÐµÐ½Ð¸Ñ Ð¾Ð± оÑибке: неÑеманÑиÑеÑкий class!
</div>
Ð Ð¾Ð±Ð¾Ð¸Ñ ÑлÑÑаÑÑ Ð²ÑÑÑÑка не ÑвлÑеÑÑÑ ÑеманÑиÑеÑкой. РпеÑвом ÑлÑÑае â ÑÑилÑ, а во вÑоÑом â клаÑÑ ÑодеÑÐ¶Ð°Ñ Ð¸Ð½ÑоÑмаÑÐ¸Ñ Ð¾Ð± оÑоÑмлении.
ÐÑи ÑеманÑиÑеÑкой вÑÑÑÑке клаÑÑÑ Ð¾Ð¿Ð¸ÑÑваÑÑ ÑмÑÑл («ÑÑо ÑÑо?» â менÑ, кнопкаâ¦) и ÑоÑÑоÑние (оÑкÑÑÑо, закÑÑÑо, оÑклÑÑеноâ¦) компоненÑа.
ÐапÑимеÑ:
<div class="error">
СообÑение об оÑибке (error), пÑавилÑÐ½Ð°Ñ Ð²ÑÑÑÑка!
</div>
У пÑедÑпÑÐµÐ¶Ð´ÐµÐ½Ð¸Ñ Ð±ÑÐ´ÐµÑ ÐºÐ»Ð°ÑÑ warning и Ñак далее, по ÑмÑÑлÑ.
<div class="warning">
ÐÑедÑпÑеждение (warning), пÑавилÑÐ½Ð°Ñ Ð²ÑÑÑÑка!
</div>
СеманÑиÑеÑÐºÐ°Ñ Ð²ÑÑÑÑка ÑпÑоÑÐ°ÐµÑ Ð¿Ð¾Ð´Ð´ÐµÑÐ¶ÐºÑ Ð¸ ÑазвиÑие CSS, ÑпÑоÑÐ°ÐµÑ Ð²Ð·Ð°Ð¸Ð¼Ð¾Ð´ÐµÐ¹ÑÑвие Ð¼ÐµÐ¶Ð´Ñ Ñленами командÑ.
Ð¢Ð°ÐºÐ°Ñ Ð²ÑÑÑÑка Ñдобна Ð´Ð»Ñ Ð¾ÑганизаÑии JS-кода. Ркоде Ð¼Ñ Ð¿ÑоÑÑо ÑÑавим нÑжнÑй клаÑÑ, оÑÑалÑное Ð´ÐµÐ»Ð°ÐµÑ CSS.
СоÑÑоÑние виджеÑа â клаÑÑ Ð½Ð° ÑлеменÑе
ÐаÑаÑÑÑÑ ÐºÐ¾Ð¼Ð¿Ð¾Ð½ÐµÐ½Ñ Ð¼Ð¾Ð¶ÐµÑ Ð¸Ð¼ÐµÑÑ Ð½ÐµÑколÑко ÑоÑÑоÑний. ÐапÑимеÑ, Ð¼ÐµÐ½Ñ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¾ÑкÑÑÑо или закÑÑÑо.
СоÑÑоÑние должно добавлÑÑÑÑÑ CSS-клаÑÑом не на ÑÐ¾Ñ ÑлеменÑ, коÑоÑÑй нÑжно ÑкÑÑÑÑ/показаÑÑ/â¦, а на ÑоÑ, к коÑоÑÐ¾Ð¼Ñ Ð¾Ð½Ð¾ «по ÑмÑÑлÑ» оÑноÑиÑÑÑ, обÑÑно â на коÑневой ÑлеменÑ.
ÐапÑимеÑ, Ð¼ÐµÐ½Ñ Ð² закÑÑÑом ÑоÑÑоÑнии ÑкÑÑÐ²Ð°ÐµÑ Ñвой ÑпиÑок ÑлеменÑов. ÐлаÑÑ open нÑжно добавлÑÑÑ Ð½Ðµ к ÑпиÑÐºÑ Ð¾Ð¿Ñий <ul>, коÑоÑÑй ÑкÑÑваеÑÑÑ-показÑваеÑÑÑ, а к коÑÐ½ÐµÐ²Ð¾Ð¼Ñ ÑлеменÑÑ Ð²Ð¸Ð´Ð¶ÐµÑа, поÑколÑÐºÑ ÑÑо ÑоÑÑоÑние каÑаеÑÑÑ Ð²Ñего менÑ:
<div class="menu open">
<span class="title">Ðаголовок менÑ</span>
<ul>
<li>СпиÑок ÑлеменÑов</li>
</ul>
</div>
Ðли, к пÑимеÑÑ, ÑазмеÑка Ð´Ð»Ñ Ð¸Ð½Ð´Ð¸ÐºÐ°ÑоÑа загÑÑзки Ð¼Ð¾Ð¶ÐµÑ Ð²ÑглÑдеÑÑ Ñак:
<div class="indicator loading">
<span class="progress">ТÑÑ Ð¿Ð¾ÐºÐ°Ð·ÑваеÑÑÑ Ð¿ÑогÑеÑÑ</span>
</div>
СоÑÑоÑние индикаÑоÑа Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Â«Ð² пÑоÑеÑÑе» (loading) или «загÑÑзка завеÑÑена» (complete). С ÑоÑки зÑÐµÐ½Ð¸Ñ Ð¾ÑоÑÐ¼Ð»ÐµÐ½Ð¸Ñ Ð¾Ð½Ð¾ Ð¼Ð¾Ð¶ÐµÑ Ð²Ð»Ð¸ÑÑÑ ÑолÑко на показ внÑÑÑеннего span, но ÑÑавиÑÑ ÐµÐ³Ð¾ нÑжно вÑÑ Ñавно на внеÑний ÑлеменÑ, Ð²ÐµÐ´Ñ ÑÑо â ÑоÑÑоÑние вÑего компоненÑа.
Ðз пÑимеÑов вÑÑе можно подÑмаÑÑ, ÑÑо клаÑÑÑ, опиÑÑваÑÑие ÑоÑÑоÑние, вÑегда ÑÑавÑÑÑÑ Ð½Ð° коÑневой ÑлеменÑ. Ðо ÑÑо не Ñак.
Ðозможно и Ñакое, ÑÑо ÑоÑÑоÑние оÑноÑиÑÑÑ Ðº внÑÑÑÐµÐ½Ð½ÐµÐ¼Ñ ÑлеменÑÑ. ÐапÑимеÑ, Ð´Ð»Ñ Ð´ÐµÑева ÑоÑÑоÑние оÑкÑÑÑ/закÑÑÑ Ð¾ÑноÑиÑÑÑ Ðº ÑзлÑ, ÑооÑвеÑÑÑвенно, клаÑÑ Ð´Ð¾Ð»Ð¶ÐµÐ½ бÑÑÑ Ð½Ð° Ñзле.
ÐапÑимеÑ:
<ul class="tree">
<li class="closed">
ÐакÑÑÑÑй Ñзел деÑева
</li>
<li class="open">
ÐÑкÑÑÑÑй Ñзел деÑева
</li>
...
</ul>
ÐÑеÑикÑÑ ÐºÐ¾Ð¼Ð¿Ð¾Ð½ÐµÐ½Ñа Ñ ÐºÐ»Ð°ÑÑов
РаÑÑмоÑÑим пÑÐ¸Ð¼ÐµÑ Ð²ÑÑÑÑки «диалогового окна»:
<div class="dialog">
<h2 class="title">Ðаголовок</h2>
<div class="content">
HTML-ÑодеÑжимое.
</div>
<div class="close">ÐакÑÑÑÑ</div>
</div>
<style>
.dialog {
background: lightgreen;
border: lime 2px solid;
border-radius: 10px;
padding: 4px;
position: relative;
}
.dialog .title {
margin: 0;
font-size: 24px;
color: darkgreen;
}
.dialog .content {
padding: 10px 0 0 0;
}
.dialog .close {
position: absolute;
right: 4px;
top: 4px;
font-size: 10px;
}
</style>
Ðиалоговое окно Ð¼Ð¾Ð¶ÐµÑ Ð¸Ð¼ÐµÑÑ Ð»Ñбое HTML-ÑодеÑжимое.
Ð ÑÑо бÑдеÑ, еÑли в ÑÑом ÑодеÑжимом окажеÑÑÑ Ð¼ÐµÐ½Ñ â да-да, Ñо Ñамое, коÑоÑое ÑаÑÑмоÑÑели вÑÑе, Ñо <span class="title"> ?
ÐÑавило .dialog .title пÑименÑеÑÑÑ ÐºÐ¾ вÑем .title внÑÑÑи .dialog, а знаÑÐ¸Ñ â и к наÑÐµÐ¼Ñ Ð¼ÐµÐ½Ñ Ñоже. ÐÑÐ´ÐµÑ ÐºÐ¾Ð½ÑÐ»Ð¸ÐºÑ ÑÑилей Ñ Ð½ÐµÐ¿ÑедÑказÑемÑми поÑледÑÑвиÑми.
ÐонеÑно, можно попÑÑаÑÑÑÑ Ð±Ð¾ÑоÑÑÑÑ Ñ ÑÑим. ÐапÑимеÑ, жÑÑÑко задаÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ð¾ÑÑÑ â иÑполÑзоваÑÑ ÐºÐ»Ð°ÑÑ .dialog > .title. ÐÑо ÑÑабоÑÐ°ÐµÑ Ð² данном конкÑеÑном пÑимеÑе, но как бÑÑÑ Ð² ÑеÑ
меÑÑаÑ
, где Ð¼ÐµÐ¶Ð´Ñ .dialog и .title еÑÑÑ Ð´ÑÑгие ÑлеменÑÑ? ÐлиннÑе ÑепоÑки вида .dialog > ... > .title ÑÑÑаÑноваÑо вÑглÑдÑÑ Ð¸ делаÑÑ Ð²ÑÑÑÑÐºÑ ÑжаÑно негибкой. Ð ÑÑаÑÑÑÑ, еÑÑÑ Ð°Ð»ÑÑеÑнаÑивнÑй пÑÑÑ.
ЧÑÐ¾Ð±Ñ Ð¸Ð·Ð±ÐµÐ¶Ð°ÑÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½ÑÑ Ð¿Ñоблем, вÑе клаÑÑÑ Ð²Ð½ÑÑÑи виджеÑа наÑинаÑÑ Ñ ÐµÐ³Ð¾ имени.
ÐдеÑÑ Ð¸Ð¼Ñ dialog, Ñак ÑÑо вÑе, оÑноÑÑÑиеÑÑ Ðº диалогÑ, бÑдем наÑинаÑÑ Ñ dialog__
ÐолÑÑиÑÑÑ Ñак:
<div class="dialog">
<h2 class="dialog__title">Ðаголовок</h2>
<div class="dialog__content">
HTML-ÑодеÑжимое.
</div>
<div class="dialog__close">ÐакÑÑÑÑ</div>
</div>
<style>
.dialog { ... }
.dialog__title { ÑÑÐ¸Ð»Ñ Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²ÐºÐ° }
.dialog__content { ÑÑÐ¸Ð»Ñ ÑодеÑжимого }
...
</style>
ÐдеÑÑ Ð´Ð²Ð¾Ð¹Ð½Ð¾Ðµ подÑÑÑкивание __ ÑлÑÐ¶Ð¸Ñ Â«ÑÑандаÑÑнÑм» ÑазделиÑелем. Ðожно вÑбÑаÑÑ Ð¸ дÑÑгой ÑазделиÑелÑ, но пÑи ÑÑом ÑÑÐ¾Ð¸Ñ Ð¸Ð¼ÐµÑÑ Ð² видÑ, ÑÑо иногда Ð¸Ð¼Ñ ÐºÐ»Ð°ÑÑа Ð¼Ð¾Ð¶ÐµÑ ÑоÑÑоÑÑÑ Ð¸Ð· неÑколÑкиÑ
Ñлов. ÐапÑÐ¸Ð¼ÐµÑ title-picture. С двойнÑм подÑÑÑкиванием: dialog__title-picture, оÑÐµÐ½Ñ Ð½Ð°Ð³Ð»Ñдно видно где ÑÑо.
ÐÑÑÑ ÐµÑÑ Ð¾Ð´Ð½Ð¾ полезное пÑавило, коÑоÑое заклÑÑаеÑÑÑ Ð² Ñом, ÑÑо ÑÑили Ð´Ð¾Ð»Ð¶Ð½Ñ Ð²ÐµÑаÑÑÑÑ Ð½Ð° клаÑÑ, а не на Ñег. То еÑÑÑ, не h2 { ... }, а .dialog__title { ... }, где .dialog__title â клаÑÑ Ð½Ð° ÑооÑвеÑÑÑвÑÑÑем заголовке.
ÐÑо позволÑÐµÑ Ð¸ избежаÑÑ ÐºÐ¾Ð½ÑликÑов на вложеннÑÑ
h2, и иÑполÑзоваÑÑ Ð²Ñегда Ñе Ñеги, коÑоÑÑе имеÑÑ Ð¿ÑавилÑнÑй ÑмÑÑл, не оглÑдÑваÑÑÑ Ð½Ð° вÑÑÑоеннÑе ÑÑили (коÑоÑÑе можно обнÑлиÑÑ Ñвоими).
Ðа пÑакÑике из ÑÑÐ¸Ñ Ð¿Ñавил заÑаÑÑÑÑ Ð´ÐµÐ»Ð°ÑÑ Ð¸ÑклÑÑениÑ. Ðожно «веÑаÑÑ» ÑÑили на Ñеги и иÑполÑзоваÑÑ CSS-каÑÐºÐ°Ð´Ñ Ð±ÐµÐ· пÑеÑикÑов, еÑли Ð¼Ñ Ð¿Ñи ÑÑом ÑвÑÑдо понимаем, ÑÑо конÑликÑÑ Ð·Ð°Ð²ÐµÐ´Ð¾Ð¼Ð¾ иÑклÑÑенÑ.
ÐапÑимеÑ, когда Ð¼Ñ ÑоÑно знаем, ÑÑо никакого пÑоизволÑного HTML внÑÑÑи ÑлеменÑа (или внÑÑÑи данного поддеÑева DOM) не бÑдеÑ.
ÐÐÐ
ÐпиÑанное вÑÑе пÑавило Ð¸Ð¼ÐµÐ½Ð¾Ð²Ð°Ð½Ð¸Ñ ÑлеменÑов ÑвлÑеÑÑÑ ÑаÑÑÑÑ Ð±Ð¾Ð»ÐµÐµ обÑей конÑепÑии «ÐÐл, коÑоÑÐ°Ñ ÑазÑабоÑана в ЯндекÑе.
ÐÐРпÑÐµÐ´Ð»Ð°Ð³Ð°ÐµÑ ÑпоÑоб оÑганизаÑии HTML/CSS/JS в виде незавиÑимÑÑ Â«Ð±Ð»Ð¾ÐºÐ¾Ð²Â» â компоненÑов, коÑоÑÑе можно легко пеÑемеÑаÑÑ Ð¿Ð¾ Ñайловой ÑиÑÑеме и Ð¼ÐµÐ¶Ð´Ñ Ð¿ÑоекÑами.
Ðожно как взÑÑÑ ÑаÑÑÑ Ð¸Ð´ÐµÐ¾Ð»Ð¾Ð³Ð¸Ð¸, напÑÐ¸Ð¼ÐµÑ ÑиÑÑÐµÐ¼Ñ Ð¸Ð¼ÐµÐ½Ð¾Ð²Ð°Ð½Ð¸Ñ ÐºÐ»Ð°ÑÑов, Ñак и полноÑÑÑÑ Ð¿ÐµÑейÑи на инÑÑÑÑменÑаÑий ÐÐÐ, коÑоÑÑй даÑÑ Ð¸Ð½ÑÑÑÑменÑÑ ÑбоÑки Ð´Ð»Ñ HTML/JS/CSS, опиÑаннÑÑ Ð¿Ð¾ ÐÐÐ-меÑодÑ.
Ðолее подÑобное опиÑание оÑнов ÐÐРможно поÑиÑаÑÑ Ð² ÑÑаÑÑе https://ru.bem.info/articles/bem-for-small-projects/, а о ÑиÑÑеме вообÑе â на ÑайÑе https://ru.bem.info.
ÐÑого
-
ÐÑÑÑÑка должна бÑÑÑ ÑеманÑиÑеÑкой, иÑполÑзоваÑÑ ÑооÑвеÑÑÑвÑÑÑие ÑмÑÑÐ»Ñ Ð¸Ð½ÑоÑмаÑии Ñеги и клаÑÑÑ.
-
ÐлаÑÑ, опиÑÑваÑÑий ÑоÑÑоÑние вÑего компоненÑа, нÑжно ÑÑавиÑÑ Ð½Ð° его коÑневом ÑлеменÑе, а не на Ñом, коÑоÑÑй нÑжно «ÑкÑаÑиÑÑ» в ÑÑом ÑоÑÑоÑнии. ÐÑли ÑоÑÑоÑние оÑноÑиÑÑÑ Ð½Ðµ ко вÑÐµÐ¼Ñ ÐºÐ¾Ð¼Ð¿Ð¾Ð½ÐµÐ½ÑÑ, а к его ÑаÑÑи â Ñо на ÑооÑвеÑÑÑвÑÑÑем «по ÑмÑÑлÑ» DOM-Ñзле.
-
ÐлаÑÑÑ Ð²Ð½ÑÑÑи компоненÑа Ð´Ð¾Ð»Ð¶Ð½Ñ Ð½Ð°ÑинаÑÑÑÑ Ñ Ð¿ÑеÑикÑа â имени компоненÑа.
ÐÑо не вÑегда ÑÑÑого Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾, но позволÑÐµÑ Ð¸Ð·Ð±ÐµÐ¶Ð°ÑÑ Ð¿Ñоблем в ÑлÑÑаÑÑ , когда ÐºÐ¾Ð¼Ð¿Ð¾Ð½ÐµÐ½Ñ Ð¼Ð¾Ð¶ÐµÑ ÑодеÑжаÑÑ Ð¿ÑоизволÑнÑй DOM, как напÑÐ¸Ð¼ÐµÑ Ð´Ð¸Ð°Ð»Ð¾Ð³Ð¾Ð²Ð¾Ðµ окно Ñ Ð¿ÑоизволÑнÑм HTML-ÑекÑÑом.
ÐÑполÑзование
.dialog__titleвмеÑÑо.dialog .titleгаÑанÑиÑÑеÑ, ÑÑо CSS не пÑимениÑÑÑ Ð¿Ð¾ оÑибке к какомÑ-нибÑÐ´Ñ Ð´ÑÑгомÑ.titleвнÑÑÑи диалога.
ÐомменÑаÑии
<code>, Ð´Ð»Ñ Ð½ÐµÑколÑÐºÐ¸Ñ ÑÑÑок кода — Ñег<pre>, еÑли болÑÑе 10 ÑÑÑок — ÑÑÑÐ»ÐºÑ Ð½Ð° пеÑоÑниÑÑ (plnkr, JSBin, codepenâ¦)