如何使用 Javascript 更新占位符颜色?

IT技术 javascript html css pseudo-element
2021-02-10 03:29:14

我在网上搜索,我没有找到任何东西。我正在尝试使用 javascript 更新文本框的占位符颜色,但我该怎么做?我有一个颜色选择器,颜色正在改变。

如果我的 CSS 中有这样的东西,我该如何更新它?

::placeholder {
  color: red;
}
<input placeholder="placeholder" />

是否有 javascript 命令来编辑它?就像是

document.getElementById('text').style.placeholderColor = newColor;
4个回答

使用 CSS 变量。您也可以只定位所需的元素

function update() {
  document.querySelector('input[type=text]').style.setProperty("--c", "blue");
}
::placeholder {
  color: var(--c, red);
}
<input type="text" placeholder="I will be blue">
<input type="number" placeholder="I will remain red">
<button onclick="update()">change</button>

当涉及到修改伪元素的CSS变量是有用的,你不能用JS访问诸如:before/ :after/::placeholer/::selection等,您只需定义自定义属性,你可以很容易地在主要元素上更新和伪元素将继承它。

相关:使用 jQuery 选择和操作 CSS 伪元素,例如 ::before 和 ::after

@DogukanCavus 红色是默认值......单击按钮时蓝色将仅设置为第一个
2021-03-14 03:29:14
我见过的现代浏览器的最佳解决方案。谢谢
2021-03-14 03:29:14
@TemaniAfif 我们当然可以,我在暗示我们如何灵活地做到这一点啊
2021-03-22 03:29:14
@MelMacaluso 对于 ie11 版本,我们可以使用一个包含颜色的类来切换(虽然不是很灵活)
2021-03-29 03:29:14

正如其他答案中所述,您不能更改内联伪元素样式但是,您可以修改 CSS 规则<style>本身,并且您不需要浏览器支持 ing CSS 变量。访问样式表并获取现有规则或插入您自己的规则,然后像处理元素一样使用其样式声明.style

const {sheet} = Object.assign(document.head.appendChild(document.createElement("style")), {type: "text/css" });
const placeholderStyle = sheet.rules[sheet.insertRule("::placeholder {}")].style;
placeholderStyle.color = "red";

Object.assign(document.body.appendChild(document.createElement("input")), {
  type: "button", value: "Color!", onclick() {
    placeholderStyle.color = "#"+Math.round(Math.random()*0xFFF).toString(16).padStart("0",3);
}});
<input placeholder="placeholder" />

是的,更新不知何故是我正在寻找的。谢谢
2021-03-20 03:29:14
考虑一个动态选择器,这有多容易改变?我想有比这更有效的方法:jsfiddle.net/xqu9g7r2/1或者可能不是?
2021-03-28 03:29:14
@TemaniAfif 您可能不想在每次update调用时都创建新规则就像这样但总的来说,是的,每个选择器都需要一个规则。
2021-04-08 03:29:14

还有另一种方法,但它有点老套:使用 JS 将更多 CSS 附加到正文的末尾。假设规则相同,浏览器将使用最新的 CSS 覆盖当前的 CSS。

function changeColor(toColor) {
  addCSS = document.createElement('style');
  addCSS.innerHTML = "::placeholder { color: " + toColor + "; }";
  document.body.append(addCSS);
}
::placeholder { color: green; }
<input type="text" placeholder="placeholder">
<button onclick="changeColor('red')">red</button>
<button onclick="changeColor('blue')">blue</button>

如果占位符颜色语义依赖于某种状态,则可以间接设置

::placeholder { color: green; }
.warn::placeholder { color: red; }
<input id="test" placeholder="hello">
<button onclick="test.classList.toggle('warn')">Warning!</button>

在许多情况下,这根本不需要 javascript:

::placeholder { color: green; }
.color::after { content: 'green'; }

:checked + .color + ::placeholder { color: red; }
:checked + .color::after { content: 'red'; }
<input type="checkbox" id="color01">
<label class="color" for="color01">Color: </label>
<input placeholder="hello">