点击查看html编辑器说明文档

小熊开关 switchedit icon

|
|
Fork(复制)
|
|
作者:
穿越者X57

👉 新版编辑器已上线,点击进行体验吧!

BUG反馈
嵌入
设置
下载
HTML
格式化
支持Emmet,输入 p 后按 Tab键试试吧!
<head> ...
展开
</head>
<body>
            
            <label>
  <span>开</span>
  <input type="checkbox" role="switch" class="bear" />
  <span>关</span>
</label>
        
</body>
CSS
格式化
            
            .bear {
  --time: 0.4s;
  --fur: brown;
  --skin: goldenrod;
  --eye: black;
  --spark: white;
  --bg-mask:
    /* ears */
    radial-gradient(circle at 25% 15%, var(--skin) 5%, var(--fur) 5.5% 11.5%, #0000 12%),
    radial-gradient(circle at 75% 15%, var(--skin) 5%, var(--fur) 5.5% 11.5%, #0000 12%),
    /* head */
    conic-gradient(at 50% -125%, #0000 165deg, var(--fur) 165.25deg 194.75deg, #0000 195deg) 50% 100% / 100% 80% no-repeat;
  appearance: none;
  position: relative;
  font-size: 1em;
  width: 4em;
  aspect-ratio: 1;
  background: var(--bg-mask);
  border: 1px solid #0000;
  transform: skewX(2deg);
  transform-origin: 50% 100%;
  transition: transform var(--time);
  mask: var(--bg-mask);
    
  
  &::before {
    --nose: 40%;
    content: "";
    position: absolute;
    top: 60%;
    left: 40%;
    transform: translate(-50%, -50%);
    width: 40%;
    height: 25%;
    background: 
      radial-gradient(60% 50% at var(--nose) 25%, var(--eye) 34.5%, #0000 36%),
      linear-gradient(var(--eye) 0 0) var(--nose) 30% / 3% 43% no-repeat,
      linear-gradient(var(--eye) 0 0) var(--nose) 60% / 20% 4% no-repeat,
      var(--skin);
    border-radius: 100vmax;
    transition: left var(--time), --nose var(--time);
    border: 1px solid #0000;
  }
  
  &::after {
    --bg-mask:
      radial-gradient(circle at 25% 50%, var(--eye) 12%, #0000 13%),
      radial-gradient(circle at 75% 50%, var(--eye) 12%, #0000 13%)
      ;
    content: "";
    position: absolute;
    top: 40%;
    left: 40%;
    transform: translate(-50%, -50%);
    width: 40%;
    height: 25%;
    background: 
      radial-gradient(circle at 20% 45%, var(--spark) 4%, #0000 5%),
      radial-gradient(circle at 70% 45%, var(--spark) 4%, #0000 5%),
      var(--eye)
      ;
    border-radius: 100vmax;
    transition: left var(--time);
    animation: blink 3s infinite;
    mask: var(--bg-mask);
  }
  
  &:indeterminate {
    transform: skewX(0deg);
    
    &::before {
      --nose: 50%;
      left: 50%;
    }
    
    &::after {
      left: 50%;
    }
  }
  
  &:checked {
    transform: skewX(-2deg);
    
    &::before {
      --nose: 60%;
      left: 60%;
    }
    
    &::after {
      left: 60%;
    }
  }
}



@property --nose {
  syntax: '<percentage>';
  initial-value: 50%;
  inherits: true;
}

@keyframes blink {
  0%, 10%, 100% { height: 25% }
  5% { height: 0; }
}

@media print {
  .bear {
    &, &::before, &::after {
      -webkit-print-color-adjust: exact;
      print-color-adjust: exact;
    }
  }
}

@media (prefers-reduced-motion) {
  .bear {
    &, &::before, &::after {
      transition: none !important;
      animation: none !important;
    }
  }
}

@media (prefers-contrast: more) {
  .bear {
    --fur: buttontext;
    --skin: buttonface;
    --eye: buttonface;
    --spark: buttontext;
    
    &::before {
      --eye: buttontext;
    }
  }
}

/* DEMO ONLY */
body {
  margin: 0;
  min-height: 100vh;
  display: grid;
  place-items: center;
}

label {
  display: flex;
  align-items: center;
  gap: 0.5em;
  font-size: 4vmin;
  font-family: Helvetica, Arial, sans-serif;
  font-weight: 300;
  letter-spacing: -0.025em;
}
        
JS
格式化
            
            document.querySelector(".bear").indeterminate = "indeterminate";
        
预览
控制台