Css 网格宽度动态内容,包括换行符

Css grid width dynamic content including linebreaks

提问人:Alexander Galler 提问时间:6/26/2023 最后编辑:TylerHAlexander Galler 更新时间:8/30/2023 访问量:33

问:

在我们的网站上,我们有一个简单的基于BB代码的编辑器来创建我们的帖子。为了能够创建基本的网格,我添加了一个新标签,这是一个带有 display:grid 和 grid-template-columns: repeat(2, 1fr) 的简单包装器。

因此,输入如下所示:

[easy-columns]
[box]
Text box 1
[/box]
[box]
Text box 2
[/box]
[/easy-columns]

输出如下所示:

<div class="easy-columns">
  <div class="box">Text box 1</div>
  <br />
  <div class="box">Text box 2</div>
</div>

我的问题出在换行符上,它让网格崩溃。

解决方案 1:因此,我的第一次尝试只是将 display: none 设置为包装器内的 br 元素。但我不确定这是否适用于所有浏览器。(我更喜欢这个非常简单的解决方案)

解决方案 2:我的第二次尝试是使用 php domdocument 从 div 中使用 easy-columns 类删除所有 br 子项。

我的 css 解决方案是否有效,或者只是我的测试环境中的一个工作“错误”?还是我应该使用 domdocument?

.easy-columns {
  gap: 2em;
  align-items: stretch;
  display: grid;
  grid-auto-flow: row;
  grid-template-columns: repeat(2, 1fr);
  justify-items: stretch;
  margin-bottom: 2em;
  max-width: 100%;
  overflow: hidden;
  position: relative;
  width: 100%;
}

.css-approach>br {
  display: none;
}

.box {
  background-color: grey;
  color: white;
  display: inline-block;
  padding: 2em;
  position: relative;
  text-align: left;
}
[easy-columns]<br /> [box]
<br /> Text box 1<br /> [/box]
<br /> [box]
<br /> Text box 2<br /> [/box]
<br /> [/easy-columns]
<br />
<br />
<hr />
<br />
<br />
<div class="easy-columns">
  <div class="box">
    Text box 1
  </div>
  <br />
  <div class="box">
    Text box 2
  </div>
</div>
<div class="easy-columns css-approach">
  <div class="box">
    Text box 1
  </div>
  <br />
  <div class="box">
    Text box 2
  </div>
  <div class="box">
    Text box 1
  </div>
  <br />
  <div class="box">
    Text box 2
  </div>
</div>

HTML css-grid dom文档

评论

2赞 Jared 6/26/2023
恕我直言,应该与所有支持网格的浏览器一起使用。但实际上,这些根本不应该出现在输出中。检查您是否可以将 bb-to-html 库配置为不生成它们。顺便说一句,在这种情况下(如果是被迫的),我会用正则表达式切断 s,domdocument 似乎有点矫枉过正。display:nonebrbr

答:

0赞 Alexander Galler 8/30/2023 #1

谢谢你的回答。我花了一段时间,但我认为我现在有一个很好的解决方案。我最终使用了domdocument,并试图解释如何以及为什么。

首先,这是我的bb-to-html函数:

bbToHtml($bb){
 $elements = array(
  array("\[h1\]\s*(.*?)\s*\[\/h1\]\s{0,2}", 
        "<h2 class=\"bb-headline\">\\1</h2>", 
        ""),
  array("\[img\-p\=([^\"]*\.(?:png|jpe?g|gif))\]\s{0,1}?", 
        "<div class=\"bb-img-wrapper portrait hover-fx-trigger\"><img src=\"gallery/articles/main/\\1\" /></div>",
     "Ui"),
  array("\[box\-simple\]\s*(.*?)\s*\[\/box\-simple\]\s{0,1}",
        "<div class=\"box-simple\">\\1</div>",
        "")
 );

 // Replacing
 foreach ($elements as $replace) {
  $modifier = "is";
  // Additional modifiers
  if(array_key_exists(2, $replace) and !empty($replace[2])){
   $modifier = $replace[2];
  }
   $bb = preg_replace("#" . $replace[0] . "#{$modifier}", $replace[1], $bb);
  }

  $bb = addInfos($bb);
  $bb = nl2br($bb);

 return $bb;
}

由于我只是替换图像而没有任何附加信息,因此我调用函数 addInfos()。

看起来像这样:

function addInfos($bb){
 // Step 1
 $dom = new DOMDocument();
 $dom->preserveWhiteSpace = false;

 $internalErrors = libxml_use_internal_errors(true);
 $dom->loadHTML(mb_convert_encoding($bb, "HTML-ENTITIES", "UTF-8"), LIBXML_HTML_NODEFDTD);
 libxml_use_internal_errors($internalErrors);

 // Step 2
 $divs = $dom->getElementsByTagName("div");

 // Step 3
 foreach ($divs as $div) {

  $class = $div->getAttribute("class");
  $children = $div->childNodes;

  switch (true) {
   // Step 4
   case strpos($class, "hover-fx-trigger") !== false:
    if(property_exists($firstchild, "tagName") and $firstchild->tagName == "img"){
     $childclass = $firstchild->getAttribute("class");
     $src = $firstchild->getAttribute("src");
     $style = $firstchild->getAttribute("style");
     $width = $firstchild->getAttribute("width");

     // creating the new html......

     $newdom = new DOMDocument();
     $newdom->loadHTML($newhtml, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
     $import = $dom->importNode($newdom->documentElement, true);
     $firstchild->parentNode->replaceChild($import, $firstchild);
    }
    break;

   // Step 5
   case strpos($class, "easy-columns") !== false:
    $easychildren = $div->childNodes;

     for ($i = $easychildren->length; --$i >= 0; ) {
      $easychild = $easychildren->item($i);
       if($easychild->nodeType === 3){
        $easychild = $easychildren->item($i);
        $easychild->parentNode->removeChild($easychild);
       }
     }
   break;
  }

 // Step 6
 $bb = substr($dom->saveHTML(), 12, -15);

 // Step 7
 $bb = str_replace(
          array("<p>", "</p>"),
          array("", ""),
          $bb
         );

 return $bb;

}

第 1 步:创建新的 dom objeckt

第 2 步:查找 div

第 3 步:遍历 div

步骤4:第一种情况查找特定的类(hover-fx-trigger)。如果第一个子是图像,它会提取我需要创建图像被替换的新 html 所需的所有属性。例如,src 在数据库中找到它。

步骤5:换行符的实际问题。首先,我获取所有子节点。然后,我遍历并删除 nodeType = 3 (DOMText) 的所有子项。由于它是一个网格,我只能在 easy-columns 中使用 div。

步骤6:保存新的 html。DOMDocument 添加了 body 和 html 标签,我用 substr($dom->saveHTML(), 12, -15) 删除了这些标签。

步骤7:DOMDocument 还将所有 DOMText 节点包装在一个段落中,我也不需要删除该段落。

我使用此函数创建html文件,然后将其包含在内。

欲了解更多信息,请询问。开放改进!