React中的CSS伪元素

Mic*_*sen 56 javascript css pseudo-element reactjs

我正在构建React组件.我在组件中添加了CSS inline,正如React背后的人之一所展示的那样.我一直在努力寻找一种方法来内联添加CSS伪类,比如在演示文稿中标题为":: after"的幻灯片上.不幸的是,我不仅需要添加content:"";属性,还需要position:absolute; -webkit-filter: blur(10px) saturate(2);.幻灯片显示了如何添加内容{/* … */},但是如何添加其他属性?

Mic*_*sen 64

得到了@Vjeux在React团队的回复:

普通的HTML/CSS:

<div class="something"><span>Something</span></div>
<style>
    .something::after {
    content: '';
    position: absolute;
    -webkit-filter: blur(10px) saturate(2);
}
</style>
Run Code Online (Sandbox Code Playgroud)

与内联样式反应:

render: function() {
    return (
        <div>
          <span>Something</span>
          <div style={{position: 'absolute', WebkitFilter: 'blur(10px) saturate(2)'}} />
        </div>
    );
},
Run Code Online (Sandbox Code Playgroud)

诀窍是,不是::after在CSS中使用以创建新元素,而应该通过React创建一个新元素.如果您不想在任何地方添加此元素,请创建一个为您执行此操作的组件.

对于特殊属性-webkit-filter,编码它们的方法是删除破折号 - 并将下一个字母大写.所以它变成了WebkitFilter.请注意,做{'-webkit-filter': ...}也应该工作.

  • 但是,当React JS被渲染到搜索代理时,它们将索引伪内容,这是不好的.例如,如果您将标题复制到`:: after`元素中,以创建自定义阴影,仅仅为了样式目的,当Google看到它时我不会在DOM中,但是通过这种方法,Google会看到它......意思是你有两个头条新闻. (11认同)
  • 当你在react中搜索伪元素时,弹出这个太糟糕了.@vjeux可能会非常恼火地说css很糟糕,而实际上没有为其反应追随者提供干净/完整的替代品.这个解决方案不应该被接受,它是向后退一步 - 确定它确实很好用了 (4认同)
  • 我认为这不是一个适当的解决方案。我在前后使用伪元素以避免创建不必要的DOM。 (2认同)
  • 这不能回答问题,创建一个新元素而不是使用伪元素是不够的解决方案 (2认同)

Wik*_*lik 28

内联样式不能用于定位伪类或伪元素.您需要使用样式表.

如果要动态生成CSS,那么最简单的方法是创建DOM元素<style>.

<style dangerouslySetInnerHTML={{
  __html: [
     '.my-special-div:after {',
     '  content: "Hello";',
     '  position: absolute',
     '}'
    ].join('\n')
  }}>
</style>
<div className='my-special-div'></div>
Run Code Online (Sandbox Code Playgroud)

  • 好的。更好的是只使用带有文字换行符的模板字符串,这样您就不需要加入一堆单独的字符串。 (4认同)

Jos*_*son 10

内联样式不支持伪或规则(例如,@ media).建议的范围从在JavaScript中重新实现的CSS功能像CSS状态:hover通过onMouseEnteronMouseLeave使用更多的元件来再现伪元素像:after:before只是使用一个外部的样式表.

个人不喜欢所有这些解决方案.通过JavaScript重新实现CSS功能不能很好地扩展 - 也没有添加多余的标记.

想象一个庞大的团队,每个开发人员都在重建CSS功能:hover.每个开发人员都会采用不同的方式,随着团队规模的扩大,如果可以完成,就会完成.事实是使用JavaScript有大约n种方法来重新实现CSS功能,随着时间的推移,你可以打赌所有这些方式的实现最终结果是意大利面条代码.

那么该怎么办?使用CSS.你问过内联样式会让你觉得你很可能在CSS-in-JS阵营(我也是!).已经发现colocating HTML和CSS与JS和HTML一样有价值,很多人还没有意识到(JS-HTML托管起初也有很多阻力).

在这个名为Style It的空间中提供了一个解决方案,可以让您在React组件中编写明文CSS.无需浪费周期在JS中重新发明CSS.正确工作的正确工具,这是一个使用示例:after:

npm install style-it --save

功能语法(JSFIDDLE)

import React from 'react';
import Style from 'style-it';

