
ããã«ã¡ã¯ãã¢ã€ã¬ãããã¶ã€ã³äºæ¥éšã®ããŒã¯ã¢ãã/ããã³ããšã³ããšã³ãžãã¢ã®å·¥è€ã§ããã¢ã€ã¬ãããã¶ã€ã³äºæ¥éšã§ã¯INSIDE UI/UXãšé¡ããŠãæå±ãã¶ã€ããŒãšãšã³ãžãã¢ããã¶ã€ã³ã»SEOã»ã¢ã¯ã»ã·ããªãã£ã»UI/UXãªã©ããããã¹ãã·ã£ãªãã£ã®ããé åã«å¯Ÿããç¥èŠãå¹ åºãçºä¿¡ããŠããŸãã
ä»åã¯1. è¯ãCSSãšã¯äœããæ¯ãè¿ãã2. ãããå®çŸããããã®èšèšææ³ã®ã²ãšã€ã§ãã BEMïŒBlock Element ModifierïŒ ã®ã¡ãªãããæ¹ããŠç޹ä»ãããšãšãã«ãBEMå°å ¥ã«ããã£ãŠå¿ ãã¶ã¡åœããè¿·ããã¡ãªé£æããã¿ãŒã³åããŠè§£æ±ºããããã®ãã³ããæžããŠãããŸããåŸåãæ¬é¡ã«ãªããŸãã®ã§ãååã¯é£ã°ããŠããã£ãŠå€§äžå€«ã§ãã
ããããè¯ãCSSãšã¯
ããŠã仿¥ã®webéçºã«ãããŠã¯ãã¶ã€ã³ã«ã³ãéãã«ã¬ã€ã¢ãŠãã§ããããšãã§ããã°OKâŠãšãããšããããäžæ©é²ãã§ããè¯ãCSSã³ãŒãããæžãæèã倧åã«ãªã£ãŠããŠããŸãã
ãªããªãwebãµã€ãã¯å€ãã®å Žåãäœã£ãŠçµããã§ã¯ãªãæ°å¹Žéçšãããã®ã§ãããã®éçšãã§ãŒãºã«ãããŠãæ°ãããã¶ã€ã³ã远å ãããªã©äºæ¬¡éçºãçºçãããããããŸãããè¯ãCSSã¯ããããéçšã»ä¿å®ã®ãã§ãŒãºã«ã匷ãã§ãã
ãããŠãã1ã€ã®ãã€ã³ããšããŠãããã³ããšã³ãã®ã³ãŒãã£ã³ã°ã«ãããŠãGitãSlackãªã©ã®ããŒã«ãå©çšãè€æ°äººã§å
±åéçºããããšãäžè¬åããŠãããæ®ã«ã³ããçŠã«èŠèããã2020幎以éã®æ¥æ¬ã«ãããŠã¯äžå±€ãªã¢ãŒãã¯ãŒã¯/ãã¬ã¯ãŒã¯ãå°å
¥ã®æµããå éããŠããããšããããŸããããããäžã«ãããŠã¯ãåãã°ãã/ãã¶ã€ã³éãã«ãªã£ãŠããã°ããâŠãšããããšãè¶
ããŠãè€æ°éçºè
ã®èª°ããäºæž¬ããããåœåã«ãŒã«ããããå
±åéçºãå éãããèšèšã«ãªã£ãŠãããã®ãè¯ãCSSãšèšããŸãã以äžã®èгç¹ããåªããCSSèšèšãåŠã³ãããŒã ã®å
±éçè§£ãšããå¿
èŠããããŸãã
Phil Watsonã®4åå
Googleã®ããã³ããšã³ãéçºè ã§ããPhil Waltonæ°ã¯è¯ãCSSãšã¯ä»¥äžã®4ã€ã®ç¹åŸŽãåããŠãããã®ã§ãããšæå±ããŠããŸãã
- PredictableïŒäºæž¬ããããïŒ
- MaintainableïŒä¿å®ããããïŒ
- ReusableïŒåå©çšããããïŒ
- ScalableïŒæ¡åŒµããããïŒ
ç®æ¡æžãã ãšæŽã¿ã«ããã§ãããå®éã®ã³ãŒãã£ã³ã°ãæ³åããã°çè§£ããããããšæããŸããèŠã¯è€æ°äººã§ã³ãŒããæžããããç¬ç«ããUIããŒã/ã³ã³ããŒãã³ããã¹ã¿ã€ã«ã¬ã€ãåããããæ¢åã®ã³ãŒããããšã«æ°ããã³ãŒããæžãããããããã¯åŸä»»è ã«åŒãç¶ã容æãªCSSã³ãŒããè¯ããšèšã£ãŠããŸãããããã¯CSSã«éããã©ã®èšèªã«ãèšããããšã§ãã
Nicolas Gallagherã®Idiomatic CSS
Twitterã®ããã³ããšã³ãéçºè Nicolas Gallagheræ°ã¯Idiomatic CSSãšããäžè²«æ§ã®ããCSSãæžãããã®ååãæå±ããŠããŸãã
âæåãåãããããžã§ã¯ããããŸã管çããããšã®äžã€ãèªåã§ã³ãŒããæžããŠå®çŸãããšããããšã§ã¯ãªããããå€ãã®äººãããªãã®ã³ãŒããå©çšããŠãããªãã仿§ã®äžã«ã¯ããªãã®å¥œã¿ã§ã¯ãªããæå€§éã«æç¢ºãªã³ãŒããæžãã¹ãã§ãããâ â Idan Gazit
- ã©ããªã«å€ãã®äººãè²¢ç®ãããšããŠããã©ã®ã³ãŒããäžäººã§æžããããã«ããã
- åæã®äžã®ã¹ã¿ã€ã«ã峿 Œã«å®ãã
- ããæ©ãããã§ããã°åžžã«çŸåããå ±éã®ãã¿ãŒã³ãå©çšããã
BEM

