在伪元素的"content:"属性中使用CSS变量(自定义属性)

Jas*_*ase 16 css pseudo-element css-variables

使用示例(我想要的)

div::after {
  content: var(--mouse-x) ' / ' var(--mouse-y);
}
Run Code Online (Sandbox Code Playgroud)

显示它不工作的测试用例:

CodePen:Jase Smith的伪元素"内容:"属性(测试用例)中的CSS变量

document.addEventListener('mousemove', (e) => {
  document.documentElement.style.setProperty('--mouse-x', e.clientX)
  document.documentElement.style.setProperty('--mouse-y', e.clientY)
  
  // output for explanation text
  document.querySelector('.x').innerHTML = e.clientX
  document.querySelector('.y').innerHTML = e.clientY
})
Run Code Online (Sandbox Code Playgroud)
/* what I want!! */
div::after {
  content: var(--mouse-x, 245)" / " var(--mouse-y, 327);
}

/* setup and presentation styles */
div::before {
  content: 'mouse position:';
}
div {
  position: absolute;
  top: 0;
  left: 0;
  transform: translate(calc(var(--mouse-x, 245) * 1px), calc(var(--mouse-y, 327) * 1px));
  width: 10em;
  height: 10em;
  background: #ff3b80;
  color: #fff;
  display: flex;
  flex-flow: column;
  align-items: center;
  justify-content: center;
  border-radius: 100%;
  will-change: transform;
}
body {
  margin: 2em;
  font-family: sans-serif;
}
p {
  max-width: 50%;
  min-width: 25em;
}
Run Code Online (Sandbox Code Playgroud)
<!-- test case: element with pseudo element -->
<div></div>

<!-- explanation (not test case) -->
<main>
  <pre><code>div::after {
  content: var(--mouse-x) ' / ' var(--mouse-y);
}</code></pre>
  <h1>If this worked...</h1>
  <p>
    We should see something like this: <b><span class="x">245</span> / <span class="y">327</span></b> updating with the mousemove coordinates inside the pseudo <i>::after</i> element for the div.
  </p>
</main>
Run Code Online (Sandbox Code Playgroud)

dar*_*yeo 26

为清晰起见进行编辑:带有数值的CSS自定义属性可以content通过CSS计数器显示在伪元素的属性中.

div {
    --variable: 123;
}
span:after {
    counter-reset: variable var(--variable);
    content: counter(variable);
}
Run Code Online (Sandbox Code Playgroud)
<div>The variable is <span></span>.</div>
Run Code Online (Sandbox Code Playgroud)

.coordinates:before {
    counter-reset: x var(--x) y var(--y);
    content: 'The coordinates are (' counter(x) ', ' counter(y) ').';
}
Run Code Online (Sandbox Code Playgroud)
<div class="coordinates" style="--x: 1; --y: 2"></div>
Run Code Online (Sandbox Code Playgroud)


原始答案

使用涉及CSS计数器的黑客来使用它.请享用.

div::after {
  counter-reset: mouse-x var(--mouse-x, 245) mouse-y var(--mouse-y, 245);
  content: counter(mouse-x) " / " counter(mouse-y);
}
Run Code Online (Sandbox Code Playgroud)

完整的代码:

document.addEventListener('mousemove', (e) => {
  document.documentElement.style.setProperty('--mouse-x', e.clientX)
  document.documentElement.style.setProperty('--mouse-y', e.clientY)
  
  // output for explanation text
  document.querySelector('.x').innerHTML = e.clientX
  document.querySelector('.y').innerHTML = e.clientY
})
Run Code Online (Sandbox Code Playgroud)
/* what I want!! */
div::after {
  counter-reset: mouse-x var(--mouse-x, 245) mouse-y var(--mouse-y, 245);
  content: counter(mouse-x) " / " counter(mouse-y);
}

/* setup and presentation styles */
div::before {
  content: 'mouse position:';
}
div {
  position: absolute;
  top: 0;
  left: 0;
  transform: translate(calc(var(--mouse-x, 245) * 1px), calc(var(--mouse-y, 327) * 1px));
  width: 10em;
  height: 10em;
  background: #ff3b80;
  color: #fff;
  display: flex;
  flex-flow: column;
  align-items: center;
  justify-content: center;
  border-radius: 100%;
  will-change: transform;
}
body {
  margin: 2em;
  font-family: sans-serif;
}
p {
  max-width: 50%;
  min-width: 25em;
}
Run Code Online (Sandbox Code Playgroud)
<!-- test case: element with pseudo element -->
<div></div>

<!-- explanation (not test case) -->
<main>
  <pre><code>div::after {
  content: var(--mouse-x) ' / ' var(--mouse-y);
}</code></pre>
  <h1>If this worked...</h1>
  <p>
    We should see something like this: <b><span class="x">245</span> / <span class="y">327</span></b> updating with the mousemove coordinates inside the pseudo <i>::after</i> element for the div.
  </p>
</main>
Run Code Online (Sandbox Code Playgroud)

  • 对于非整数值打印“0”(例如“1.1”) (4认同)

vsy*_*ync 9

content属性只允许String,并且由于您与数字对齐并且 CSS 无法转换变量,因此您可以选择创建另一组变量(来自 JS),它将用作打印值,并且类型为String

要设置--mouse-x-textString,使用旧的转换技巧将其转换为该类型是不够的2+"" = "2",但这JSON.stringify是我所知道的可以从已经存在的字符串值中输出“真实”字符串的唯一方法,这意味着字符串的字符串,因为 CSS 似乎剥离了第一个字符串层。

document.addEventListener('mousemove', ({clientX:x, clientY:y}) => {
  const {style} = document.documentElement

  style.setProperty('--mouse-x', x)
  style.setProperty('--mouse-y', y)

  // for printing
  style.setProperty('--mouse-x-text', JSON.stringify(x+""))
  style.setProperty('--mouse-y-text', JSON.stringify(y+""))
})
Run Code Online (Sandbox Code Playgroud)
body::before{
  content: "X:"var(--mouse-x-text)"  Y:"var(--mouse-y-text);
}
Run Code Online (Sandbox Code Playgroud)


Ric*_*cky 8

我不太确定我是否正确理解了你的问题,但我认为这是一个解决方案......

您可以为元素定义自定义属性<div>

<div data-position></div>
Run Code Online (Sandbox Code Playgroud)

然后用javascript分配这个属性中的位置:

  var position = e.clientX + " " + e.clientY
  document.querySelector("div").setAttribute('data-position', position)
Run Code Online (Sandbox Code Playgroud)

attr()最后在content伪元素的属性中使用CSS 函数。

div::after {
  content: attr(data-position);
}
Run Code Online (Sandbox Code Playgroud)

瞧。


代码片段:

<div data-position></div>
Run Code Online (Sandbox Code Playgroud)
  var position = e.clientX + " " + e.clientY
  document.querySelector("div").setAttribute('data-position', position)
Run Code Online (Sandbox Code Playgroud)
div::after {
  content: attr(data-position);
}
Run Code Online (Sandbox Code Playgroud)