BEM 和布局富文本

Posted

技术标签:

【中文标题】BEM 和布局富文本【英文标题】:BEM And Layout Rich Texts 【发布时间】:2018-02-28 15:31:28 【问题描述】:

我读到here 说使用布局组件来安排其他组件的流动和定位是一个很好的 BEM 实践。该资源建议以下示例:

   <ul class="l-grid">
       <li class="l-grid__item">
           <div class="c-card">
               <div class="c-card__header">
                   […]
               </div>
               <div class="c-card__body">
                   […]
               </div>
           </div>
       </li>
       <li class="l-grid__item">
           <div class="c-card">
               <div class="c-card__header">
                   […]
               </div>
               <div class="c-card__body">
                   […]
               </div>
           </div>
       </li>
   </ul>

虽然上述内容非常合理,但我不确定如何将此方法应用于典型的基于块的页面流,如下所列:

        <section class="c-page-section c-page-section--white-bg">

           <div class="l-container">

               <h1 class="c-page-section__title">Page Title</h1>
               <hr class="c-separator c-page-section__separator">

               <p class="c-paragraph">
                   ...
               </p>
               <p class="c-paragraph">
                   ...
               </p>
               <p class="c-paragraph">
                   ...
               </p>
               <ul class="l-horizontal-list">
                   <li class="l-horizontal-list__item c-tag">Java</li>
                   <li class="l-horizontal-list__item c-tag">php</li>
                   <li class="l-horizontal-list__item c-tag">html</li>
                   <li class="l-horizontal-list__item c-tag">CSS/SASS</li>
               </ul>

           </div>

    </section>

我不确定是在基于 h1hrp 的 c 组件内应用边距还是在它们周围创建额外的布局组件?

提前谢谢你!

【问题讨论】:

【参考方案1】:

BEM 是一个很好的网站布局工具,它也是一个构建 Web 应用程序外观的优秀工具。但是,使用 BEM 来设置富文本的样式?只是……不是好工具。

我建议你创建一个“非 BEM 组件”,命名为 rich-text,带有级联:

.rich-text p 
  /* style here, including margins and paddings */

.rich-text hr 
  /* style here, including margins and paddings */

.rich-text ul 
  /* style here, including margins and paddings */

.rich-text ul > li 
  /* style here, including margins and paddings */

// etc.

在您的 HTML 代码中:

    <section class="c-page-section c-page-section--white-bg">
       <div class="l-container rich-text">
           <h1>Page Title</h1>
           <hr>
           <p> ... </p>
           <p> ... </p>
           <p> ... </p>
           <ul>
               <li>Java</li>
               <li>PHP</li>
               <li>HTML</li>
               <li>CSS/SASS</li>
           </ul>
       </div>
    </section>

然后,您必须记住,其他 BEM 组件不能嵌套到此 rich-text 组件中(因为级联)。但即使使用 BEM 方法,您也无法在富文本中的任何位置嵌套任何组件。例如,由于标签&lt;p&gt;&lt;em&gt; 的语义限制,无法嵌入&lt;div&gt;

注意:我建议不要将.rich-text 本身设置为一个块:不要padding marginbackground。如果富文本组件的所有属性都仅与富文本元素有关,则它更可重用。您可能需要在页面中显示多个富文本,并且它们不会共享相同的背景或填充。如果您需要在带边框的白色矩形中显示富文本,只需为此创建一个真正的 BEM 组件并使其成为富文本的容器。

【讨论】:

感谢@Paleo。所以我应该应用 .rich-text 方法在富标签内定位标准标签(p、hr、ul、h1 等)吗?那我什么时候使用布局组件呢?我猜对于更复杂的场景,例如具有多列的网格系统? @AndreasLukas > “仅在富标签内定位标准标签(p、hr、ul、h1 等)” 这就是我所做的。这是处理由 TinyMCE 等编辑器生成的内容的好方法。特殊组件 .rich-text 是 BEM 的一个例外。 我明白了,但是您何时会使用布局组件,例如我在上面的问题中展示的示例? 哦,我终于明白你的意思了:)谢谢! 不是.rich-text + ul,而是.rich-text &gt; ul(子选择器)。但是你必须考虑所有情况:&lt;ul&gt;&lt;p&gt;&lt;blockquote&gt; 等内部。我不确定是否有可能涵盖所有情况。但为什么不呢。我个人使用嵌套组件“richtext-proof”,例如.inline-fig 组件(用于带有标题但不在&lt;figure&gt; 元素中的图像)并且我验证级联规则不干扰它。

以上是关于BEM 和布局富文本的主要内容,如果未能解决你的问题,请参考以下文章

添加富文本编辑器使用xss攻击BeautifulSoup4模块富文本编辑器上传图片修改头像)

复制word图文到富文本编辑器

OS开发小记:iOS富文本框架DTCoreText在UITableView上的使用

Unity插件之TextMeshPro 富文本【转】

iOS图文混排之 NSAttachmentAttributeName 创建带有图片的富文本(案例:展示信用卡标签)

iOS图文混排之 NSAttachmentAttributeName 创建带有图片的富文本(案例:展示信用卡标签)