Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Поменять фон части блока (https://javascript.ru/forum/events/86169-pomenyat-fon-chasti-bloka.html)

ureech 10.11.2024 18:47

Поменять фон части блока
 
Привет.
<div class="wrraper">
<!-- Затемнение для картинки -->
<div class="page"></div>
<!-- Облость вокруг курсора  --->
 <span class="magnify"></span>
<img src="" />
</div>

<style>
.page{
    width: 100%;
    height: 100%;
    background: rgba(0, 0, 0, 0.6);
    position: absolute;
}
</style>


var magnify = document.querySelector('.magnify');
 document.querySelector(".wrraper").onmousemove = function (e) {
        magnify.style.top = e.clientY * 1 - 300 + "px";
        magnify.style.left = e.clientX * 1 - 300 + "px";

}


Подскажите как мне вокруг курсора убирать затемнение?

Aetae 10.11.2024 19:57

Что значит "убирать затемнение вокруг курсора"?
Какой-то кружок оставлять прозрачным? Квадрат? Просто убирать всё затемнение при наведении?

Если кружок - используй для затемнения radial-gradient:
<div class="wrraper">
  <!-- Затемнение для картинки -->
  <div class="overlay"></div>

  <img  src="https://images.unsplash.com/photo-1506610654-064fbba4780c?crop=entropy&cs=srgb&fm=jpg&ixid=M3wzMjM4NDZ8MHwxfHJhbmRvbXx8fHx8fHx8fDE3MzEwOTcwMDV8&ixlib=rb-4.0.3&q=85" />
</div>

<style>
  .overlay {
    --cicle-radius: 10px;
    pointer-events: none;
    background-image: radial-gradient(
      circle at var(--cicle-radius) var(--cicle-radius), 
      #0000,
      #0000 calc(var(--cicle-radius) - 5px), 
      rgba(0, 0, 0, 0.6) var(--cicle-radius)
    );
    background-position: -99999px;
    background-size: 200% 200%;
    transition: background-position 0.01s;
    position: absolute;
  }
  
  html, body, .wrraper, .overlay {
    width: 100%;
    height: 100%;
    margin: 0;
    padding: 0;
    overflow: hidden;
  }
  img {
     width: 100%;
  }
</style>
<script>
  var cicleRadius = 100;
  var overlay = document.querySelector('.overlay');
  overlay.style.setProperty('--cicle-radius', `${cicleRadius}px`);
  document.querySelector(".wrraper").addEventListener('mousemove', (e) => {
    overlay.style.backgroundPosition = `${e.pageX - cicleRadius}px ${e.pageY - cicleRadius}px`;
  });
</script>


Если какая-то более сложная фигура - то всякие clip-path, mask, mix-blend-mode, filter и.т.д. тебе в помощь.

ureech 11.11.2024 12:33

Убрать затемнение, то есть, есть блок с картинкой.Картинка затемнена другим дивом, поверх первого. Когда курсор на картинке, то там где курсор, вокруг него убрать затемнение. Форма пока не важна. Это уже другой шаг)

Aetae 11.11.2024 14:01

В общем и целом "убрать затемнение" не трогая сам элемент который это затемнение обеспечивает - невозможно. Т.е. так как ты хочешь: убрать затемнение .page путём воздействия исключительно на .magnify - нельзя принципиально никак.
Чтоб что-то делать с затемнением - надо это делать именно с самим затемнением. Рабочий пример я привёл, как и написал другие возможные варианты.

Альтернативой может быть не "убирание затемнения", а рисование копии того, что лежит под затемнением. Т.е. в .magnify ты кладёшь точно такую же img как и снизу, обрезаешь и позиционируешь её как тебе надо. Это очень ограниченный в применимости способ, но в данном конкретном случае имеет право на жизнь.

ureech 11.11.2024 19:07

Вот пример на слайдере. С затемнением. Как такое реализовать?

Aetae 11.11.2024 19:12

ureech, и чем тебе не нравится тот код, что я тебе привёл? Он делает абсолютно то же самое, разве что края кружка не так размывает(что меняется правкой оной циферки).

ureech 12.11.2024 10:10

Aetae,
да нет, спасибо, я не о том. Я ещё и не кодил) Просто хотел уточнить непонятные мне моменты.

ureech 12.11.2024 19:04

Ну вроде победил я его)
Вот пример с кодом, кому интересно. Только на реальном сайте, нужно учитывать координаты блока при задании координат мыши.
Но вот как размыть очертания круга что то не найти. Вся инфа о масках и тп для css. Как применить для js нужна помощь.

Aetae 13.11.2024 00:08

Ты зачем-то пошёл по альтернативному варианту, хотя он и сложнее. Но ок. Чтоб получить размытый кружок тебе всё также придётся воспользоваться радиальным градиентом как и в моём примере, только теперь как маской: убери clip-path и используй
day.style.mask=`radial-gradient(circle at ${x}px ${y}px, rgba(0, 0, 0), rgba(0, 0, 0) 40px, rgb(0, 0, 0, 0) 60px)`;
Разница меж 40px и 60px - ширина размытия.

ureech 13.11.2024 09:36

Ок. Спасибо.


Часовой пояс GMT +3, время: 07:04.