Эффект радиуса границы при наведении курсора на ссылку привязки

#javascript #jquery #html #css

#javascript #jquery #HTML #css

Вопрос:

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

Однако я не могу воспроизвести его функциональность для своей разметки. Я пытался обернуть классы вокруг div (а не button ), но по-прежнему безуспешно.

 document.querySelector('.btn--hoverGradient').onmousemove = (e) => {

  // const x = e.pageX - e.target.offsetLeft
  // const y = e.pageY - e.target.offsetTop

  var rect = e.target.getBoundingClientRect();
  const x = e.clientX - rect.left;
  const y = e.clientY - rect.top;

  e.target.style.setProperty('--x', `${ x }px`)
  e.target.style.setProperty('--y', `${ y }px`)

}  
 a{
  text-decoration: none;
}
.btn--hoverGradient {
  position: relative;
  appearance: none;
  border: none;
  cursor: pointer;
  outline: none;
  overflow: hidden;
  border-radius: 100px;
}
.btn--hoverGradient a {
  position: relative;
  pointer-events: none;
}
.btn--hoverGradient::before {
  --size: 0;
  content: "";
  position: absolute;
  left: var(--x);
  top: var(--y);
  width: var(--size);
  height: var(--size);
  transform: translate(-50%, -50%);
  transition: width 0.2s ease, height 0.2s ease;
}
.btn--hoverGradient-darkGrey {
  background: radial-gradient(circle closest-side, #FFF, transparent);
}
.btn--hoverGradient:hover::before {
  --size: 400px;
}

.btn--core {
  border: 0;
  outline: 0;
  display: inline-block;
  white-space: nowrap;
  vertical-align: middle;
  -webkit-user-select: none;
  -moz-user-select: none;
  -ms-user-select: none;
  text-align: center;
  user-select: none;
  border-radius: 0.25rem;
  padding: 11px 40px;
  transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
  font-size: 1.25em;
}
.btn--darkGrey {
  font-family: "Raleway", sans-serif;
  font-weight: 700;
  color: #FFFFFF;
  background-color: #293440;
}  
 <div class="btn--hoverGradient btn--hoverGradient-darkGrey">
  <a href="#" class="btn--core btn--darkGrey">test</a>
</div>  

Где я ошибаюсь?

Ответ №1:

В css,

 .btn--hoverGradient-darkGrey {
  background: radial-gradient(circle closest-side, #FFF, transparent);
}
  

должно быть,

 .btn--hoverGradient-darkGrey:before {
  background: radial-gradient(circle closest-side, #4405f7, transparent);
}
  

Вы сделали его белым цветом, по этой причине вы не смогли увидеть эффект, а во-вторых, вы пропустили ‘:before’

Все еще эффекты не такие, как в ссылке.

Ответ №2:

В дополнение к изменениям, о которых упомянул @Shoyeb, внесите эти изменения, и все должно работать нормально.

Сначала удалите цвет фона из класса ‘btn—darkGrey’ и поместите его в класс вашего родительского подразделения ‘btn—hoverGradient’.

Во-вторых, поместите ‘position:relative;’ в базовый класс ‘btn—core’.

 document.querySelector('.btn--hoverGradient').onmousemove = (e) => {

  // const x = e.pageX - e.target.offsetLeft
  // const y = e.pageY - e.target.offsetTop

  var rect = e.target.getBoundingClientRect();
  const x = e.clientX - rect.left;
  const y = e.clientY - rect.top;

  e.target.style.setProperty('--x', `${ x }px`)
  e.target.style.setProperty('--y', `${ y }px`)

}  
 a{
  text-decoration: none;
}
.btn--hoverGradient {
  position: relative;
  appearance: none;
  border: none;
  cursor: pointer;
  outline: none;
  overflow: hidden;
  border-radius: 100px;
  width:400px;
  background-color: #293440;
}
.btn--hoverGradient a {
  position: relative;
  pointer-events: none;
}
.btn--hoverGradient::before {
  --size: 0;
  content: "";
  position: absolute;
  left: var(--x);
  top: var(--y);
  width: var(--size);
  height: var(--size);
  transform: translate(-50%, -50%);
  transition: width 0.2s ease, height 0.2s ease;
}
.btn--hoverGradient-darkGrey:before {
  background: radial-gradient(circle closest-side, #4405f7, transparent);
}
.btn--hoverGradient:hover::before {
  --size: 400px;
}

.btn--core {
  border: 0;
  outline: 0;
  display: inline-block;
  white-space: nowrap;
  vertical-align: middle;
  -webkit-user-select: none;
  -moz-user-select: none;
  -ms-user-select: none;
  text-align: center;
  user-select: none;
  border-radius: 0.25rem;
  padding: 11px 40px;
  transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
  font-size: 1.25em;
  position:relative;
}
.btn--darkGrey {
  font-family: "Raleway", sans-serif;
  font-weight: 700;
  color: #FFFFFF;
}  
 <div class="btn--hoverGradient btn--hoverGradient-darkGrey">
  <a href="#" class="btn--core btn--darkGrey">test</a>
</div>