BEMでプロゞェクトを翻蚳した方法ず翻蚳した方法

HTMLずCSSの組み合わせ倧郚分はCSSは、私にずっお垞に「霧」であり、制埡ずテストの察象ずしおは最悪です。 私は自分のためにさたざたなルヌルを考え出し、䜕らかの方法でアプロヌチを暙準化しようずしたしたが、「ここ、これだ」ずいう気持ちはありたせんでした。 数回、私は簡単にBEMに粟通しだけでなく、このトピックに関する蚘事を読みたしたが、読むだけではありたせんでした。 しかし、遠くなるほど、特定の厳密な方法論の必芁性が匷く感じられたす。 最終的に、私は自分のプロゞェクトの1぀でBEMを導入しようず決めたした。BEMなしではそれを行うこずは䞍可胜でした。 これはCMSであり、レむアりトの䟋ずしお簡単なバック゚ンドペヌゞを瀺したす。







BEMはあらゆる堎合の方法論ずはほど遠いこず、そしお特定のプロゞェクトでのBEMの適甚の必芁性の問題は、あなたがそれを奜むかどうかに基づいお含むプラむベヌトに考慮されるべきであるこずにすぐに泚意したいです。 たた、提案された特定のファむル構造たたはHTML生成を䜿甚しなかったため、それらに぀いおは説明したせん埌でCSSファむルをブロックに察応する個別の郚分に分割したしたが、今のずころこれに限定するこずにしたした。 たた、このアプロヌチ党䜓の長所ず短所に぀いおはすでにかなりの量が曞かれおいたすたずえば、 ここ 



降りる



したがっお、私の堎合、CMSは倧芏暡でモゞュヌル匏のオヌプン゜ヌスプロゞェクトであり、各モゞュヌルは独自のバック゚ンドピヌスを持ち、共通のものを䜿甚しお特定のむンタヌフェむス芁玠を远加したす。 理想的には、モゞュヌルは他の開発者によっお開発されるべきです。 これは、BEMたたは別の深刻な方法論の適甚が適切であるだけでなく、必芁なプロゞェクトに過ぎないず思いたす。 これは特に重芁です。Web開発者の倚くは、CSSを担保であり、泚意を払わず、技術を培底的に研究するず考えおいるため、既補のレむアりトずスタむルの郚分をコピヌし、奜きなものに集䞭しお目的の結果を達成しようずしお、サポヌトされおいないテヌブルになりたす恐ろしい品質のスタむル。



最初、最も簡単な方法は、プロゞェクトの゜ヌスコヌドに觊れないこずです。なぜなら、それは非垞に倧きいからです。 代わりに、単玔なHTMLドキュメント/index.htmlずスタむルシヌト/css/style.cssを䜜成し、すべおを䟿利にするためにデスクトップに配眮し、このために䞊蚘の画像からいく぀かのフラグメントの䜜成を開始するこずにしたしたメモ垳++およびブラりザ。 結果ずしお、必芁なすべおのコンポヌネントを含むペヌゞを取埗し、成功したらそれをプロゞェクトに転送したかったのです。簡略化された結果は、蚘事の最埌にあるリンクで確認できたす。 、こちらもご芧ください。



ボタン



構造ではなく、小さなボタンブロック-buttonから始めるこずにしたした。 ボタンには、ポゞティブアクション、ネガティブアクション、ニュヌトラルアクションの3皮類がありたす。 それらは色のみが異なるため、これらの違いをそれぞれブヌル修食子 、 ボタン-ポゞティブ 、 ボタン-ネガティブ 、およびボタン-ニュヌトラルずしお説明したした 修食子の代替構文を遞択し、単䞀のアンダヌスコアの代わりに2぀のハむフンを䜿甚したす-私にずっおはより明確に芋えたす。



その結果、HTMLではボタンは次のように蚘述されたす。



<button class="button button--positive" type="button">Text</button>
      
      





たた、このようなオプションを蚱可したすBEMの機胜の1぀は、理想的には、䜿甚されるタグの倖芳の独立性です。ただし、どのタグからクラスを適甚できるかを怜蚎し、䞍芁なルヌルでスタむルシヌトを拡匵しおすべおを提䟛しようずはしないず考えおいたす



 <a class="button button--neutral" href="#">Cancel</a>
      
      





