12i*_*nit 5 javascript css bem
一直在努力学习BEM,虽然我知道BEM不仅仅是CSS,但它似乎是一个最好的起点.
所以我做了一些基本的preloader css:https: //jsfiddle.net/ygz931s7/
并修改它以符合BEM符号:https: //jsfiddle.net/af36921w/
有问题的部分是loaded从js方面简化了东西的类,我不知道如何做'BEM'.
我的尝试导致了这个:https: //jsfiddle.net/rd40ve3m/
我的问题是:
有一个更好的方法来做到这一点.在最后的例子中,我需要修改几个元素并知道要使用的特定类,在原始示例中我需要添加一个类.
那么有更好的"BEM" - 这样做的方式吗?
这是上一个例子中提到的代码:
HTML:
<div class="container">
<div class="loader">
<div class="loader__element loader__element--left"></div>
<div class="loader__element loader__element--right"></div>
</div>
</div>
Run Code Online (Sandbox Code Playgroud)
CSS:
.loader {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
z-index: 1000;
}
.loader__element {
position: fixed;
top: 0;
width: 51%;
height: 100%;
background: black;
z-index: 1000;
transform: translateX(0);
}
.loader__element--left {
left: 0;
}
.loader__element--right {
right: 0;
}
/* loaded */
.loader--loaded {
visibility: hidden;
transform: translateY(-100%);
transition: all 0.4s ease-out 0.8s;
}
.loader--loaded__element--left {
transform: translateX(-100%);
transition: all 0.4s ease-out 0.4s;
}
.loader--loaded__element--right {
transform: translateX(100%);
transition: all 0.4s ease-out 0.4s;
}
Run Code Online (Sandbox Code Playgroud)
JS:
setTimeout(function() {
document.getElementsByClassName("loader")[0].classList.toggle('loader--loaded');
document.getElementsByClassName("loader__element--left")[0].classList.toggle('loader--loaded__element--left');
document.getElementsByClassName("loader__element--right")[0].classList.toggle('loader--loaded__element--right');
}, 1000);
Run Code Online (Sandbox Code Playgroud)
解:
BEM metodology允许嵌套选择器(https://en.bem.info/methodology/css/#nested-selectors)因此只使用loder-loaded修饰符就可以了(tnx to @tadatuta).因此生成的代码将是:
HTML:
<div class="container">
<div class="loader">
<div class="loader__element loader__element--left"></div>
<div class="loader__element loader__element--right"></div>
</div>
</div>
Run Code Online (Sandbox Code Playgroud)
CSS:
.loader {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
z-index: 1000;
}
.loader__element {
position: fixed;
top: 0;
width: 51%;
height: 100%;
background: black;
z-index: 1000;
transform: translateX(0);
}
.loader__element--left {
left: 0;
}
.loader__element--right {
right: 0;
}
/* loaded */
.loader--loaded {
visibility: hidden;
transform: translateY(-100%);
transition: all 0.4s ease-out 0.8s;
}
.loader--loaded .loader__element--left {
transform: translateX(-100%);
transition: all 0.4s ease-out 0.4s;
}
.loader--loaded .loader__element--right {
transform: translateX(100%);
transition: all 0.4s ease-out 0.4s;
}
Run Code Online (Sandbox Code Playgroud)
JS
setTimeout(function() {
document.getElementsByClassName("loader")[0].classList.toggle('loader--loaded');
}, 1000);
Run Code Online (Sandbox Code Playgroud)
只需切换loader修饰符就足够了。在这种情况下,元素的样式可以使用嵌套。有关更多信息,请参阅https://en.bem.info/methodology/css/#nested-selectors 。