class Intro extends React.Component {
  render() {
    return Style.it(`
      #heart {
        position: relative;
        width: 100px;
        height: 90px;
      }
      #heart:before,
      #heart:after {
        position: absolute;
        content: "";
        left: 50px;
        top: 0;
        width: 50px;
        height: 80px;
        background: red;
        -moz-border-radius: 50px 50px 0 0;
        border-radius: 50px 50px 0 0;
        -webkit-transform: rotate(-45deg);
        -moz-transform: rotate(-45deg);
        -ms-transform: rotate(-45deg);
        -o-transform: rotate(-45deg);
        transform: rotate(-45deg);
        -webkit-transform-origin: 0 100%;
        -moz-transform-origin: 0 100%;
        -ms-transform-origin: 0 100%;
        -o-transform-origin: 0 100%;
        transform-origin: 0 100%;
      }
      #heart:after {
        left: 0;
        -webkit-transform: rotate(45deg);
        -moz-transform: rotate(45deg);
        -ms-transform: rotate(45deg);
        -o-transform: rotate(45deg);
        transform: rotate(45deg);
        -webkit-transform-origin: 100% 100%;
        -moz-transform-origin: 100% 100%;
        -ms-transform-origin: 100% 100%;
        -o-transform-origin: 100% 100%;
        transform-origin :100% 100%;
      }
    `,
      <div id="heart" />
    );
  }
}

export default Intro;
Run Code Online (Sandbox Code Playgroud)

JSX语法(JSFIDDLE)

import React from 'react';
import Style from 'style-it';

class Intro extends React.Component {
  render() {
    return (
      <Style>
      {`
        #heart {
          position: relative;
          width: 100px;
          height: 90px;
        }
        #heart:before,
        #heart:after {
          position: absolute;
          content: "";
          left: 50px;
          top: 0;
          width: 50px;
          height: 80px;
          background: red;
          -moz-border-radius: 50px 50px 0 0;
          border-radius: 50px 50px 0 0;
          -webkit-transform: rotate(-45deg);
          -moz-transform: rotate(-45deg);
          -ms-transform: rotate(-45deg);
          -o-transform: rotate(-45deg);
          transform: rotate(-45deg);
          -webkit-transform-origin: 0 100%;
          -moz-transform-origin: 0 100%;
          -ms-transform-origin: 0 100%;
          -o-transform-origin: 0 100%;
          transform-origin: 0 100%;
        }
        #heart:after {
          left: 0;
          -webkit-transform: rotate(45deg);
          -moz-transform: rotate(45deg);
          -ms-transform: rotate(45deg);
          -o-transform: rotate(45deg);
          transform: rotate(45deg);
          -webkit-transform-origin: 100% 100%;
          -moz-transform-origin: 100% 100%;
          -ms-transform-origin: 100% 100%;
          -o-transform-origin: 100% 100%;
          transform-origin :100% 100%;
        }
     `}

      <div id="heart" />
    </Style>
  }
}

export default Intro;
Run Code Online (Sandbox Code Playgroud)

心脏例子来自CSS-Tricks


Pet*_*r W 10

取决于您是否只需要将几个属性设置为内联样式,您可以执行类似此解决方案的操作(并使您不必安装特殊包或创建额外元素):

/sf/answers/2940005981/

<span class="something" datacustomattribute="">
  Hello
</span>
Run Code Online (Sandbox Code Playgroud)
<span class="something" datacustomattribute="">
  Hello
</span>
Run Code Online (Sandbox Code Playgroud)

请注意,datacustomattribute必须以data小写开头才能满足 React。

  • 截至 2021 年 7 月,如 [MDN 文档](https://developer.mozilla.org/en-US/docs/Web/CSS/attr()) 中所述: attr() 函数可与任何 CSS 属性一起使用,但对内容以外的属性的支持是实验性的,并且对类型或单位参数的支持很少。 (3认同)
  • 另请注意,虽然它必须是小写,但它也可以包含破折号,例如“data-custom-attribute”也可以 (2认同)

Rap*_*nel 9

您可以使用样式化组件。

安装它 npm i styled-components

import React from 'react';
import styled from 'styled-components';

const YourEffect = styled.div`
  height: 50px;
  position: relative;
  &:after {
    // whatever you want with normal CSS syntax. Here, a custom orange line as example
    content: '';
    width: 60px;
    height: 4px;
    background: orange
    position: absolute;
    bottom: 0;
    left: 0;
  },

const YourComponent = props => {
  return (
    <YourEffect>...</YourEffect>
  )
}

export default YourComponent
Run Code Online (Sandbox Code Playgroud)