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