{"componentChunkName":"component---src-templates-post-js","path":"/html-css/velikolepnyi-hover-effect-s-css-peremennimy/","result":{"pageContext":{"slug":"velikolepnyi-hover-effect-s-css-peremennimy","content":"\n<p id=\"21a3\">Для того, чтобы понять, что такое CSS переменные то советую прочитать статью — <a href=\"https://stasonmars.ru/html-css/rukovodstvo-po-rabote-s-peremennimy-v-css/\">Руководство по работе с переменными в CSS</a>.</p>\n\n\n\n<p id=\"ed79\">Там вы поймете, что с ними делать и как с ними быть. Ничего сложного на самом деле, только нужно немного захотеть разобраться.</p>\n\n\n\n<p id=\"3165\">А в этой статье вы узнаете как применять эти самые переменные в реальном и очень полезном кейсе. Создавая великолепный hover эффект.</p>\n\n\n\n<p class=\"author\"><em>Перевод статьи&nbsp;</em><a href=\"https://blog.prototypr.io/stunning-hover-effects-with-css-variables-f855e7b95330\"><em>Stunning hover effects with CSS variables</em></a></p>\n\n\n\n<p> Недавно я был воодушевлён забавной hover анимацией&nbsp;<a href=\"https://getgrover.com/de-en/products/iphone-x-64gb\">на сайте Grover</a>. Двигая мышкой над кнопкой подписки появляется цветной градиент, который следует за курсором во время его движения. Идея простая, но как результат мы получаем кнопку, которая выделяется на фоне других и прямо напрашивается на то, чтобы по ней кликнули.</p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" width=\"696\" height=\"316\" src=\"https://stasonmars.ru/wp/wp-content/uploads/2021/01/1_h6jWPeAzIatzjLmRr9JAvg.gif\" alt=\"\" class=\"wp-image-82\"/></figure>\n\n\n\n<p>Как мы можем достигнуть такого же эффекта, чтобы наш сайт тоже выделялся? Ну, это не так сложно, как вы уже могли подумать.</p>\n\n\n\n<h2 id=\"02f0\">Отслеживание позиции</h2>\n\n\n\n<p id=\"56e9\">Первое, что нам нужно это позиция мышки.</p>\n\n\n\n<pre class=\"wp-block-code javascript\"><code>document.querySelector('.button').onmousemove = (e) => {\n  const x = e.pageX - e.target.offsetLeft\n  const y = e.pageY - e.target.offsetTop\n  e.target.style.setProperty('--x', `${ x }px`)\n  e.target.style.setProperty('--y', `${ y }px`)\n \n}</code></pre>\n\n\n\n<p id=\"1b0a\">Выберите элемент и ждите пока пользователь не двинет мышкой вдоль него.</p>\n\n\n\n<p id=\"a923\">Высчитайте позицию относительно элемента.</p>\n\n\n\n<p id=\"d3b9\">Сохраните координаты в CSS переменную.</p>\n\n\n\n<p id=\"3d8a\">Да, всего 9 строчек кода, чтобы указать CSS где пользователь позиционирует мышку. Вообще количество эффектов, которое вы можете сделать с помощью этой информации просто бесчисленно. Но давайте завершим наш CSS, для начала.</p>\n\n\n\n<h2 id=\"e816\">Анимируем градиент</h2>\n\n\n\n<p id=\"9dc7\">Теперь у нас есть координаты записанные в CSS переменные и мы можем использовать их по всему нашему CSS.</p>\n\n\n\n<pre class=\"wp-block-code css\"><code>.button {\n  position: relative;\n  appearance: none;\n  background: #f72359;\n  padding: 1em 2em;\n  border: none;\n  color: white;\n  font-size: 1.2em;\n  cursor: pointer;\n  outline: none;\n  overflow: hidden;\n  border-radius: 100px;\n  span {\n    position: relative;\n  }\n  &amp;::before {\n    --size: 0;\n    content: '';\n    position: absolute;\n    left: var(--x);\n    top: var(--y);\n    width: var(--size);\n    height: var(--size);\n    background: radial-gradient(circle closest-side, #4405f7, transparent);\n    transform: translate(-50%, -50%);\n    transition: width .2s ease, height .2s ease;\n  }\n  &amp;:hover::before {\n    --size: 400px;\n  }\n}</code></pre>\n\n\n\n<p id=\"e4ba\">Оберните текст в <code>span</code>, чтобы избежать того, что градиент появится над ним.</p>\n\n\n\n<p id=\"914e\">Начните с&nbsp;<code>width</code>&nbsp;и&nbsp;<code>height</code>&nbsp;<code>0px</code>&nbsp;и поднимайте до&nbsp;<code>400px</code>, когда пользователь наведет на кнопку. И не забудьте выставить переход (<code>transition</code>), чтобы бы все это происходило плавно, быстро и красиво.</p>\n\n\n\n<p id=\"96db\">Используйте координаты, чтобы следовать за мышкой.</p>\n\n\n\n<p id=\"1d73\">Примените&nbsp;<code>radial-gradient</code>&nbsp;для&nbsp;<code>background</code>&nbsp;и используйте closest-side circle. Closest-side заполнит весь before, не выходя за него.</p>\n\n\n\n<h2 id=\"0e65\">Результат</h2>\n\n\n\n<p id=\"0fdf\">И всё! Добавьте недостающий HTML и наслаждайтесь кнопкой.</p>\n\n\n\n<pre class=\"wp-block-code css\"><code>&lt;button class=\"button\">\n  &lt;span>Hover me I'm awesome&lt;/span>\n&lt;/button></code></pre>\n\n\n\n<p><a href=\"https://codepen.io/electerious/pen/MQrRxX\">codepen пример</a></p>\n\n\n\n<h2 id=\"8a1f\">Огромные возможности</h2>\n\n\n\n<p id=\"522f\">Вы можете сделать огромное количество эффектов, реагируя на позицию мышки. Это прекрасно и с этим забавно поиграться.</p>\n\n\n\n<p id=\"5a18\">Вот схожая анимация, которую я использовал:</p>\n\n\n\n<blockquote class=\"twitter-tweet\"><p lang=\"en\" dir=\"ltr\">May the hover be with you <a href=\"https://t.co/2jrmVorLRW\">pic.twitter.com/2jrmVorLRW</a></p>— Tobias Reich (@electerious) <a href=\"https://twitter.com/electerious/status/957688130269786112?ref_src=twsrc%5Etfw\">January 28, 2018</a></blockquote> <script async=\"\" src=\"https://platform.twitter.com/widgets.js\" charset=\"utf-8\"></script>\n\n\n\n<p>Или включите фантазию и сделайте 3D параллакс кнопку:</p>\n\n\n\n<blockquote class=\"twitter-tweet\"><p lang=\"en\" dir=\"ltr\">3D parallax button with JS controlled CSS variables <a href=\"https://twitter.com/CodePen?ref_src=twsrc%5Etfw\">@CodePen</a> 🎉 <a href=\"https://t.co/qE0woiNip8\">https://t.co/qE0woiNip8</a> <a href=\"https://t.co/Wyi0xjRzPq\">pic.twitter.com/Wyi0xjRzPq</a></p>— Tobias Reich (@electerious) <a href=\"https://twitter.com/electerious/status/789582380889669632?ref_src=twsrc%5Etfw\">October 21, 2016</a></blockquote> <script async=\"\" src=\"https://platform.twitter.com/widgets.js\" charset=\"utf-8\"></script>\n\n\n\n<p>Возможности безграничным. Только попробуйте сами.</p>\n\n\n\n<h2 id=\"58aa\">Вопросы и ответы</h2>\n\n\n\n<p id=\"92ca\">Почему анимация&nbsp;<code>width</code>&nbsp;и&nbsp;<code>height</code>&nbsp;вместо использования&nbsp;<code>transform: scale()</code>?</p>\n\n\n\n<p id=\"8c4b\">Производительность довольно плоха при анимации width и height, и вам надо всегда стараться использовать transform при доступной возможности. Так почему я так не делал? Проблема в том, что браузер рендерит элементы (которые трансформируются) в ускоренном слое. Этот слой может вызывать проблемы в случае, когда кнопка имеет не прямоугольные края.</p>\n\n\n\n<p id=\"a613\">Конечно же есть способы для применения transform, но некоторые браузеры этого не любят. Отказ от применения transition до transform это одно потенциальное решение. Есть также обходное решение для Safari, которое может исправить эту&nbsp;<a href=\"https://gist.github.com/ayamflow/b602ab436ac9f05660d9c15190f4fd7b\">проблему с обрезкой</a>.</p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" width=\"701\" height=\"289\" src=\"https://stasonmars.ru/wp/wp-content/uploads/2021/01/1_YmW0jcdl0EVE3dVO63dW9g.png\" alt=\"\" class=\"wp-image-84\" srcset=\"https://stasonmars.ru/wp/wp-content/uploads/2021/01/1_YmW0jcdl0EVE3dVO63dW9g.png 701w, https://stasonmars.ru/wp/wp-content/uploads/2021/01/1_YmW0jcdl0EVE3dVO63dW9g-300x124.png 300w\" sizes=\"(max-width: 701px) 100vw, 701px\" /></figure>\n","type":"html-css","date":"2021-01-09T15:15:51.000Z","acf":{"seo_desc":"А в этой статье вы узнаете как применять эти самые переменные в реальном и очень полезном кейсе. Создавая великолепный hover эффект","pub_date":"2018-07-06","keywords":"css переменные, возможности css переменных, hover эффект css переменные","tags":"CSS, CSS переменные, CSS советы"},"title":"Великолепный hover эффект с CSS переменными","id":"a39712dc-6c4f-5705-b310-d3cd25bc0b5c","excerpt":"<p>А в этой статье вы узнаете как применять эти самые переменные в реальном и очень полезном кейсе. Создавая великолепный hover эффект</p>\n","featured_media":{"source_url":"https://stasonmars.ru/wp/wp-content/uploads/2021/01/DglYtvO7Bn0-16.jpg"},"interesting":[{"title":"Великолепный hover эффект с CSS переменными","slug":"velikolepnyi-hover-effect-s-css-peremennimy","type":"html-css"},{"title":"7 примеров использования CSS переменных","slug":"7-primerov-ispolzovaniya-css-peremennyh","type":"html-css"},{"title":"Руководство по работе с переменными в CSS","slug":"rukovodstvo-po-rabote-s-peremennimy-v-css","type":"html-css"}]}},"staticQueryHashes":["3576131997","63159454"]}