#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>