如何将 CSS 从“::before”选择器移动到 React?

Posted

技术标签:

【中文标题】如何将 CSS 从“::before”选择器移动到 React?【英文标题】:How to move CSS from a '::before' selector into React? 【发布时间】:2020-12-13 09:43:19 【问题描述】:

我有一个程序可以创建一个在等距网格上移动的小型机器人。

每个图块都是一个图像,机器人是一个叠加图像,使用::before 选择器创建:

.robot::before
  content: '';
  position: absolute;
  top: -40px;
  bottom: 0;
  left: 0;
  right: 0;
  background-image: url("https://femto.pw/us7j.png");
  background-size: contain;
  background-repeat: no-repeat;

CSS项目的源代码可以在here找到。

我想转换 CSS 以便在创建它的“react”组件中对其进行样式设置。我在背景 div 元素之前创建了一个span,并将 CSS 放在那里假装是“::before”元素。创建图块的代码来自:

  <td style=transform: `translateX($x * 4em)`>
    <div className="tile">
      <div className="background" + (robot ? ' robot' : '') />
    </div>
  </td>

  <td style=transform: `translateX($x * 4em)`>
    <div className="tile">
      robot &&
        <span style=
          "content": "''",
          "position": "absolute",
          "top": "-40px",
          "bottom": "0",
          "left": "0",
          "right": "0",
          "backgroundImage": "url(\"https://femto.pw/us7j.png\")",
          "backgroundSize": "contain",
          "backgroundRepeat": "no-repeat"
           />
        
      <div className="background" />
    </div>
  </td>

此时项目的代码可以在here找到。

但是,当我进行这个我认为应该相同的更改时,它看起来完全不同!

发生了什么?如何将 CSS 转换为在 React 中工作(没有这样的 CSS 选择器)?

【问题讨论】:

问题在于 ::before 元素曾经位于 background robot div 上,该 div 应用了 heightwidth,因此 ::before 元素的定位、宽度和高度具有风格的价值观。由于您将所有内容都移到了跨度上,因此没有什么可以告诉该元素如何调整大小。移动background内部的span元素进行测试:codepen.io/chrislafrombois/pen/XWdpQVd 这太棒了,而且效果很好!您想将其复制到答案中以便我将其标记为正确吗? :) 是的!添加并回答。 【参考方案1】:

问题在于 ::before 元素曾经位于 background robot div 上,该 div 应用了高度和宽度,因此 ::before 元素的定位、宽度和高度具有可设置样式的值。

由于您将所有内容都移到了span,因此没有什么可以告诉该元素如何调整大小。

这是更新后的笔,将 span 移至 background div:

https://codepen.io/chrislafrombois/pen/XWdpQVd

以下是更改的代码:

const CreateTile = (x, robot) => (
  <td style=transform: `translateX($x * 4em)`>
    <div className="tile">
      
      <div className="background">
        robot &&
        <span style=
          "content": "''",
          "position": "absolute",
          "top": "-40px",
          "bottom": "0",
          "left": "0",
          "right": "0",
          "backgroundImage": "url(\"https://femto.pw/us7j.png\")",
          "backgroundSize": "contain",
          "backgroundRepeat": "no-repeat"
           />
        
      </div>
    </div>
  </td>
)

【讨论】:

【参考方案2】:

您的问题是您忘记添加一些来自.background.robot 年长父母的样式:

.robot 
    transform: rotateZ(-45deg) rotateY(-60deg) translate3d(-1.1em, -4.8em, 0em);
    height: calc(23em);
    width: calc(23em);

只需使用z-index: 1; 将它们添加到跨度中,您就会得到原始结果。只需在this codepen 中查看即可。

【讨论】:

这也是一个很好的解决方案!我已经接受了另一个答案,并认为我会将其标记为解决方案,因为它消除了任何重复的样式。感谢您的替代方案:) 是的,当然没问题;)但如果这是一个好的解决方案,它也可以得到upvote,对吗? :) 见鬼! @johannchopin :)

以上是关于如何将 CSS 从“::before”选择器移动到 React?的主要内容,如果未能解决你的问题,请参考以下文章

使用css选择器对齐图像[重复]

使用 JQuery 更改 :before css 选择器的宽度属性 [重复]

使用 :before 和 :after CSS 选择器插入 HTML [重复]

在 selenium webdriver 中找不到 ::before css 选择器元素

CSS3伪元素选择器 ::before ::after | 记录自己的前端学习日子

css 使用:: before伪选择器在显示tel-number之前添加unicode phone字符