技術(shù)頻道導(dǎo)航
HTML/CSS
.NET技術(shù)
IIS技術(shù)
PHP技術(shù)
Js/JQuery
Photoshop
Fireworks
服務(wù)器技術(shù)
操作系統(tǒng)
網(wǎng)站運(yùn)營(yíng)

贊助商

分類目錄

贊助商

最新文章

搜索

漂亮的CSS藍(lán)色單選框radio、復(fù)選框checkbox和開關(guān)switch按鈕

作者:admin    時(shí)間:2023-2-24 16:51:53    瀏覽:

本文介紹一個(gè)漂亮的CSS實(shí)現(xiàn)的藍(lán)色單選框(radio)、復(fù)選框(checkbox)和開關(guān)(switch)按鈕。

 

demodownload

實(shí)例簡(jiǎn)介

本實(shí)例使用CSS+SVG+Javascript來實(shí)現(xiàn),效果非常不錯(cuò),藍(lán)色樣式很漂亮。

HTML代碼

html代碼中,單選框(radio)、復(fù)選框(checkbox)和開關(guān)按鈕(switch)有很多共用及相同之處,這里以單選框(radio)為例。

單選框(radio)html代碼

<label class="radio">
<input type="radio" name="r" value="1" checked />
<svg viewBox="0 0 24 24" filter="url(#goo-light)">
<circle class="top" cx="12" cy="-12" r="8" />
<circle class="dot" cx="12" cy="12" r="5" />
<circle class="drop" cx="12" cy="12" r="2" />
</svg>
</label>
<label class="radio">
<input type="radio" name="r" value="2" />
<svg viewBox="0 0 24 24" filter="url(#goo-light)">
<circle class="top" cx="12" cy="-12" r="8" />
<circle class="dot" cx="12" cy="12" r="5" />
<circle class="drop" cx="12" cy="12" r="2" />
</svg>
</label>

HTML代碼結(jié)構(gòu)有兩個(gè)label標(biāo)簽,第一個(gè)label是選中狀態(tài),第二個(gè)label是非選中狀態(tài)。復(fù)選框、開關(guān)按鈕的HTML代碼結(jié)構(gòu)也是一樣。

label代碼里包含一個(gè)input標(biāo)簽,和一個(gè)svg標(biāo)簽。兩個(gè)label里的svg標(biāo)簽代碼是一樣的,不同的是兩個(gè)input標(biāo)簽的值,選中是1,value="1",非選中是2,value="2"

