DevGang
Авторизоваться

Полное руководство по CSS-переключателям с использованием CSS

Привет всем! Когда речь заходит о коммутаторах, большинство людей обращается к современным библиотекам, но создание ядра также имеет большое значение.

Создавать переключатели очень просто. Сегодня я расскажу о том, как создать CSS-переключатели.

Мы рассмотрим:

  1. Переключатели 2 состояний
  2. Переключатели 2 состояний с пользовательскими иконками
  3. Переключатели 3 состояний

Переключатели 2 состояний

Для создания переключателей необходим способ определения активных состояний. Если вы используете JavaScript, то есть много способов сделать это, динамически добавляя классы по щелчку мыши. Если речь идет о css, то есть один очень популярный способ - использование типа ввода checkbox. Он меняет свое состояние, и вы можете легко определить это состояние с помощью CSS.

Посмотрите на приведенную ниже html-структуру:

<div class="switch1-container">
      <h5> Simple two state switch</h5>
      <div class="switch1">
        <input type="checkbox" id="switch1-input"/>
        <label for="switch1-input"></label>
        <span class="switch-bg"></switch>
      </div>
</div>

Примечание: В данной html-структуре для придания bg переключателю я экспериментировал с отдельным спэном и использовал абсолютное позиционирование. Аналогичного поведения можно добиться, используя псевдоэлемент ::before.

Главное, что необходимо знать: для получения состояния включения переключателя мы можем использовать состояние checked элемента input.

Вы можете легко получить его на входе с помощью псевдокласса :checked.

Для стилизации CSS кнопки переключения нам необходимо использовать метку ввода. Хорошо, что при щелчке на метке происходит переключение состояния ввода. Поэтому скройте входные данные и оформите метку в виде красивого круга.

После того как вы создали точку b и круг, перемещайте круг вместе с bg, чтобы создать ощущение переключения. Для этого воспользуйтесь свойством transform. Используйте translateX для перемещения круга и добавьте transition на transform, чтобы сделать переход плавным.

Вот и всё!

Ваш коммутатор готов.

Посмотрите приведенный ниже Css, чтобы понять, что мы обсуждали.

Практические знания важнее.

*{
  margin:0;
  padding:0;
}
*,*::before,*::after{
  box-sizing:border-box;
}

:root{
    --clr-primary: #d9d9d9;
  --clr-secondary:#fafafa;
  --clr-clear:#ffffff;
  --clr-grey: #6d6d6d;
  --clr-dark:#1e1e1e;
  --ff-base:'Inter', sans-serif;
  --fw-regular: 400;
  --fs-200:0.875rem;
  --fs-300:1rem;
  --fs-400:1.125rem;
  --fs-500:1.375rem;
  --fs-600:1.75rem;
  --fs-700:3.25rem;

}
html{
  color-scheme: dark;
}
body{
  font-family: var(--ff-base);
  font-size: var(--fs-300);
  font-weight: var(--fw-regular);
}

.container{
  max-width:80%;
  margin: auto;
  height:100dvh;
  display:grid;
  grid-template-columns:repeat(auto-fit,minmax(200px,1fr));
/*   justify-content:center; */
  padding: 4rem;
}

input{
  display:none;
  cursor: pointer;
}
label{
  cursor: pointer;
}

.switch1-container h5{
  margin-bottom: 1rem;
}
.switch1{
  position:relative;
  border-radius: 30px;
  width:6rem;
  height:2.5rem;
  background: #ccc;
  display:flex;
  align-items:center;
  transition: .3s background-color ease;
}
.switch-bg{
  background-color: #eceeef;
  position:absolute;
  top:4px;
  left:5px;
  width:90%;
  height:80%;
  border-radius:30px;
  transition: background-color .2s ease-out;
}


.switch1 label {
  background-color:white;
  border: 1px solid #bbb;
  display:inline-block;
  width:24px;
  height:24px;
  border-radius:50%;
  display:inline-block;
  vertical-align:bottom;
  margin:5px 8px;
  z-index:2;
  transition: transform .3s ease;

}
.switch1 input:checked + label{
  transform: translateX(56px);
}
.switch1 input:checked + label + .switch-bg {
  background-color: dodgerblue;
}

Переключатели 2 состояний с пользовательской иконкой

