【问题标题】:How to call access pseudo elements styling from Javascript? [duplicate]如何从 Javascript 调用访问伪元素样式? [复制]
【发布时间】:2016-10-02 23:55:50
【问题描述】:

之前我的问题是:-

我的 Sass css 文件中有以下代码

.random {
    box-sizing: content-box;
    text-align: center;
    line-height: 1;

    &:before {
        display: inline-block;
        margin-right: 0.2em;
        width: 0;
        height: 0;
        border-right: 0.4em  solid transparent;
        border-left: 0.4em solid transparent;
        content: "";
        vertical-align: baseline;
    }
}

.perc-neg:before {
    border-top: 0.5em solid #FCB062;
}

.perc-neg.good:before {
    border-top: 0.5em solid #98F1AC;
}

我有一个 div class= "随机 perc-neg 好"

现在我想改变上面 div 的样式。怎么办?

我尝试在控制台中关注,但它返回空对象

$("random perc-neg good:before").css("color","red");
$("random.perc-neg.good:before").css("color","red");
$(".random.perc-neg.good:before").css("color","red");

有人建议它可能是重复的,但事实并非如此。

在相关问题中,用户只是想让它可见或隐藏,所以两个类就足够了。

但我的要求是根据用户的选择更改颜色,他可以从多种颜色中进行选择。

每次颜色变化都定义一个类是绝对不可能的。

我们也不能将一些变量传递给 css 以相应地更改颜色属性。

更新问题:

我现在正在使用 Sass。 我已经定义了一个函数来更新颜色

@function em($color) {
  @return border-bottom: 0.5em solid $color;
 }

.perc-neg.good:before {
    em(#98F1AC);
}

当然,我可以从 Sass 文件中调用该函数,但是如何从 javascript 中调用它

现在我想从 javascript 传递颜色的十六进制代码

我需要从 javascript 传递类似的东西

.perc-neg.good:before(#98F1AC)

在谷歌中寻找相同的东西没有找到任何相关的东西 与其将其标记为重复,如果您能提供解决方案会更好

【问题讨论】:

  • 你可以通过javascript添加动态CSS到head
  • @VladuIonut 我试过了,但它不起作用我尝试了 append 和 add 函数
  • @Paulie_D 引用的问题如何解决 OP 操纵 color 伪元素的问题?据我所知,它仅通过将伪元素放在数据属性上并在伪元素的内容属性中引用它来解决更改伪元素的内容。遗憾的是,CSS 中的 afaik attr() 不能用于 content 以外的其他属性。
  • 只需使用您要使用的颜色制作一个类列表,然后使用 javascript 更改元素的类
  • 就像我说的那样,用户将被允许从颜色选择器中选择一种颜色。所以几乎不可能为每种颜色定义一个类..希望你明白我的意思

标签: javascript jquery css sass


【解决方案1】:

无法访问 Javascript 中的伪元素,因为这些元素不在 DOM 中

如果您想要更改伪元素样式,您需要为此目的预定义 css 类并根据您的触发事件添加/删除这些类。

如果这是不可能的,那么就不要在伪元素上设置color属性根本,而是在宿主元素上,因为:before:after将继承他们的宿主元素的颜色属性(如果他们没有在 CSS 中分配给自己的特定颜色属性)。

【讨论】:

  • 这就是为什么我尝试使用更少的 css 来更新函数的颜色属性我做错了什么吗?
  • 在构建时翻译的更少。我知道您想在运行时更改样式,对吧?
  • 是的,这就是我的要求
  • 由于我想更改颜色,因此很难为每种颜色添加一个类,因为将为用户提供颜色选择器
  • 即使我没有为伪元素分配颜色属性,我以后如何为该伪元素分配颜色?
【解决方案2】:

您不能从 javascript 调用 SASS / LESS 函数,因为它们都是只生成静态样式表的预编译器。

如果您有一个有限的调色板,您可以创建涵盖您的用例的所有规则。

但是,您确实可以使用 javascript 创建样式元素并向其附加新规则。这是一个您可以扩展的简单示例

// add Style is wrapped in a closure that locks in a single 
// style element that you can add to on the fly
const addStyle = (() => {
  // create and append the style element
  const styleSheet = document.createElement('style')
  document.head.appendChild(styleSheet)
  const style = styleSheet.sheet
  
  // helper function to serialize an object to a css string
  const serializeStyle = (styles) => {
    return Object.keys(styles).reduce((str, prop) => {
      return str + kebabCase(prop) + ':' + styles[prop] + ';'
    }, '')
  }
  
  // helper function to convert camelCase to kebab-case
  const kebabCase = (str) => 
    str.replace(/([A-Z])/g, (_, letter) => '-'+ letter.toUpperCase()) 
  
  // return the public function
  return (selector, styles) => {
    // add a new rule to the created stylesheet
    style.insertRule(
      selector + '{' + serializeStyle(styles) + '}', 
      style.cssRules.length
    )
  }
})()

addStyle('.random::before', {
  border: '10px solid #aec369'
})

addStyle('.random::before', {
  background: '#bada55',
  boxShadow: '5px 5px 10px #777'
})

const el = document.querySelector('#color')

const em = () => {
  addStyle('.random::before', {
    borderColor: el.value
  })
}
el.addEventListener('keyup', em)
el.addEventListener('change', em)
.random {
  position: relative;
  background-color: #eee;
}

.random::before {
  content: '';
  display: block;
  height: 200px;
  width: 200px;
}
<input id="color" placeholder="#000000" />
<div class="random">
  
</div>

【讨论】:

    猜你喜欢
    • 2011-04-14
    • 2018-08-12
    • 1970-01-01
    • 2020-03-25
    • 1970-01-01
    • 2011-05-27
    • 1970-01-01
    相关资源
    最近更新 更多