ããããéçºçŸå Žã®èŠè«ããçãŸããCSSèšèšææ³ã®äžã€ãBEMã§ãã
BEMïŒBlock Element ModifierïŒã¯å³æ Œã§æçãªåœåèŠåãæã¡ãããŒã éçºãä¿å®ã«ãåªããŠããCSSèšèšã§ããããã«ãåºæ¬çã«ãã¹ããã芪åé¢ä¿ã®ã¯ã©ã¹ãäœããªãç¹åŸŽã¯CSSããã©ãŒãã³ã¹åäžã«å¯äžããŸãïŒãã©ãŠã¶ã«ããCSSã®ãããã³ã°ã¯å³ããå·Šã«è¡ãããããã芪åé¢ä¿ããªãæ¹ãéããªãïŒãã€ãŸãPhil WatsonãšNicolas Gallagheräž¡æ°ã®æãããè¯ãCSSãã®ç¹åŸŽããã¹ãŠåããŠãããšèšããŸãã
BEMèªäœã¯æ¯èŒçæ¯ããæè¡ã§å€ãã®ããã¥ã¡ã³ãããããŸãã®ã§ããã®ããã°ã§ã¯BEMãšã¯äœãïŒã«ã€ããŠã¯ç«¯æããŸãã
詳ããã¯ä»¥äžã®ãªã³ã¯ãã芧ãã ãã
- Yandexã®BEMå ¬åŒããŒãž
- BEMå ¬åŒããŒãž
- æ¥æ¬èªè§£èª¬
- BEM ã䜿ãã¹ã5ã€ã®çç±ïŒãªã BEM ã G.R.E.A.T ãšãããã®ãïŒ
- åœåæ¹æ³
- MindBEMding
- BEMã®çºå±ç³»
- FLOCSS
- æžç±
- Webå¶äœè ã®ããã®CSSèšèšã®æç§æž ã¢ãã³Webéçºã«æ¬ ãããªããä¿®æ£ããããCSSãã®èšèšææ³
BEMã§è¿·ããã¡ãªé£æã¯ãã¿ãŒã³åããŠè§£æ±ºããã
ããŠããããããæ¬é¡ã§ããã¯ã©ã¹åããã¢ã以å€ã¯äžèœã«èŠããBEMã§ãããæãšããŠåœåãèšèšã«è¿·ãããšããããŸãããããã©ã®ããã«è§£æ±ºãã¹ããèããŠãããŸãã
Blockã®äžã®å«èŠçŽ
äŸãšããŠ1ã€ã®HTMLã³ãŒãã瀺ããŸãã
ã«ãŒãåUIã³ã³ããŒãã³ãã ãšæã£ãŠãã ããã
<div class="card">
<div class="card__header">
<h2 class="card__header__title">ã«ãŒãã®ã¿ã€ãã«</h2>
</div>
<div class="card__body">
<img class="card__body__img" src="some-img.png" alt="ç»å" />
<p class="card__body__text">ããã¹ããå
¥ããŸã
<a class="card__body__text__link" href="/somelink.html">ãªã³ã¯ã§ã</a>
</p>
</div>
</div>
.card__headerã®äžã®.card__header__titleããããã¯.card__bodyã®äžã®.card__body__textã.card__body__text__linkãšãã£ãBlockã®äžã®å«èŠçŽ ã®ã¯ã©ã¹åãã¢ã³ããŒã¹ã³ã¢2ã€ã®é£ç¶ã§é·å€§ã«ãªã£ãŠããŸãããã®ãŸãŸããã°ãã¹ããæ·±ããªãã«ãããã£ãŠããã«å€§å€ãªããšã«ãªãããã§ãã
ããã¯ä»¥äžã®ããã«è§£æ±ºã§ããŸãã
<div class="card">
<div class="card__header">
<h2 class="card__title">ã«ãŒãã®ã¿ã€ãã«</h2>
</div>
<div class="card__body">
<img class="card__img" src="some-img.png" alt="ç»å" />
<p class="card__text">ããã¹ããå
¥ããŸã
<a class="card__link" href="/somelink.html">ãªã³ã¯ã§ã</a>
</p>
</div>
</div>
HTMLäžã®ãã¹ã/芪åé¢ä¿ã¯ç¡èŠããã¯ã©ã¹åã.cardBlockã®äžã®Elementãšèãããšã¹ãããªããŸãããããŸã§Blockäžå¿ã«èããã®ããã€ã³ãã§ãã
SassåŽã§&ã䜿ãã
ããŠãHTMLåŽã¯ããã§ãããšããŠãSassåŽã®æžãæ¹ã¯2éããèããããŸãã
//Aãã¿ãŒã³: æçŽã«äžŠã¹ã
.card{
}
.card__header{
}
.card__body{
}
.card__title{
}
.card__title--primary{
}
ãšæçŽã«äžŠã¹ã圢ã¯KISSã®ååã«æ²¿ã£ãŠãããåŸããã¯ã©ã¹åã§æ€çŽ¢ããããã¡ãªããããããŸãã
//Bãã¿ãŒã³: &ã§ãã¹ããã
.card {
&__header {}
&__body {}
&__title {
&--primary {}
}
}
ãã¡ãã¯ãã¹ãèšæ³ã§CSSãæžããSassã®å©ç¹ãçããããšãã§ããŸããã
Sassã®äžã§ã¯ã¯ã©ã¹ããã¹ãããŠããŸãããã³ã³ãã€ã«ãããCSSãã¡ã€ã«äžã§ã¯ãã¹ãŠã®ã¯ã©ã¹ãåãåäžã®è©³çŽ°åºŠãä¿ã€ããšãã§ããŸãã
å人çã«ã¯ããã¯æ£è§£ããããã®ã§ã¯ãªãã©ã¡ãã®æžãæ¹ã§ãè¯ããšæããŸããåé ã§è§ŠããŸããããBEMã¯ããŒã éçºãåæã§ãã®ã§ããŒã ãšããŠå°å ¥ããããæ¹ãéžã¶ã¹ãã§ãã
BEM Helperãªã©VS Codeã®æ¡åŒµæ©èœã䜿ãåæãªããã¹ãèšæ³ã§çµ±äžããæ¹ã䟿å©ãããããŸããã
ã©ãããŒã¯ã©ã¹ãã©ãæžãã
BEMã§ã¯ã©ãããŒã¯ã©ã¹ãã©ãããããè¿·ããã€ã³ãã§ãã
BEMã®ååã«ã¯åãããã.card__wrapperãªã©ã®ã¯ã©ã¹åã蚱容ããããšãèããããŸãïŒäžèšAãã¿ãŒã³ïŒãããããæ¥é èŸl-ãä»ããã¬ã€ã¢ãŠãå°çšã¯ã©ã¹ãå©çšããæ¹æ³ïŒäžèšBãã¿ãŒã³ïŒããã¿ãŒã§ãããã
<!-- Aãã¿ãŒã³: BEMã®ååã«åãããã.card__wrapper ã¯ã©ã¹ã蚱容ãã -->
<div class="card__wrapper">
<div class="card">
<div class="card__header">
<h2 class="card__title">ã«ãŒãã®ã¿ã€ãã«</h2>
</div>
<div class="card__body">
<img class="card__img" src="some-img.png" alt="ç»å" />
<p class="card__text">ããã¹ããå
¥ããŸã
<a class="card__link" href="/somelink.html">ãªã³ã¯ã§ã</a>
</p>
</div>
</div>
<div class="card">
<div class="card__header">
<h2 class="card__title">ã«ãŒãã®ã¿ã€ãã«</h2>
</div>
<div class="card__body">
<img class="card__img" src="some-img.png" alt="ç»å" />
<p class="card__text">ããã¹ããå
¥ããŸã
<a class="card__link" href="/somelink.html">ãªã³ã¯ã§ã</a>
</p>
</div>
</div>
</div>
<!-- Bãã¿ãŒã³: æ¥é è© l- ãä»ããã¬ã€ã¢ãŠãã¯ã©ã¹ãå©çš -->
<div class="l-card-wrapper">
<div class="card">
<div class="card__header">
<h2 class="card__title">ã«ãŒãã®ã¿ã€ãã«</h2>
</div>
<div class="card__body">
<img class="card__img" src="some-img.png" alt="ç»å" />
<p class="card__text">ããã¹ããå
¥ããŸã
<a class="card__link" href="/somelink.html">ãªã³ã¯ã§ã</a>
</p>
</div>
</div>
<div class="card">
<div class="card__header">
<h2 class="card__title">ã«ãŒãã®ã¿ã€ãã«</h2>
</div>
<div class="card__body">
<img class="card__img" src="some-img.png" alt="ç»å" />
<p class="card__text">ããã¹ããå
¥ããŸã
<a class="card__link" href="/somelink.html">ãªã³ã¯ã§ã</a>
</p>
</div>
</div>
</div>
ããã¯åå空éã®èãæ¹ãå¿çšãããã®ã§ãCSSçã§ã¯SMACCSãæåã«åãå
¥ããæ¹æ³è«ã§ãã
ã¬ã€ã¢ãŠãã¯ã©ã¹ã¯éåžžã1. äžŠã¹æ¹ãã©ããããã2. ããŒãžã³ãšããã£ã³ã°ãã©ãã ãéããã 3. ç®±ã®å€§ããã¯ã©ã®ãããã 4. èæ¯è²ã¯äœè²ãâŠãšãã£ãéå®ãããæ
å ±ãæã¡ãäž»ã«ã³ã³ããŒãã³ãã®èæ¯ãç®±ãšããŠäœ¿ãããŸããããFLOCSSçãªãã¡ã€ã«éå±€æ§é ã«ããäžã§ã¬ã€ã¢ãŠãã¯ã©ã¹ãCSSãã¡ã€ã«ã®ååã§èªã¿èŸŒãŸããããã«ããŠããã°ã«ã¹ã±ãŒãã£ã³ã°ãªäžæžãã«ããã¬ã€ã¢ãŠã厩ããèµ·ãã«ãããªãã§ãããã
ã¬ã€ã¢ãŠãã¯ã©ã¹ã®ä»ã«ããæ¥é èŸã«ãã£ãŠCSSã¯ã©ã¹ã®ç²åºŠç®¡çãããæ¹æ³ã¯äŸ¿å©ã§ãã
l-:ã¬ã€ã¢ãŠãçšã¯ã©ã¹is-: ç¶æ ïŒstateïŒã衚ãã¯ã©ã¹js-: JavaScriptã«é¢ããã¯ã©ã¹u-: ãŠãŒãã£ãªãã£ã¯ã©ã¹
å人çã«ã¯äžèš4çš®é¡ãããã§æ¯èŒçãããæãã§äœ¿ã£ãŠããŸããc-ã§ã³ã³ããŒãã³ãã衚ãèšæ³ããããŸãããããã¯äœ¿ã£ãŠããŸãããã³ã³ããŒãã³ãã衚ãã¯ã©ã¹ã¯CSSã®äžã§ãã£ãšãå€ã䜿ããããããæ¥é èŸãäœããªããã°ã³ã³ããŒãã³ãããšããçè§£ã§ååã ãšèããããããã§ãã
ç¶æ ãè¡šãæ¹æ³
ç¶æ
ïŒstateïŒãè¡šãæ¹æ³ã2éãèããããããã§ãããããã¯å
ã»ã©ç޹ä»ããåå空éãå©çšããis-activeã®æ¹ã楜ã«ç®¡çã§ããŸãã
<!--Aãã¿ãŒã³ modifierã䜿çš-> <button type="button" class="button button--active">ãããã¯ãªãã¯</button>
<!--Bãã¿ãŒã³ åå空éã䜿çš-> <button type="button" class="button is-active">ãããã¯ãªãã¯</button>
ã¯ã©ã¹ãªãã®èŠçŽ ãžã®ã¹ã¿ã€ã«æå®ã蚱容ããã
ããšãã°ãã©ã³ããµã€ãºãè²ãäžæã®å¹³æã«äœ¿ãæåãã¯ã©ã¹ã¬ã¹ãªpèŠçŽ ã®ã¿ã§äœ¿ãããšã¯èš±å®¹ã§ãããšèããããŸãã
<p>ããã¯å¹³æã§ãã</p>
// foundation.scss ãªã©ã«æå®
p {
color: #333;
font-size: 16px;
line-height: 1.8;
}
éã«èŠªåé¢ä¿ãçºçããèŠçŽ ãã¯ã©ã¹ãªãã§äœ¿ãã®ã¯é¿ããã¹ãã§ãããã
<div class="list">
<ul>
<li>
<p>ããã¯ãã¹ããããpèŠçŽ ã§ã</p>
</li>
</ul>
</div>
äžèšã®ãããªãã¹ãã«ãã£ãŠã¹ã¿ã€ã«ã®å€åãçããã®ã§ããã°ãã¯ã©ã¹ãã€ããã¹ãã§ãã
// ããã ãšBEMã®æå³ããªã
.list {
ul {
li {
p {
color: #333;
font-size: 18px;
ããããããããããããããããfont-weight: bold
line-height: 1.7;
}
}
}
}
ã·ã³ã°ã«ã¯ã©ã¹orãã«ãã¯ã©ã¹
BEMã¯ãã«ãã¯ã©ã¹ã蚱容ããŸãã®ã§ããã«ãã¯ã©ã¹ã§è¯ãã§ããããèšãæãããšã¹ã¿ã€ã«ã®åŸ®å·®ã®ããã«ãã¹ãŠãã·ã³ã°ã«ã¯ã©ã¹ã«ããããšé 匵ãå¿
èŠã¯ãªããšããã§ãã
ãã ãé·å€§ãªã¯ã©ã¹ã®é£ç¶ã«ãªãæ¬ ç¹ã¯ãããŸãã
<button type="button" class="button button--border-black button--rounded button--size-full">
.button {
position: relative;
display: inline-block;
width: 320px;
height: 60px;
padding: 0;
cursor: pointer;
background-color: #fff;
border: 0;
font-size: 14px;
font-weight: bold;
color: #333;
text-decoration: none;
&--border-black {
border: 1px solid #333;
}
&--rounded {
border-radius: 3px;
}
&--size-full {
width: 100%;
}
}
äœè«ã§ããäžèšã®ããã«.--ããã¯ã©ã¹ãæžããã¿ãŒã³ã§ã¯ã©ã¹åãççž®ããããšãå¯èœã§ããããå§ãããŸããããã®èšæ³ã¯IE11ã§ãšã©ãŒã«ãªãããã§ããæ¥æ¬ã¯2022幎çŸåšãIE11ã®ã·ã§ã¢ããããªãã«ããããé¿ããæ¹ãç¡é£ã§ãïŒ2022幎6æã«ãµããŒãçµäºãçºè¡šãããŠããŸããïŒã
<!-- æ®å¿µãªããIEã§ãšã©ãŒâŠ --> <button class="button --border-black --rounded --size-full" type="button"> </button>
Sassãã¬ãŒã¹ãã«ããŒ%ã䜿ãã°ã·ã³ã°ã«ã¯ã©ã¹ãå¯èœã«
modifierã䜿ã£ãããªãšãŒã·ã§ã³ããããªã«ãããããªãã±ãŒã¹ïŒã ããã5以äžïŒã¯ã·ã³ã°ã«ã¯ã©ã¹ã§å€§äžå€«ã§ãã
ããããã±ãŒã¹ã§ã¯Sassãã¬ãŒã¹ãã«ããŒ%ã䟿å©ã§ãã
.buttonã®å
±ééšåã以äžã®ããã«Sassãã¬ãŒã¹ãã«ããŒã«èšè¿°ãã@extendã§åŒãç¶ãã§äœ¿çšã§ããŸãã
ãããªãSassãã¡ã€ã«å
ã§åãèšè¿°ãç¹°ãè¿ãããšããªããDRYååã«ãé©ããŸãã
ãã«ãã¯ã©ã¹èš±å®¹ãååãšãã€ã€ãããªãšãŒã·ã§ã³ã5以äžãªãã·ã³ã°ã«ã¯ã©ã¹ã§modifierã®å€åã«ãã察å¿ã§OKã®å ±éèªèãããã°åé¡ãªãããšæããŸãã
//_button.scss
%button {
position: relative;
display: inline-block;
width: 320px;
height: 60px;
padding: 0;
font-weight: bold;
font-size: 14px;
color: #333;
text-decoration: none;
background-color: #fff;
border: 0;
cursor: pointer;
}
.button {
@extend%button;
&--primary {
@extend%button;
border: 1px solid #333;
}
&--secondary {
@extend%button;
border: 1px solid #aa00ee;
border-radius: 3px;
}
}
äžèšãã³ã³ãã€ã«ãããšå ±ééšåã®ã¿ãŸãšãããã以äžã®CSSãåãåºãããŸãã
/*style.css*/
.button--secondary, .button--primary, .button {
position: relative;
display: inline-block;
width: 320px;
height: 60px;
padding: 0;
font-weight: bold;
font-size: 14px;
color: #333;
text-decoration: none;
background-color: #fff;
border: 0;
cursor: pointer;
}
.button--primary {
border: 1px solid #333;
}
.button--secondary {
border: 1px solid #aa00ee;
border-radius: 3px;
}
SassåŽãCSSåŽãã¹ãããªããŠãŠããæãã ãšæããŸãããïŒãã€ãŠã¯Sassã§ãã®èšæ³ã䜿ããã@at-rootã䜿ã£ãæå®ãå¿
èŠã§ãããã2022幎çŸåšã§ã¯ã¢ããããŒãã«ããå¿
èŠãªããªããŸããããã¡ããDart-Sassã§ã倧äžå€«ã§ãã
åè
â Sass (SCSS) BEMã§æžãæã« @at-root ã¯å¿
èŠãïŒ
â ãŸã éã«åãïŒnode-sassïŒLibSassïŒãã sassïŒDart SassïŒãžã®ç§»è¡
ä»åã®INSIDE UI/UXã¯ãããŸã§ã§ããäºæž¬æ§ã»ä¿å®æ§ã»åå©çšæ§ã»æ¡åŒµæ§ãããã«ããã©ãŒãã³ã¹ã«åªããå ±åéçºãå éãããCSSèšèšææ³BEMã䜿ã£ãŠè»œå¿«ãªUI/UXãå®çŸããŠãããŸãããïŒ
P.S. ã¢ã€ã¬ããã§ã¯ãšã³ãžãã¢ããã¶ã€ããŒãåéããŠããŸãã詳ããã¯æ¡çšæ å ±ã®ããŒãžãã芧ãã ããã