Opacity по onmouseover в нескольких "дивах"

Есть более двух блоков в дивах, находится они могут в разных слоях. Нужно что-бы при наведении курсора: на блок1 проявлялся блок3, на блок2 — блок4, и так далее. Собственно решение я сделал.

document.getElementById('block1').onmouseover = fuin1;
document.getElementById('block1').onmouseout = fuout1;
document.getElementById('block2').onmouseover = fuin2;
document.getElementById('block2').onmouseout = fuout2;

function fuin1() {
  document.getElementById('block3').style.opacity = '1';
}

function fuout1() {
  document.getElementById('block3').style.opacity = '0';
}

function fuin2() {
  document.getElementById('block4').style.opacity = '1';
}

function fuout2() {
  document.getElementById('block4').style.opacity = '0';
}
body {
  background-color: #242424;
  background-image: url();
}

p {
  color: #f4f4f4;
  font-size: medium;
  font-weight: 700;
  text-shadow: (2 2 0 2 black);
  text-transform: capitalize;
  margin: 0.4em;
}

div {
  display: flex;
  width: 4em;
  height: 4em;
  position: fixed;
  margin: 1em;
}

#block1,
#block2 {
  cursor: pointer;
  border: ridge;
  border-color: grey;
}

#block1 {
  background: cyan;
  top: 1em;
  left: 4em;
}

#block2 {
  background: green;
  top: 6em;
  left: 4em;
}

#block3 {
  background: darkcyan;
  top: 1em;
  left: 9em;
  opacity: 0;
}

#block4 {
  background: darkgreen;
  top: 6em;
  left: 9em;
  opacity: 0;
}
<div>
  <div id="block1">
    <p>
      block1
    </p>
  </div>
</div>
<div>
  <div id="block2">
    <p>
      block2
    </p>
  </div>
</div>
<div id="block3">
  <p>
    block3
  </p>
</div>
<div>
  <div>
    <div id="block4">
      <p>
        block4
      </p>
    </div>
  </div>
</div>

Но мне кажется что есть более правильное решение с обобщённой функцией. Пробовал через классы — не выходит. Подскажите пожалуйста.


Ответы (1 шт):

Автор решения: Ruslan Mart

Примерно так:

<div>
  <div id="block1" data-target-id="block3">
    <p>
      block1
    </p>
  </div>
</div>
<div>
  <div id="block2" data-target-id="block4">
    <p>
      block2
    </p>
  </div>
</div>
<div id="block3">
  <p>
    block3
  </p>
</div>
<div>
  <div>
    <div id="block4">
      <p>
        block4
      </p>
    </div>
  </div>
</div>
const onMouseEnter = (target) => {
  target.style.opacity = 1;
};

const onMouseLeave = (target) => {
  target.style.opacity = 0;
};



['block1', 'block2'].forEach((id) => {
  const node = document.getElementById(id);
  const target = document.getElementById(node.dataset.targetId);
  
  node.addEventListener('mouseenter', () => onMouseEnter(target));
  node.addEventListener('mouseleave', () => onMouseLeave(target));
});

Если Вам действительно нужно, чтобы при наведении на элемент всплывал рядом ещё один, то можно просто сверстать немного по-другому и сделать через CSS :hover.

→ Ссылка