代碼里我們看到svgfilter屬性值,filter="url(#goo-light)",這個(gè)值(#goo-light)的內(nèi)容可以在svg代碼里找到,如下標(biāo)記:

<svg width="0" height="0">
    <defs>
        <filter id="goo" x="-50%" width="200%" y="-50%" height="200%" color-interpolation-filters="sRGB">
            <feGaussianBlur in="SourceGraphic" stdDeviation="3" result="blur" />
            <feColorMatrix in="blur" mode="matrix" values="1 0 0 0 0  0 1 0 0 0  0 0 1 0 0  0 0 0 21 -7" result="cm" />
        </filter>
        <filter id="goo-light" x="-50%" width="200%" y="-50%" height="200%" color-interpolation-filters="sRGB">
            <feGaussianBlur in="SourceGraphic" stdDeviation="1.25" result="blur" />
            <feColorMatrix in="blur" mode="matrix" values="1 0 0 0 0  0 1 0 0 0  0 0 1 0 0  0 0 0 21 -7" result="cm" />
        </filter>
        <filter id="goo-big" x="-50%" width="200%" y="-50%" height="200%" color-interpolation-filters="sRGB">
            <feGaussianBlur in="SourceGraphic" stdDeviation="7" result="blur" />
            <feColorMatrix in="blur" mode="matrix" values="1 0 0 0 0  0 1 0 0 0  0 0 1 0 0  0 0 0 21 -7" result="cm" />
        </filter>
    </defs>
</svg>

以上便是單選框(radio)的HTML代碼結(jié)構(gòu),但是這樣的HTML+SVG代碼是不能構(gòu)造出一個(gè)單選框的,這就需要用到強(qiáng)大的CSS樣式了,主要CSS代碼如下:

:root {
  --c-active: #275EFE;
  --c-active-inner: #FFFFFF;
  --c-default: #D2D6E9;
  --c-default-dark: #C7CBDF;
  --c-black: #1B1B22;
}

.radio {
  display: table;
  border-radius: var(--border-radius, 12px) var(--border-radius-corner, 12px) var(--border-radius, 12px) var(--border-radius, 12px);
  position: relative;
}
.radio input {
  -webkit-appearance: none;
     -moz-appearance: none;
          appearance: none;
  outline: none;
  border: none;
  background: var(--input-background, none);
  display: block;
  cursor: pointer;
  margin: 0;
  padding: 0;
  border-radius: inherit;
  width: var(--input-width, 24px);
  height: var(--input-height, 24px);
}
.radio svg {
  display: block;
  position: absolute;
  left: 0;
  right: 0;
  bottom: 0;
  top: 0;
  pointer-events: none;
  fill: var(--c-active-inner);
  transform: scale(1.01) translateZ(0);
}

.radio input {
  --border-color: var(--c-default);
  --border-width: 2px;
  box-shadow: inset 0 0 0 var(--border-width) var(--border-color);
}
.radio input:checked {
  --border-color: var(--c-active);
}
.radio input:not(:checked) {
  transition: box-shadow 0.25s;
}
.radio input:not(:checked):hover {
  --border-width: 3px;
  --border-color: var(--c-active);
}

.radio input:checked {
  --border-width: 6.75px;
}
.radio input + svg {
  --top-y: 0;
  --dot-y: -17px;
  --drop-y: -14px;
  --top-s-x: 1.75;
  --top-s-y: 1;
}
.radio input + svg .top {
  transform-origin: 12px -12px;
  transform: translateY(var(--top-y)) scale(var(--top-s-x), var(--top-s-y)) translateZ(0);
}
.radio input + svg .dot {
  transform: translateY(var(--dot-y)) translateZ(0);
}
.radio input + svg .drop {
  transform: translateY(var(--drop-y)) translateZ(0);
}

樣式代碼較為復(fù)雜,用到大量的transform屬性。

本實(shí)例中,還包含了多選框(checkbox)和開關(guān)按鈕(switch),它們的設(shè)計(jì)代碼跟單選框(radio)大同小異。

Javascript代碼

本實(shí)例還包含了Javascript代碼,其實(shí)Javascript代碼可有可無,Javascript代碼主要是用來實(shí)現(xiàn)好看的點(diǎn)擊按鈕的過渡效果。

首先需要引用一個(gè)JS庫(kù)文件:gsap.min.js,該文件在源碼壓縮包里。

<script src='gsap.min.js'></script>

單選框(radio)的JS代碼如下:

const { to, set, from, fromTo } = gsap;

const getVar = (key, elem = document.documentElement) => getComputedStyle(elem).getPropertyValue(key);

document.querySelectorAll('.radio').forEach(elem => {
  let svg = elem.querySelector('svg'),
  input = elem.querySelector('input');
  input.addEventListener('change', e => {
    fromTo(input, {
      '--border-width': '3px' },
    {
      '--border-color': getVar('--c-active'),
      '--border-width': '12px',
      duration: .2 });

    to(svg, {
      keyframes: [{
        '--top-y': '6px',
        '--top-s-x': 1,
        '--top-s-y': 1.25,
        duration: .2,
        delay: .2 },
      {
        '--top-y': '0px',
        '--top-s-x': 1.75,
        '--top-s-y': 1,
        duration: .6 }] });


    to(svg, {
      keyframes: [{
        '--dot-y': '2px',
        duration: .3,
        delay: .2 },
      {
        '--dot-y': '0px',
        duration: .3 }] });


    to(svg, {
      '--drop-y': '0px',
      duration: .6,
      delay: .4,
      clearProps: true,
      onComplete() {
        input.removeAttribute('style');
      } });

  });
});

總結(jié)

本文介紹了CSS實(shí)現(xiàn)漂亮的藍(lán)色單選框、復(fù)選框和開關(guān)按鈕,確切來說,是CSS+SVG+JavaScript來實(shí)現(xiàn)的按鈕,但是要知道的是,JavaScript代碼只是用來實(shí)現(xiàn)好看的過渡效果,而非必要代碼。

相關(guān)文章

x
  • 站長(zhǎng)推薦
/* 左側(cè)顯示文章內(nèi)容目錄 */