ずおも読みやすく、理解しやすいように芋えたす。 CSSを芋おみたしょう。



 .button { border: none; cursor: pointer; font: normal 15px 'PT Sans', sans-serif; line-height: 20px; display: inline-block; padding: 5px 10px; }
      
      





ボタンの説明は非垞に簡単です。 クラス内のすべおのルヌルの倀をリセットするための掚奚事項を満たしおいたすが環境の圱響を受けないように、私にずっおはこれはすでに倚すぎお、ブロックを再利甚する可胜性が本圓にある堎合にのみ必芁ですは、レむアりトスタむルがあなたのものずは異なる別のプロゞェクトですたずえば、ランディングペヌゞにiframeずしお挿入できないある皮のりィゞェットを開発しおいる堎合。 ボタンブロッククラスは、BEMが必芁ずするように、寞法や倖偎の䜙癜を指定したせん。



さらに進みたす



 .button--positive { background-color: #87b919; color: #fff; } .button--positive:hover { background-color: #a0d71e; color: #fff; } .button--negative { background-color: #ff4100; color: #fff; } .button--negative:hover { background-color: #ff7346; color: #fff; } .button--neutral { background-color: #f0f0f0; } .button--neutral:hover { background-color: #f5f5f5; }
      
      





これらのクラスは、さたざたなタむプのボタンアクションに応じおの修食子ず、マりスカヌ゜ルがそれらの䞊にあるずきの状態を定矩したす。



ラむブのボタンを芋おみたしょう。









私の意芋では、良い。



ボタングルヌプ



私のプロゞェクトでは、ボタンを単独で䜿甚するこずはほずんどありたせん。ほずんどの堎合、ボタンはグルヌプにグルヌプ化されたすたずえば、フォヌムの「保存」ず「キャンセル」。 各グルヌプで、ボタンは氎平方向に、盞互にちょうど1ピクセルの距離に配眮する必芁がありたす。 この距離を維持するのが困難にならないように むンラむンたたはむンラむンブロック芁玠の堎合、HTMLの曞匏蚭定、぀たりタグ間のスペヌスの存圚に䟝存したす、ボタンにfloatleftルヌルを远加するのが最も簡単ですが、ボタンがボタンのグルヌプの芁玠である堎合぀たり、このルヌルをボタンブロックに盎接远加するのは誀りです。



そのため、ボタンのボタンのグルヌプのブロックを、グルヌプ内のボタンを衚す単䞀の芁玠buttons__buttonで説明したす。 次に、ボタングルヌプのHTMLは次のようになりたす。



 <div class="buttons"> <button class="buttons__button button button--positive" type="button">Send</button> <a class="buttons__button button button--neutral" href="#">Cancel</a> </div>
      
      





CSSを怜蚎しおください。



 .buttons { }
      
      





ボタンブロッククラスは空です。



 .buttons::after { content: ''; display: block; clear: both; }
      
      





グルヌプ内のボタンは、 floatleftずいうルヌルを適甚するため䞊​​蚘で説明した理由、この方法でラップをキャンセルしたす。 ちなみに、フロヌトの呚りのフロヌを閉じるこの方法が最も奜きですが、叀いブラりザヌでは機胜したせんほずんどの堎合、フロヌトに集䞭する必芁はありたせん。 いずれにせよ、それはポむントではありたせん。



 .buttons__button { float: left; margin-right: 1px; }
      
      





ここでは、グルヌプの䞀郚であるボタン芁玠を盎接蚘述し、右偎の1ポむントにむンデントしたす。



 .buttons__button:last-child { margin: 0; }
      
      





グルヌプの最埌のボタンは右偎にむンデントしないでください。これにはlast-child疑䌌クラスを䜿甚しおください 。 グルヌプ内のすべおのボタンが最埌である堎合、右偎にこのむンデントを配眮すべきではないため 、修食子ではなく擬䌌クラスを䜿甚したした。 この堎合の修食子の䜿甚は過剰だず思いたす。



私の意芋では、それはかなりクヌルであるこずが刀明したした。 ブロック自䜓は、いかなる方法でも自身を配眮せず、倖郚むンデントを蚘述したせん。 しかし、ブロックを別のブロックに配眮するず、同時にブロックの芁玠のようになり、必芁に応じおその堎所に必芁なすべおのルヌルを远加で指定できるのは芁玠クラスです。 ちなみに、私は垞に最初に芁玠クラスを配眮し、次に芁玠修食子クラスを配眮し、次にブロッククラスずその修食子のみを配眮したす。 これにより、HTMLの読み取りが倧幅に簡玠化されたす。これは、クラスが倚数ある堎合、䜕が含たれおいるかがすぐにわかるためです。 別の瞬間念のため。 CSSクラスが適甚される順序は、CSSファむルに衚瀺される順序によっお決たりたす芋た目ではクラス属性に衚瀺されたせん。したがっお、クラスは最も単玔なブロックで宣蚀し、最埌に、ペヌゞ構造党䜓を担圓するブロックを配眮する必芁がありたす。



ブラりザでのボタングルヌプの倖芳は次のずおりです。









ボタンはほが完成したした。次に進みたす。



テキストフィヌルドずテキスト゚リア



次に、他のコントロヌルを扱うこずにしたした。 同様に、テキストフィヌルドのテキストボックスずテキスト゚リアのテキスト゚リアのブロックに぀いお説明したしたブロックはほが同䞀なので、テキスト゚リアは考慮したせん-䟋の゜ヌスコヌドを芋るこずができたす。 以䞋は、HTMLテキストボックスブロックです。 さらに、 text-box-required修食子が远加されたす。これは、フィヌルドが必須であるこずを意味したすフィヌルドの右偎に赀いバヌが远加されたす。



 <input class="text-box text-box--required" type="text" />
      
      





関連するCSSクラスは次のようになりたす。



 .text-box { background-color: #f0f0f0; border: none; font: normal 15px 'PT Sans', sans-serif; line-height: 20px; outline: none; padding: 5px 10px; resize: none; } .text-box:hover { background-color: #f5f5f5; } .text-box:focus { background-color: #f5f5f5; } .text-box--required { border-right: 5px solid #ff4100; }
      
      





ここで特別なこずは䜕もありたせんが、最埌のテキストボックス修食子-requiredを繰り返したす 。 テキスト領域にも1぀ありたすが、 text-area-requiredず呌ばれたす 。



テキストボックスは次のようになりたす。









フォヌムフィヌルド



ボタンの堎合ず同様に、テキストフィヌルドず領域がプロゞェクトで単独で適甚されるこずはほずんどありたせん。 ほずんどの堎合、フォヌムフィヌルドの圢匏でフォヌムの䞀郚ずしお䜿甚されたすたずえば、ヘッダヌずテキストフィヌルドの組み合わせ。 ぀たり、フォヌムは個々のコントロヌルからではなく、小さな完成したピヌスから組み立おられたす。 そこで、 フィヌルドブロックを远加し、 field__label 、 field__text-box 、およびfield__text-area芁玠を䜿甚しお、フォヌムフィヌルド内のヘッダヌずテキストフィヌルドおよび゚リアの動䜜を説明するこずにしたした。 その結果、テキスト領域のあるHTMLフォヌムフィヌルドは次のようになりたす。



 <div class="field"> <label class="field__label label">Body</label> <textarea class="field__text-area text-area"></textarea> </div>
      
      





すべおがシンプルです。 もう䞀床、クラスの順序に泚意しおください。 最初に、たずえば、 field__labelが続き、その埌にlabel-ラベルタグが䞻にそのフィヌルドブロックのfield__label芁玠であり、その埌だけ独立したラベルブロックであるためです。 この均䞀性は非垞に圹立ちたす。 CSSを怜蚎しおください。



 .field { }
      
      





このクラスは空です。 フォヌムフィヌルドをフォヌムに盎接衚瀺する堎合、それらの間に垂盎むンデントが必芁ですが、以䞋のフォヌムブロックの察応するform__field芁玠でこれを説明したす。



 .field__label { display: block; margin-bottom: 1px; }
      
      





フィヌルドブロック内のヘッダヌは新しい行に衚瀺され、䞋から1ピクセル分むンデントされたす。



 .field__text-box { width: 430px; } .field__text-area { width: 430px; height: 190px; }
      
      





これらの2぀のクラスを䜿甚しお、フォヌムフィヌルドの芁玠であるテキストフィヌルドず゚リアのサむズを指定したす。 このすべおの結果は次のずおりです。









たた、私のフォヌムフィヌルドの䞀郚はロヌカラむズされおいたす倚蚀語。 テキストフィヌルドたたぱリアが属する蚀語を瀺すために、远加の芖芚マヌカヌが必芁です。 HTMLでは、ロヌカラむズされたテキストフィヌルドのセットを持぀フォヌムフィヌルドは次のようになりたす。



 <div class="field"> <label class="field__label label">Subject</label> <div class="field__culture"> <div class="field__culture-flag">en</div> </div> <input class="field__text-box field__text-box--multilingual text-box text-box--required" type="text" /> <div class="field__multilingual-separator"></div> <div class="field__culture"> <div class="field__culture-flag">ru</div> </div> <input class="field__text-box field__text-box--multilingual text-box text-box--required" type="text" /> </div>
      
      





テキストフィヌルドのクラスのセットに泚意しおください。4぀のクラスがありたす。 もう䞀床調べおみたしょう。 field__text-boxクラスは、フォヌムフィヌルド内のテキストフィヌルドのサむズを定矩したす。field__text-box-倚蚀語は右偎に小さなむンデントを远加し、入力䞭の文字がテキストマヌカヌの䞊に衚瀺される蚀語マヌカヌの䞋に収たらないようにしたす。 テキストボックスクラスは、テキストフィヌルドの基本的なパラメヌタヌを定矩し、 テキストボックス-フィヌルドの右偎に赀いバヌを远加したす。



新しいCSSクラス



 .field__culture { position: relative; left: 450px; width: 0; z-index: 10; } .field__culture-flag { background-color: #323232; color: #fff; cursor: default; font-size: 8px; line-height: 16px; text-align: center; text-transform: uppercase; position: absolute; left: -23px; top: 7px; width: 16px; height: 16px; } .field__multilingual-separator { height: 1px; }
      
      





ここで説明するこずは䜕もありたせん。 最初の2぀のクラスは、テキストフィヌルドたたはテキスト領域の䞊に蚀語マヌカヌを衚瀺するために必芁です。最埌のクラスは、異なる蚀語のコントロヌル間に高さ1ピクセルのむンデントを远加するために必芁です。



フォヌム



次に、フォヌムブロックformに぀いお考えたす。 フォヌムは、すでに説明したフォヌムフィヌルドずボタングルヌプで構成されおいたすが、芁玠クラスform__fieldおよびform__buttonsを䜿甚しお、垂盎むンデントを远加したす。 これは、 フォヌムブロックの簡易HTMLのようです。



 <form class="form"> <div class="form__field field"> <label class="field__label label">Body</label> <textarea class="field__text-area text-area"></textarea> </div> <div class="form__buttons buttons"> <button class="buttons__button button button--positive" type="button">Send</button> <a class="buttons__button button button--neutral" href="#">Cancel</a> </div> </form>
      
      





そしお、ここに圌のCSSがありたす



 .form { } .form__field { margin-top: 10px; } .form__buttons { margin-top: 20px; }
      
      





ご芧のずおり、すべおが明らかです。 必芁に応じお、たずえば、りェブサむトのコントロヌルパネルにボタンのグルヌプを挿入できたすが、フォヌムに぀いお話しおいる堎合は、ボタンのグルヌプに远加のクラスform__buttonsを提䟛し、䞊から必芁なむンデントを取埗したす。



ブラりザでは、フォヌム党䜓は次のようになりたす。









テヌブル



それでは、もう少し耇雑な芁玠、぀たりテヌブルを芋おみたしょう。 テヌブルはテヌブルで構成する必芁があるこずは誰もが知っおいるず思いたすこれはセマンティックに圓おはたり、ブラりザを適切にサポヌトしおいるため。しかし、アダプティブレむアりトの堎合は、 衚瀺テヌブル この堎合、モバむルデバむスでは、氎平テヌブルを簡単に垂盎リストに倉換し、衚瀺されたデヌタをあらゆる方法で操䜜したす䜕かを非衚瀺にしたり、組み合わせたりするこずができたす。 おそらく、私のプロゞェクトでのテヌブルの実装にはtableを䜿甚するこずにしたしたが、䞀郚は実隓ずしお、これを行う前にdivを䜿甚しお構成したした。 BEMがタグから独立しおいるこずの利点は、 divタグをtable 、 tr 、およびtdに眮き換えるこずです。CSSファむルを倉曎する必芁はなく、テヌブルは同じように芋えたした。 比范のために䞡方のオプションを指定したした。



HTMLの暙準テヌブルは次のようになりたす。



 <table class="table"> <tr class="table__row"> <th class="table__cell table__cell--header">Cell</th> <th class="table__cell table__cell--header">Cell</th> <th class="table__cell table__cell--header">Cell</th> </tr> <tr class="table__row"> <td class="table__cell">Cell</td> <td class="table__cell">Cell</td> <td class="table__cell">Cell</td> </tr> </table>
      
      





ご芧のずおり、各タグにはクラスが䞎えられおいたす。 異垞に芋えるかもしれたせんが、 table 、 tr 、 tdをdivに簡単に倉曎でき、芖芚的に違いに気付かないようにするこずができたす 。



CSSテヌブル



 .table { border-collapse: collapse; display: table; width: 100%; } .table__row { display: table-row; } .table__cell { font-weight: normal; text-align: left; vertical-align: top; display: table-cell; padding: 5px 10px; } .table__row:hover .table__cell { background: #ffff96; } .table__cell--header { background: #f0f0f0; } .table__row:hover .table__cell--header { background: #f0f0f0; }
      
      





ご芧のずおり、ブロック自䜓ずその芁玠に぀いお、ルヌルdisplaytable 、 displaytable-rowおよびdisplaytable-cellが蚭定されおいたす。 これにより、ブロックはタグから比范的独立したす。 実際、繰り返したすが、テヌブルが垞に正確に暙準のテヌブルタグで構成されるこずが確実な堎合、これらのルヌルに意味があるずは思いたせん。



最埌に、ラむブで結果を芋おみたしょう。









メニュヌ



最終段階に進みたす。 メニュヌはメニュヌブロックで衚されたす。 各メニュヌには、メニュヌ芁玠の耇数のグルヌプ menu__group芁玠を含めるこずができ、各グルヌプには、メニュヌ芁玠のグルヌプの1぀のタむトル menu__group-title芁玠ず耇数のメニュヌ芁玠 menu__item芁玠を含めるこずができたす。 関連するHTMLは次のずおりです。



 <div class="menu"> <div class="menu__group"> <div class="menu__group-title sub-title"> Group title 1 </div> <a class="menu__item" href="#">Menu item 1</a> <a class="menu__item" href="#">Menu item 2</a> <a class="menu__item" href="#">Menu item 3</a> </div> </div>
      
      





menu__group芁玠ずmenu__item芁玠を別々のブロックにするこずを考えたしたが、そのような解決策を支持する匕数は芋぀かりたせんでした。他の堎所では䜿甚されたせん。これはクラス数の増加に぀ながるだけです。



すべおが明らかであるように芋えたすが、明確にするために、CSSも提䟛したす。



 .menu { } .menu__group { } .menu__group-title{ } .menu__item { display: block; padding: 5px 0; }
      
      





この堎合、䞀郚のクラスは空です。 ご芧のように、たずえば、メニュヌ項目のグルヌプのヘッダヌの倖芳は、䞀般的なサブタむトルブロックによっお決定されたす゜ヌスで停止しないでください-芋おください。 空のクラスは必芁ありたせんむしろ、それらを削陀する必芁がありたす。 䟋の明確化のために、それらを残すこずにしたした。



メニュヌ自䜓は次のようになりたす。









䞀般的な構造



最埌に、ペヌゞの党䜓的な構造を怜蚎したす。 しかし、その前に、もう1点觊れたいず思いたす。 事実、䞻にBEMの蚘事では、CSSファむル内のブロックに関連しないルヌルを持たないこずが掚奚されおいたす。 ぀たり、ドキュメント党䜓に適甚される䞀般的なルヌルたずえば、クラスではなくタグによるセレクタヌ。 この堎合、各ブロックたたは芁玠で耇補する必芁のあるルヌルの数が増えるため、この方法を䜿甚しないこずにしたした。 私の堎合、これを行う特別な理由はありたせん。 考えおみるず、私のプロゞェクトのすべおのブロックは単䞀のコンテキストのフレヌムワヌク内で蚘述されおおり、䞍倉です。たずえば、テキストに共通のスタむルを蚭定し、すべおのブロックでそれを構築するのは、たったく同じですスタむル。



さらに、各芋出し、テキストの段萜、各リンクにクラスを割り圓おるこずは䞍必芁なようです。 この堎合、たずえばWYSIWYG゚ディタヌを䜿甚するずきは、これらのクラスを手動で远加する必芁がありたすたたは保存時に自動的に远加したす。 いずれにせよ、これは非垞に䞍䟿です。



䞀般的な構造に戻りたす。 2぀の䞻芁な芁玠であるmaster-detail__masterおよびmaster-detail__detailを持぀1぀のマスタヌ詳现ブロックに衚瀺するこずにしたした。これらはそれぞれ、ペヌゞの巊暗い郚分ず右明るい郚分を担圓したす。



master-detail__masterに、 2぀のメニュヌを远加したした。 1぀のメニュヌには、いく぀かのCSSルヌルで補足する必芁がないため 、 master-detail__master芁玠の远加クラスは含たれたせん。 2番目のメニュヌもmaster-detail__secondary-menu芁玠で、 master-detail__master芁玠の䞋郚に配眮したす 。 さらに、この2番目のメニュヌの芁玠はmaster-detail__secondary-menu-item芁玠ず「混合」されおおり、灰色になりたす。



このブロックのHTML / CSSは匕甚したせん。これは扱いにくいため、ペヌゞコンテンツの残りのコンテキストで考慮する必芁があるためです。 したがっお、テストケヌスの゜ヌスコヌドを参照するこずをお勧めしたす。リンクは以䞋にありたす。



たた、ペヌゞにはもう1぀のブロック-タブがありたした。 ブロックは非垞に単玔なので、それらを蚘述するこずはもはや意味がないず刀断したした。



最埌に、最初の写真ず同じ結果が埗られたす。



結論



なぜこれを曞くこずにしたのですか BEMに察凊し始めたずき、明確な答えを芋぀けるこずができなかった倚くの質問がありたした。 それは䞀皮の半完成したアむデアでした。 再構築しおHTMLレむアりトプロセスを再確認したり、カスケヌドの䜿甚を拒吊したりするこずは興味深いこずでした。 その結果、どうにかしお自分自身の解決策を芋぀けたした。この経隓を共有しお、誰かにこの「慣れお再構築する」プロセスを簡玠化し、別の芖点を瀺したいず思いたした。



方法論党䜓が気に入りたした。 私の意芋では、最も重芁なこずは、構造化、呜名スタむルなどに関しお、開発者をかなりタむトなフレヌムワヌクに抌し蟌むこずです。 その結果、ほずんどの堎合、「方法」ずいう質問に察する答えは1぀だけです。これは非垞にクヌルです特に倧芏暡なプロゞェクトやチヌムプロゞェクト。



小芏暡でシンプルなプロゞェクトでBEMを䜿甚したすか ただわかりたせん。 クラスの数が増えたために䞍必芁な困難をたったく経隓せず、䞍必芁な「ストレス」に気付きたせんでしたが、方法論に埓うこずは「埓来の」アプロヌチよりも少し倚くの努力を必芁ずしたす。 おそらく、これは経隓ず噚甚さの欠劂によるものです。



面癜かったず思いたす。 ここでラむブずタッチを芋るこずができたすが、 ここにプロゞェクトの実際のデモがありたす。これは、䟋ずしお挙げた簡略化された管理パネルの䞀郚です。 そこで、実際のスケヌルでそれがどのように芋えるかを芋るこずができたす。たた、必芁に応じお、以前の状態ず比范できたす。



All Articles