Демо
  • 7,23 КБ
  • HTML, CSS, JS
  • Кнопка
  • Лицензия MIT
HTML
<div class="container">
    <div class="button">
        <div class="left-click-trigger"></div>
        <div class="right-click-trigger"></div>
        <div class="switch">
            <div class="inner"></div>
        </div>
        <div class="icon-on"></div>
        <div class="icon-off"></div>
    </div>
</div>
CSS
.button {
    -webkit-box-shadow: -4px -4px 20px rgba(255, 255, 255, 0.15), 4px 4px 20px rgba(0, 0, 0, 0.9);
    -moz-box-shadow: -4px -4px 20px rgba(255, 255, 255, 0.15), 4px 4px 20px rgba(0, 0, 0, 0.9);
    box-shadow: -4px -4px 20px rgba(255, 255, 255, 0.15), 4px 4px 20px rgba(0, 0, 0, 0.9);
}

html,
body {
    margin: 0;
    padding: 0;
}

.container {
    background: #1c1c1e;
    width: 100vw;
    height: 100vh;
    position: relative;
}
.container .button {
    cursor: pointer;
    background: -webkit-linear-gradient(320deg, #212123, #171719);
    background: -moz-linear-gradient(320deg, #212123, #171719);
    background: -o-linear-gradient(320deg, #212123, #171719);
    background: linear-gradient(130deg, #212123, #171719);
    position: absolute;
    top: 50%;
    left: 50%;
    -webkit-transform: translate(-50%, -50%);
    -moz-transform: translate(-50%, -50%);
    -o-transform: translate(-50%, -50%);
    transform: translate(-50%, -50%);
    width: 300px;
    height: 140px;
    -webkit-border-radius: 150px;
    -moz-border-radius: 150px;
    border-radius: 150px;
}
.container .button .left-click-trigger,
.container .button .right-click-trigger {
    position: absolute;
    left: 0;
    z-index: 50;
    width: 50%;
    height: 100%;
    top: 0;
}
.container .button .right-click-trigger {
    left: 50%;
}
.container .button .switch {
    background: -webkit-gradient(linear, left top, right top, from(#2b2b2e), to(#0d0d0e));
    background: -webkit-linear-gradient(left, #2b2b2e, #0d0d0e);
    background: -moz-linear-gradient(left, #2b2b2e, #0d0d0e);
    background: -o-linear-gradient(left, #2b2b2e, #0d0d0e);
    background: linear-gradient(90deg, #2b2b2e, #0d0d0e);
    -webkit-border-radius: 150px;
    -moz-border-radius: 150px;
    border-radius: 150px;
    position: absolute;
    top: 50%;
    left: 50%;
    -webkit-transform: translate(-50%, -50%);
    -moz-transform: translate(-50%, -50%);
    -o-transform: translate(-50%, -50%);
    transform: translate(-50%, -50%);
    width: 80%;
    height: 70%;
    -webkit-box-shadow: 0 0 10px rgba(0, 0, 0, 0.2);
    -moz-box-shadow: 0 0 10px rgba(0, 0, 0, 0.2);
    box-shadow: 0 0 10px rgba(0, 0, 0, 0.2);
}
.container .button .switch .inner {
    background: -webkit-gradient(linear, left top, right top, color-stop(45%, #171719), color-stop(55%, #212123));
    background: -webkit-linear-gradient(left, #171719 45%, #212123 55%);
    background: -moz-linear-gradient(left, #171719 45%, #212123 55%);
    background: -o-linear-gradient(left, #171719 45%, #212123 55%);
    background: linear-gradient(90deg, #171719 45%, #212123 55%);
    width: 94%;
    height: 100%;
    -webkit-transition: 0.5s cubic-bezier(0.9, 0, 0, 1);
    -o-transition: 0.5s cubic-bezier(0.9, 0, 0, 1);
    -moz-transition: 0.5s cubic-bezier(0.9, 0, 0, 1);
    transition: 0.5s cubic-bezier(0.9, 0, 0, 1);
    position: absolute;
    left: 6%;
    -webkit-border-radius: 150px;
    -moz-border-radius: 150px;
    border-radius: 150px;
}
.container .button .switch .inner::after {
    content: "";
    position: absolute;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    background: -webkit-gradient(linear, left top, right top, color-stop(45%, #212123), color-stop(55%, #171719));
    background: -webkit-linear-gradient(left, #212123 45%, #171719 55%);
    background: -moz-linear-gradient(left, #212123 45%, #171719 55%);
    background: -o-linear-gradient(left, #212123 45%, #171719 55%);
    background: linear-gradient(90deg, #212123 45%, #171719 55%);
    -webkit-transition: 0.5s cubic-bezier(0.9, 0, 0, 1);
    -o-transition: 0.5s cubic-bezier(0.9, 0, 0, 1);
    -moz-transition: 0.5s cubic-bezier(0.9, 0, 0, 1);
    transition: 0.5s cubic-bezier(0.9, 0, 0, 1);
    -webkit-border-radius: 150px;
    -moz-border-radius: 150px;
    border-radius: 150px;
    opacity: 0;
}
.container .button .icon-on {
    position: absolute;
    top: 50%;
    left: 70%;
    -webkit-transform: translate(-50%, -50%);
    -moz-transform: translate(-50%, -50%);
    -o-transform: translate(-50%, -50%);
    transform: translate(-50%, -50%);
    background: #a1f1f2;
    width: 5px;
    height: 30px;
    -webkit-border-radius: 20px;
    -moz-border-radius: 20px;
    border-radius: 20px;
    -webkit-box-shadow: 0 0 30px 2px rgba(161, 241, 242, 0.8);
    -moz-box-shadow: 0 0 30px 2px rgba(161, 241, 242, 0.8);
    box-shadow: 0 0 30px 2px rgba(161, 241, 242, 0.8);
    -webkit-transition: 0.5s cubic-bezier(0.9, 0, 0, 1);
    -o-transition: 0.5s cubic-bezier(0.9, 0, 0, 1);
    -moz-transition: 0.5s cubic-bezier(0.9, 0, 0, 1);
    transition: 0.5s cubic-bezier(0.9, 0, 0, 1);
}
.container .button .icon-off {
    position: absolute;
    top: 50%;
    left: 33%;
    -webkit-transform: translate(-45%, -50%) rotate3d(0, 1, 0, 25deg);
    -moz-transform: translate(-45%, -50%) rotate3d(0, 1, 0, 25deg);
    transform: translate(-45%, -50%) rotate3d(0, 1, 0, 25deg);
    background: #171719;
    width: 25px;
    height: 25px;
    -webkit-border-radius: 50%;
    -moz-border-radius: 50%;
    border-radius: 50%;
    -webkit-transition: 0.5s cubic-bezier(0.9, 0, 0, 1);
    -o-transition: 0.5s cubic-bezier(0.9, 0, 0, 1);
    -moz-transition: 0.5s cubic-bezier(0.9, 0, 0, 1);
    transition: 0.5s cubic-bezier(0.9, 0, 0, 1);
    -webkit-box-shadow: 0 0 30px rgba(0, 0, 0, 0.8), inset 0 0 15px rgba(0, 0, 0, 0.5);
    -moz-box-shadow: 0 0 30px rgba(0, 0, 0, 0.8), inset 0 0 15px rgba(0, 0, 0, 0.5);
    box-shadow: 0 0 30px rgba(0, 0, 0, 0.8), inset 0 0 15px rgba(0, 0, 0, 0.5);
    border: 5px solid #2d2d30;
}
.container .button.off .icon-on {
    left: 67%;
    -webkit-box-shadow: 0 0 25px rgba(0, 0, 0, 0.9);
    -moz-box-shadow: 0 0 25px rgba(0, 0, 0, 0.9);
    box-shadow: 0 0 25px rgba(0, 0, 0, 0.9);
    background: #2d2d30;
    -webkit-transform: translate(-50%, -50%) rotate3d(0, 1, 0, 25deg);
    -moz-transform: translate(-50%, -50%) rotate3d(0, 1, 0, 25deg);
    transform: translate(-50%, -50%) rotate3d(0, 1, 0, 25deg);
}
.container .button.off .icon-off {
    left: 30%;
    background: #212123;
    border-color: #f2a2a1;
    -webkit-box-shadow: 0 0 30px rgba(242, 162, 161, 0.8), inset 0 0 15px rgba(242, 162, 161, 0.5);
    -moz-box-shadow: 0 0 30px rgba(242, 162, 161, 0.8), inset 0 0 15px rgba(242, 162, 161, 0.5);
    box-shadow: 0 0 30px rgba(242, 162, 161, 0.8), inset 0 0 15px rgba(242, 162, 161, 0.5);
    -webkit-transform: translate(-50%, -50%) rotate3d(0, 1, 0, 0deg);
    -moz-transform: translate(-50%, -50%) rotate3d(0, 1, 0, 0deg);
    transform: translate(-50%, -50%) rotate3d(0, 1, 0, 0deg);
}
.container .button.off .switch .inner {
    left: 0;
}
.container .button.off .switch .inner::after {
    opacity: 1;
}
JS
$(".left-click-trigger").click(function (e) {
  $(".button").addClass("off");
});
$(".right-click-trigger").click(function (e) {
  $(".button").removeClass("off");
});

Этот фрагмент кода превращает в жизнь изящный и интерактивный веб-элемент, созданный с помощью HTML, CSS и JavaScript для создания привлекательного и функционального пользовательского интерфейса.

Начиная с HTML, он определяет структурированную компоновку с элементом div, который классифицируется как «контейнер» и включает в себя другой div с классом «кнопка». Эта кнопка дополнительно разбивается на меньшие div элементы для специфических функций, таких как триггеры для левого и правого клика и переключатель с внутренней частью, включая иконки для состояний «включено» и «выключено». Эта структура служит каркасом нашего интерактивного компонента, обеспечивая четкую иерархию и организацию визуальных элементов, которые мы будем стилизовать и анимировать.

Переходя к CSS, магия стилизации вступает в игру, особенно с использованием свойства box-shadow для добавления глубины и размерности элементам. Свойство box-shadow используется несколько раз для разных элементов, создавая ощущение реализма через тонкие тени и световые эффекты. Например, оно применяется к «кнопке», чтобы придать ей вид нажатой или парящей в зависимости от имитации источника света, улучшая визуальный опыт пользователя. Использование градиентов, скругленных углов и переходов в сочетании с box-shadow дополнительно способствует эстетической привлекательности и интерактивности кнопки, делая ее не только визуально привлекательной, но и отзывчивой на действия пользователя с плавными анимациями.

JavaScript связывает все вместе, добавляя интерактивность кнопке. Он отслеживает события клика по левому и правому триггерам, динамически добавляя или удаляя класс «off» в зависимости от взаимодействия. Этот простой, но эффективный скрипт позволяет переключаться между состояниями «включено» и «выключено», демонстрируя, как HTML, CSS и JavaScript работают в гармонии для создания интерактивных веб-компонентов. Использование jQuery для обработки событий упрощает процесс, делая код более читабельным и легким для поддержки.

В сущности, этот фрагмент кода является прекрасным примером того, как сочетание структуры HTML, стилизации CSS и функциональности JavaScript может произвести впечатляющий пользовательский интерфейсный компонент, который одновременно красив и интерактивен.

Меню