HTMLElement实现分组开关效果代码

代码语言:html

所属分类:其他

代码描述:HTMLElement实现分组开关效果代码,类别组有个总开关,下面有子选项开关,可全选,单独选择。

代码标签: HTMLElement 分组 开关

下面为部分代码预览,完整代码请点击下载或在bfwstudio webide中打开

<!DOCTYPE html>
<html lang="en" >

<head>
 
<meta charset="UTF-8">
 

 
<meta name="viewport" content="width=device-width, initial-scale=1">
 
 
 
<style>
toggle-categories {
        display: block;
       
        ul {
                margin: 0;
                padding: 0;
                list-style: none;
               
                &:not(ul ul) {
                        background-color: #88888830;
                        /* width: fit-content; */
                        margin-inline: auto;
                        padding-block-end: .25rem;
                }
               
                li:not(li li) {
                        margin-block-end: .5rem;
                }
               
                ul {
                        margin-block: .5rem;
                }
        }
       
        label { cursor: pointer; }
       
        /* category headings */
        li:not(li li) > .toggle-input {
                background-color: #88888840;
                justify-content: space-between;
                font-weight: bold;
               
                label:not(.toggle) {
                        padding-block: .25rem;
                }
                .toggle {
                        --_height: .8rem;
                        --_color: light-dark(red, hotpink);
                }
               
                &:hover .toggle {
                        @media (pointer: fine) {
                                /* --_slider-bg: oklch(from var(--_color) 60% 60% h); */
                                /* --_slider-active-bg: oklch(from var(--_color) 60% 40% h); */
                                --_slider-bg: var(--_color);
                                --_slider-active-bg: var(--_color);
                        }
                }
               
        }
       
        .toggle-input {
                padding: .25rem .75rem;
                display: flex;
                align-items: center;

                label {
                        &:hover { cursor: pointer; }
                        &:not(.toggle) { width: calc(100% - 2rem); }
                        &.toggle + label { padding-inline: .5rem 0; }
                        &:has(+ .toggle) { padding-inline: 0 .5rem; }
                }
               
                &:has(input:focus-visible) label:not(.toggle) {
                        outline: solid 2px var(--_color, #6666bbef);
                        outline-offset: -1px;
                }

                .toggle {
                        --_color: #018259;
                        /* --_color: light-dark(#018259, #014f4b); */
                        --_color-active: light-dark(var(--_color), oklch(from var(--_color) 48% c h));
                        --_transition: transform 0.2s ease-in-out, background-color 0.2s linear;
                        --_height: 1rem;
                        --_padding: calc(var(--_height) / 9); /* eg: 2px */
                        --_width: calc(1.5 * (var(--_height) + var(--_padding))); /* 30px */
                        --_circle: calc(var(--_height) - (2 * var(--_padding))); /* 14px */
                        --_radius: calc(var(--_circle) + (2 * var(--_padding))); /* 18px */
                        --_distance: calc(var(--_width) - (2 * var(--_padding)) - var(--_circle)); /* 12px */
                        /* active colors */
                        --_slider-active-color: light-dark(#fff, #fff);
                        --_slider-active-bg: var(--_color);
                        /* default colors */
                        --_slider-color: light-dark(#fafafa, #ddd);
                        --_slider-bg: light-dark(oklch(from var(--_color) 39% 0 h), oklch(from oklch(from var(--_color) 39% 0 h) 48% c h));

                        width: var(--_width);
                        height: var(--_height);
                        position: relative;
                        display: inline-block;

                        /* hide the checkbox */
                        input { opacity: 0; width: 0; height: 0; }

                        /* focus state (moved to the wrapping element) */
                        /* &:has(input:focus-visible) .toggle-slider {
                                outline: solid 2px var(--_color, #6666bbef);
                                outline-offset: 0.1rem;
                        } */

                        /* default state */
                        .toggle-slider {
                                position: absolute;
                                inset: 0;
                                background-color: var(--_slider-bg);
                                border-radius: var(--_radius);
                                transition: var(--_transition);
                                &:before {
                                        position: absolute;
                                        content: "";
                                        height: var(--_circle);
                                        width: var(--_circle);
                                        left: var(--_padding);
                                        top: var(--_padding);
                                        background-color: var(--_slider-color);
                                        /* -webkit-transition: var(--_transition); */
                                        transition: var(--_transition);
                                        border-radius: 50%;
                                }
                        }

                        /* checked state */
                        input:checked + .toggle-slider {
                                background-color: var(--_slider-active-bg);
                                &:before {
                                        transform: translateX(var(--_distance));
                                        background-color: var(--_slider-active-color);
                                }
                        }

                        /* intermediate state */
                        input.only-some-active + .toggle-slider {
                                /* background-color: var(--_slider-bg); */
                                &:before {
                                        transform: translateX(calc(var(--_distance) * .5));
                                        border-radius: 3px;
                                        height: calc(var(--_circle) / 6);
                                        margin-top: calc(var(--_padding) * 3);
                                }
                        }

                }
        }
       
        li li .toggle-input {
                &:hover .toggle {
                        @media (pointer: fine) {
                                /* --_slider-bg: okl.........完整代码请登录后点击上方下载按钮下载查看

网友评论0