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