Я пытаюсь иметь только один фон для двух элементов, а не два раза один и тот же фон. Это для этого

const root = document.documentElement;
 
document.addEventListener('mousemove', evt => {
    let x = evt.clientX / innerWidth;
    let y = evt.clientY / innerHeight;
 
    root.style.setProperty('--mouse-x', x);
    root.style.setProperty('--mouse-y', y);
});
@import url('https://fonts.googleapis.com/css?family=Raleway:200');

html, body {
  height: 100%;
}
body {
  display: flex;
  justify-content: center;
  align-items: center;
  height: 100%;
  background: #1D1F20;
}
.box {
  display: flex;
  margin: 10px;
  align-items: center;
  justify-content: center;
  width: 400px;
  height: 200px;
  color: white;
  font-family: 'Raleway';
  font-size: 2.5rem;
}

.gradient-border {
  --borderWidth: 3px;
  background: #1D1F20;
  position: relative;
  border-radius: var(--borderWidth);
}

.gradient-border:after {
  content: '';
  position: absolute;
  top: calc(-1 * var(--borderWidth));
  left: calc(-1 * var(--borderWidth));
  height: calc(100% + var(--borderWidth) * 2);
  width: calc(100% + var(--borderWidth) * 2);
  background: radial-gradient(at calc(var(--mouse-x, 0) * 100%) calc(var(--mouse-y, 0) * 100%), purple 5%, transparent 90%) no-repeat 0 0;
  border-radius: calc(2 * var(--borderWidth));
  z-index: -1;
  background-size: 100%;
}
<div class="box gradient-border">lama</div>
<div class="box gradient-border">lama</div>

Если я нахожусь в правой части экрана, я хочу, чтобы "граница" правой кнопки была более цветной, чем левая кнопка.

Но пока у двух кнопок совершенно одинаковый фон.

Не могли бы вы мне помочь?

Большое спасибо!

0
Camille Maurel 23 Сен 2018 в 14:32

2 ответа

Лучший ответ

Стиль применяется к каждому «экземпляру» .gradient-border индивидуально, поэтому вы не можете использовать одни и те же --mouse-x и --mouse-y для всех из них; вам нужно вычислить и назначить его каждому узлу.

const root = document.documentElement;
 
document.addEventListener('mousemove', evt => {
    for(let node of document.querySelectorAll(".gradient-border")){
      let box = node.getBoundingClientRect();
      let x = (evt.clientX - box.x) / box.width;
      let y = (evt.clientY - box.y) / box.height;
      node.style.setProperty("--mouse-x", x * 100 + "%");
      node.style.setProperty("--mouse-y", y * 100 + "%");
      node.textContent = x.toFixed(3) + "\n" + y.toFixed(3);
    }
});
@import url('https://fonts.googleapis.com/css?family=Raleway:200');

html, body {
  height: 100%;
}
body {
  display:flex;
  justify-content: center;
  align-items: center;
  height: 100%;
  background: #1D1F20;
}
.box {
  display: flex;
  margin: 10px;
  align-items: center;
  justify-content: center;
  width: 400px;
  height: 200px;
  color: white;
  font-family: 'Raleway';
  font-size: 2.5rem;
}

.gradient-border {
  --borderWidth: 3px;
  background: #1D1F20;
  position: relative;
  border-radius: var(--borderWidth);
}

.gradient-border:after {
  content: '';
  position: absolute;
  top: calc(-1 * var(--borderWidth));
  left: calc(-1 * var(--borderWidth));
  height: calc(100% + var(--borderWidth) * 2);
  width: calc(100% + var(--borderWidth) * 2);
  background: radial-gradient(at var(--mouse-x, 0) var(--mouse-y, 0), purple 5%, transparent 90%) no-repeat 0 0;
  border-radius: calc(2 * var(--borderWidth));
  z-index: -1;
  background-size: 100%;
}
<div class="box gradient-border">lama</div>
<div class="box gradient-border">lama</div>
<div class="box gradient-border">lama</div>
<div class="box gradient-border">lama</div>
<div class="box gradient-border">lama</div>
1
Thomas 23 Сен 2018 в 12:07

Избегайте изменения значения переменной в элементе root, меняйте его только внутри каждого элемента, и у вас будет другой фон. Используйте evt.target вместо root.

const root = document.documentElement;
 
document.addEventListener('mousemove', evt => {
    let x = evt.clientX / innerWidth;
    let y = evt.clientY / innerHeight;
 
    evt.target.style.setProperty('--mouse-x', x);
    evt.target.style.setProperty('--mouse-y', y);
});
@import url('https://fonts.googleapis.com/css?family=Raleway:200');

html, body {
  height: 100%;
}
body {
  display: flex;
  justify-content: center;
  align-items: center;
  height: 100%;
  background: #1D1F20;
}
.box {
  display: flex;
  margin: 10px;
  align-items: center;
  justify-content: center;
  width: 400px;
  height: 200px;
  color: white;
  font-family: 'Raleway';
  font-size: 2.5rem;
}

.gradient-border {
  --borderWidth: 3px;
  background: #1D1F20;
  position: relative;
  border-radius: var(--borderWidth);
}

.gradient-border:after {
  content: '';
  position: absolute;
  top: calc(-1 * var(--borderWidth));
  left: calc(-1 * var(--borderWidth));
  height: calc(100% + var(--borderWidth) * 2);
  width: calc(100% + var(--borderWidth) * 2);
  background: radial-gradient(at calc(var(--mouse-x, 0) * 100%) calc(var(--mouse-y, 0) * 100%), purple 5%, transparent 90%) no-repeat 0 0;
  border-radius: calc(2 * var(--borderWidth));
  z-index: -1;
  background-size: 100%;
}
<div class="box gradient-border">lama</div>
<div class="box gradient-border">lama</div>
0
Temani Afif 23 Сен 2018 в 11:44