Добавить иконку в переключатели очень просто, для этого можно использовать различные способы. Я сделал это, используя только css, даже без дополнительного html. Я использовал fontawesome для прямого использования иконок в таблице стилей. Созданная мной иконка полезна при переключении между темным и ночным режимами.

Просто добавьте это в таблицу стилей и в html-файл.

HTML

<div class="switch2-container">
      <h5> Simple two state siwtch with custom icon</h5>
      <div class="switch2">
        <input type="checkbox" id="switch2-input"/>
        <label for="switch2-input"></label>
        <span class="switch-bg"></switch>
      </div>
    </div>

CSS


.switch2-container h5{
  margin-bottom: 1rem;
}
.switch2{
  position:relative;
  border-radius: 30px;
  width:6rem;
  height:2.5rem;
  background: #ccc;
  display:flex;
  align-items:center;
  transition: .3s background-color ease;
}
.switch2-bg{
  background-color: #eceeef;
  position:absolute;
  top:4px;
  left:5px;
  width:90%;
  height:80%;
  border-radius:30px;
  transition: background-color .2s ease-out;
}


.switch2 label {
/*   background-color:white; */
/*   border: 1px solid #bbb; */
  display:inline-block;
  width:24px;
  height:24px;
  border-radius:50%;
  display:inline-block;
  vertical-align:bottom;
  margin:3px 8px 0px;
  z-index:2;
  transition: transform .3s ease;

}
.switch2 input:checked + label{
  transform: translateX(56px);
}
.switch2 input:checked + label + .switch-bg {
  background-color: dodgerblue;
}

.switch2 label::before{
  font: var(--fa-font-solid);
  content: "\f185";
  color: gold;
  font-size: 1rem;
  border: 1px solid #ccc;
  border-radius: 50%;
  padding: 4px;
}
.switch2 input:checked + label::before{
  content: "\f186";
  color:gold;
  border: none;
}
.switch2 input:checked + label + .switch-bg{
  background: black;
}

Теперь третье - самое мощное.

Переключатели 3 состояний

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

Я создал свою html-структуру следующим образом.

 <div class="switch3-container">
      <h5> Simple three state siwtch</h5>
      <div class="switch3">
        <input type="radio" id="switch3-radio1" name="radio"/>
        <label for="switch3-radio1">FrontEnd</label>

        <input type="radio" id="switch3-radio2" name="radio"/>
        <label for="switch3-radio2">BackEnd</label>

        <input type="radio" id="switch3-radio3" name="radio"/>
        <label for="switch3-radio3">FullStack</label>

      </div>
    </div>

Для этого я использовал три html-элемента с типом ввода radio.

Каждый из них имеет свой собственный лейбл для отображения текста.

Для выделения выбранного варианта я использовал псевдоэлемент ::before в .switch3.

Благодаря новому селектору :has в css это стало проще и чище, чем в html.

Посмотрите приведенный ниже css:

.switch3-container h5{
  margin-bottom: .7rem;
}
.switch3
{

  position: relative;
  height:50px;
  display:flex;
  justify-content:space-around;
}
.switch3 label{
  padding: 1rem;
  z-index:1;
}
.switch3::before{
  content: '';
  position: absolute;
  left:0;
  width: 34%;
  height: 100%;
  background: #14142a;
  border: 1px solid #fff;
  border-radius: 12px;
  opacity: .5;
  transition: .5s left ease;
}

.switch3:has(#switch3-radio1:checked)::before{
  left: 0%;
}
.switch3:has(#switch3-radio2:checked)::before{
  left: 33%;
}
.switch3:has(#switch3-radio3:checked)::before{
  left: 66%;
}

Вот как выглядят все три варианта:

Экспериментируйте с моим Codepen - Codepen Live

Аналогичным образом мы можем создать и 4-позиционный переключатель.

Если у вас возникли какие-либо сомнения или вопросы, не стесняйтесь обсуждать их в комментариях.

Есть лучший подход? Давайте обсудим!

Спасибо за прочтение!

Источник:

#CSS #HTML
Комментарии 1

Спасибо !

Чтобы оставить комментарий, необходимо авторизоваться

Присоединяйся в тусовку

В этом месте могла бы быть ваша реклама

Разместить рекламу