aklump / bem
一个强制执行块元素修饰(CSS)方法的PHP项目。
0.0.3
2023-12-05 19:24 UTC
Requires
- php: >=7.3
Requires (Dev)
- ext-curl: *
- aklump/phpswap: ^0.0.7
- phpunit/phpunit: ^9.5
- twig/twig: ^2
README
BEM — 是一种方法,可以帮助您在前端开发中创建可重用组件和代码共享
用法
创建一个类实例来表示您的BEM模型。将“块”作为构造函数参数传递。
$bem = new \AKlump\Bem\Fluent\Bem('foo');
所有方法都返回一个对象实例,该实例可以转换为字符串。或者,您也可以根据需要调用 toString()
或 toArray()
;有关详细信息,请参阅 \AKlump\Bem\Fluent\Interfaces\OutputInterface
。以下所有代码产生相同的输出。
(string) $bem->block(); // foo
strval($bem->block()); // foo
$bem->block()->toString(); // foo
为了简单起见,以下示例将仅展示第一种形式。
基本四要素
(string) $bem->block(); // "foo" (string) $bem->element('content'); // "foo__content" (string) $bem->block()->modifier('has-image'); // "foo--has-image" (string) $bem->element()->modifier('content', 'has-image'); // "foo__content--has-image"
JavaScript用途
(string) $bem->block()->js(); // "js-foo" (string) $bem->element('content')->js(); // "js-foo__content"
便利语法
有一些便利之处需要注意;特别关注 plus*
方法。
// In both cases "foo js-foo" === $classes. $classes = $bem->block() . ' ' . $bem->block()-js(); $classes = $bem->block()->plusJs(); // In both cases "foo foo--bar" === $classes. $classes = $bem->block() . ' ' . $bem->block()->modifier('bar); $classes = $bem->block()->plusModifier('bar); // In both cases "foo foo--bar js-foo js-foo--bar" === $classes. $classes = implode(' ', [ $bem->block(), $bem->block()->modifier('bar), $bem->block()->js(), $bem->block()->modifier('bar)->js(), ]); $classes = $bem->block()->plusModifier('bar)->plusJs()
"全局"创新
您将在本项目中发现一种名为 全局 的创新。它可以一次性针对所有块的公共部分进行定位。以下示例中,component
和 component__content
分别代表 全局块 和 全局元素。这种创新在此处允许您在单行CSS中定位所有三个组件的 content
。这可以被视为一种分组方法。使用 plusGlobal()
方法实现此功能。
<section> <div class="story component"> <div class="story__content component__content"></div> </div> <div class="film component"> <div class="film__content component__content"></div> </div> <div class="copy component"> <div class="copy__content component__content"></div> </div> </section>
.component__content { width: 900px; margin: auto; }
$story = new \AKlump\Bem\Fluent\Bem('story', 'component'); $film = new \AKlump\Bem\Fluent\Bem('film', 'component'); $copy = new \AKlump\Bem\Fluent\Bem('copy', 'component'); $story->element('content')->plusGlobal(); // "story__content component__content" $film->element('content')->plusGlobal(); // "film__content component__content" $copy->element('content')->plusGlobal(); // "copy__content component__content"
转换为数组
给定以下复杂链,您可以看到 plus*
方法的有用性以及为什么您可能想要使用 toArray()
方法。
$bem = new \AKlump\Bem\Fluent\Bem('foo', 'components'); $classes = $bem->element('content') ->plusModifier('first') ->plusGlobal() ->plusJs() ->toArray(); $classes === [ 'foo__content', 'foo__content--first', 'js-foo__content', 'js-foo__content--first', 'js-components__content', 'js-components__content--first', 'components__content', 'components__content--first', ];
自定义输出样式
要更改类的格式,创建一个新的自定义类,该类实现了 \AKlump\Bem\Styles\StyleInterface
以控制类的处理和输出,包括分隔符。请参考 \AKlump\Bem\Styles\Official
。在构建时将您的自定义样式传递给 \AKlump\Bem\Fluent\Bem
。
与Twig一起使用
主题设计师
{{ bem_set_global('component') }} {{ bem_set_block('story-section') }} <body> <h1>Twig Extension Example</h1> <pre> {% set classes = [ bem_block().plus_js(), bem_block().modifier('th-summary'), bem_block().modifier('lang-en'), ] %} <section> <div class="{{ classes|join(' ') }}"> <div class="{{ bem_element('width').plus_global() }}"> <div class="{{ bem_element('item').plus_modifier('first') }}"></div> <div class="{{ bem_element('item') }}"></div> <div class="{{ bem_element('item').plus_modifier('last') }}"></div> </div> </div> </section> </pre> </body> <section> <div class="story-section js-story-section story-section--th-summary story-section--lang-en"> <div class="story-section__width component__width"> <div class="story-section__item story-section__item--first"></div> <div class="story-section__item"></div> <div class="story-section__item story-section__item--last"></div> </div> </div> </section>
开发者
请参阅 \AKlump\Bem\Twig\BemExtension
贡献
如果您觉得这个项目很有用...请考虑 捐赠。