本篇文章给大家带来的内容是关于如何使用纯CSS实现万圣节的toggle控件(附源码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

效果预览

64beecca1a716fdfb3dbf7fa177afe0a.gif

源代码地址

https://github.com/shanyuhai123/learnCSS/tree/master/0159-halloween-switcher

代码解读

定义容器 halloween-switcher , 通过 checkbox 来实现切换

引入字体, 居中显示:@import url('https://fonts.googleapis.com/css?family=Kodchasan');

* {

font-family: 'Kodchasan';

}

html {

font-size: 20px;

}

body {

width: 100vw;

height: 100vh;

display: flex;

align-items: center;

justify-content: center;

background: #081219;

overflow: hidden;

}

设置实际容器 label 大小.halloween-label {

width: 30rem;

height: 10rem;

border: 3px solid #E56D48;

border-radius: 10rem;

cursor: pointer;

display: flex;

align-items: center;

position: relative;

}

增加两种容器的配色html {

--pumpkin-color: #E56D48;

--vampire-color: #4D7C99;

}

定义 pumpkin-container , vampire-container 容器 及 文字.halloween-input ~ .halloween-label::before,

.halloween-input:checked ~ .halloween-label::before {

position: absolute;

font-size: 2.5rem;

text-transform: uppercase;

}

.halloween-input ~ .halloween-label::before {

content: 'Pumpkin';

color: var(--pumpkin-color);

left: 70%;

transform: translateX(-70%);

}

.halloween-input:checked ~ .halloween-label::before {

content: 'Vampire';

color: var(--vampire-color);

left: 25%;

transform: translateX(-25%);

}

.halloween-input ~ .halloween-label .pumpkin-container,

.halloween-input ~ .halloween-label .vampire-container {

width: 9.5rem;

height: 9.5rem;

border-radius: 50%;

position: absolute;

left: 0.25rem;

overflow: hidden;

}

.halloween-input ~ .halloween-label .pumpkin-container {

background-color: var(--pumpkin-color);

filter: opacity(1);

}

.halloween-input ~ .halloween-label .vampire-container {

background-color: var(--vampire-color);

filter: opacity(0);

}

.halloween-input:checked ~ .halloween-label .pumpkin-container {

left: calc(100% - 0.25rem);

transform: translateX(-100%);

filter: opacity(0);

}

.halloween-input:checked ~ .halloween-label .vampire-container {

left: calc(100% - 0.25rem);

transform: translateX(-100%);

filter: opacity(1);

}

增加 label容器 颜色渐变.halloween-label {

border: 3px solid var(--label-border-color);

transition: .5s ease-in-out;

}

.halloween-label {

--label-border-color: var(--pumpkin-color);

}

.halloween-input:checked ~ .halloween-label {

--label-border-color: var(--vampire-color);

}

pumpkin-container , vampire-container 容器 及 文字

动画效果.halloween-input ~ .halloween-label::before,

.halloween-input:checked ~ .halloween-label::before {

transition: .5s ease;

}

.halloween-input ~ .halloween-label .pumpkin-container,

.halloween-input ~ .halloween-label .vampire-container {

transition: .5s ease;

}

先绘画 pumpkin , 补全 pumpkin-container

新增果肉颜色html {

--pumkin-pulp-color: #330A0F;

}

绘画 pumpkin 的 pumpkin__eyes-n-nose

伪元素画出眼睛.pumpkin__eyes-n-nose {

position: absolute;

top: 20%;

width: 0;

height: 0;

border-style: solid;

border-width: 0 0.8rem 1.6rem 0.8rem;

color: var(--pumpkin-color);

border-bottom-color: var(--pumkin-pulp-color);

background-color: var(--pumkin-pulp-color);

}

.pumpkin__eyes-n-nose::before,

.pumpkin__eyes-n-nose::after {

content: '';

position: absolute;

width: 1rem;

height: 1rem;

background-color: var(--pumkin-pulp-color);

border-radius: 50%;

top: 0.5rem;

left: 0;

}

.pumpkin__eyes-n-nose::before {

margin-left: -3.25rem;

}

.pumpkin__eyes-n-nose::after {

margin-left: 2.25rem;

}

绘画 pumpkin 的 pumpkin__mouth-n-teeths

伪元素画出牙齿.pumpkin__mouth-n-teeths {

position: absolute;

width: 6.5rem;

height: 3.25rem;

bottom: 10%;

background-color: var(--pumkin-pulp-color);

border-radius: 0 0 6.5rem 6.5rem;

}

.pumpkin__mouth-n-teeths::before,

.pumpkin__mouth-n-teeths::after {

content: '';

position: absolute;

height: 0.75rem;

width: 1rem;

background-color: var(--pumpkin-color);

}

.pumpkin__mouth-n-teeths::before {

top: 0;

left: 1.25rem;

}

.pumpkin__mouth-n-teeths::after {

height: 1rem;

bottom: 0;

right: 1.25rem;

}

再绘画 vampire , 补全 vampire-container

利用 伪元素 绘出 vampire-container 的脸.vampire-container::before,

.vampire-container::after {

content: '';

position: absolute;

width: 100%;

height: 100%;

background-color: #c2def2; /* face color */

border-radius: 45% 45% 0 0;

top: 0.75rem;

}

.vampire-container::before {

left: -4rem;

}

.vampire-container::after {

right: -4rem;

}

伪元素绘出 vampire__eyes.vampire__eyes {

top: 20%;

position: absolute;

z-index: 1;

}

.vampire__eyes::before,

.vampire__eyes::after {

content: '';

position: absolute;

width: 1rem;

height: 1rem;

background-color: #d63e49; /* eye-color */

border-radius: 50%;

top: 0.5rem;

left: 0;

}

.vampire__eyes::before {

margin-left: -3.25rem;

}

.vampire__eyes::after {

margin-left: 2.25rem;

}

绘出 vampire__mouth.vampire__mouth {

position: absolute;

width: 6.5rem;

height: 3.25rem;

background-color: var(--pumkin-pulp-color);

bottom: 10%;

border-radius: 0 0 6.5rem 6.5rem;

display: flex;

justify-content: center;

overflow: hidden;

z-index: 1;

}

绘出 vampire__teeths 门牙, 伪元素绘出牙齿.vampire__teeths {

position: absolute;

width: 100%;

height: 1rem;

background-color: #fffae6;

top: -1px;

}

.vampire__teeths::before,

.vampire__teeths::after {

content: '';

position: absolute;

width: 0;

height: 0;

color: transparent;

border-style: solid;

border-width: 0.65rem 0.375rem 0 0.375rem;

border-top-color: #fffae6;

top: 0.95rem;

}

.vampire__teeths::before {

left: 1rem;

}

.vampire__teeths::after {

right: 1rem;

}

绘出 vampire__tongue.vampire__tongue {

position: absolute;

width: 3.5rem;

height: 1.75rem;

background-color: #d63e49;

bottom: -0.75rem;

border-radius: 3.5rem 3.5rem 0 0;

}

再接着把 checkbox 隐藏掉即可.halloween-input {

display: none;

}

增加微笑动画 smile.vampire__teeths {

animation: smile 2s ease-in-out infinite;

}

.vampire__tongue {

animation: smile 3s ease-in-out infinite;

}

@keyframes smile {

50% {

transform: scaleY(1.5);

}

}

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