css神奇妙用

115 阅读8分钟

用css实现一个按钮的效果

css是很神奇的一种东西, 你给它一个模板, 告诉它怎么来, 它就给你一个非常漂亮的效果:

比如实现这种开关的效果:

switch.gif

<label class="switch">
    <div class="round"><input name="onoff" id="onoff" type="checkbox">
        <div class="back"><label for="onoff" class="but"><span class="on">0</span><span class="off">I</span></label></div>
    </div>
</label>

这是html的结构:(本身没有任何生气, 但是使用了css之后, 它的强大的效果就出来了)

input {
  display: none
}
​
.on,.off {
  position: absolute;
  text-align: center;
  text-shadow: inset 1px 1px 1px black;
  width: 100%;
}
​
.on {
  color: #fff;
  top: 10px;
  transition: all 0.1s;
  font-family: sans-serif
}
​
.off {
  color: #636161;
  bottom: 5px;
  transition: all 0.1s;
  transform: scaleY(0.85);
}
​
.but {
  background-color: #000;
  border-radius: 400px 400px 400px 400px / 400px 400px 300px 300px;
  border-bottom-width: 0px;
  box-shadow: inset 8px 6px 5px -7px rgba(0,0,0,1)
    ,inset -8px 6px 5px -7px rgba(0,0,0,1)
    ,inset 0 -3px 2px -2px rgba(200,200,200,.5)
    ,0 3px 3px -2px rgba(0,0,0,1)
    ,inset 0 -230px 60px -200px rgba(255,255,255,.2)
    ,inset 0 220px 40px -200px rgba(0,0,0,.3);
  display: block;
  font-size: 17px;
  height: 60px;
  position: relative;
  transition: all 0.2s;
  width: 40px;
}
​
.back {
  background-color: #000;
  background-image: -webkit-linear-gradient(0deg, transparent 30%, transparent 65%)
    ,-webkit-linear-gradient(0deg, rgba(245, 245, 245, 0) 30%, rgba(150,150,150,.1) 50%, rgba(150,150,150,0) 70%);
  border-radius: 115px;
  box-sizing: border-box;
  height: 85px;
  padding: 4px 4px;
  transition: all 0.2s;
  width: 50px;
}
​
input:checked + .back .on,input:checked + .back .off {
  text-shadow: inset 1px 1px 1px black;
}
​
input:checked + .back .on {
  color: rgb(141, 141, 141);
  top: 10px;
  transform: scaleY(0.85);
}
​
input:checked + .back .off {
  color: #fff;
  bottom: 5px;
  transform: scaleY(1);
}
​
input:checked + .back .but {
  background: #232323;
  background-image: -webkit-radial-gradient(55% 18%,circle closest-corner,rgba(0,0,0,.3) ,rgba(0,0,0,0));
  border-radius: 410px 410px 410px 410px / 310px 310px 410px 410px;
  box-shadow: inset 8px -4px 5px -7px rgba(0,0,0,1)
    ,inset -8px -4px 5px -7px rgba(0,0,0,1)
    , 0 -3px 8px -4px rgba(250,250,250,.4)
    ,inset 0 3px 4px -2px rgba(10,10,10,1)
    ,inset 0 280px 40px -200px rgba(0,0,0,.2)
    ,inset 0 -200px 40px -200px rgba(180,180,180,.2);
  margin-top: 20px;
}
​
input:checked + .back {
  background-image: -webkit-linear-gradient(90deg, black 30%, transparent 65%)
    ,-webkit-linear-gradient(180deg, rgba(250,250,250,0) 0%, rgba(250,250,250,.4) 50%, rgba(150,150,150,0) 100%);
  box-shadow: 28px 28px 28px -28px rgba(0,0,0,.1)
    ,-28px 28px 28px -22px rgba(0,0,0,.1)
    ,0 30px 30px 0px rgba(0,0,0,.2)
    ,inset 0 1px 2px 0 rgba(0,0,0,.6);
  padding: 2px 4px;
}
​
.l,.r {
  margin: 0 auto;
  text-align: center;
}
​
.round,#onoff,.back,.but,.on,.off {
  user-select: none;
}

用css实现一个心型按钮的形状:

love.gif

这种效果也是可以通过html和css来实现的, 我们先来看看html部分的代码:

<div class="love">
  <input id="switch" type="checkbox">
  <label class="love-heart" for="switch">
    <i class="left"></i>
    <i class="right"></i>
    <i class="bottom"></i>
    <div class="round"></div>
  </label>
</div>

来看看css部分的代码:

.love-heart:before,#switch {
 display: none;
}
​
.love-heart, .love-heart::after {
 border-color: hsl(231deg 28% 86%);
 border: 1px solid;
 border-top-left-radius: 100px;
 border-top-right-radius: 100px;
 width: 10px;
 height: 8px;
 border-bottom: 0
}
​
.round {
 position: absolute;
 z-index: 1;
 width: 8px;
 height: 8px;
 background: hsl(0deg 0% 100%);
 box-shadow: rgb(0 0 0 / 24%) 0px 0px 4px 0px;
 border-radius: 100%;
 left: 0px;
 bottom: -1px;
 transition: all .5s ease;
 animation: check-animation2 .5s forwards;
}
​
input:checked + label .round {
 transform: translate(0px, 0px);
 animation: check-animation .5s forwards;
 background-color: hsl(0deg 0% 100%);
}
​
@keyframes check-animation {
 0% {
  transform: translate(0px, 0px);
 }
​
 50% {
  transform: translate(0px, 7px);
 }
​
 100% {
  transform: translate(7px, 7px);
 }
}
​
@keyframes check-animation2 {
 0% {
  transform: translate(7px, 7px);
 }
​
 50% {
  transform: translate(0px, 7px);
 }
​
 100% {
  transform: translate(0px, 0px);
 }
}
​
.love-heart {
 box-sizing: border-box;
 position: relative;
 transform: rotate(-45deg) translate(-50%, -33px) scale(4);
 display: block;
 border-color: hsl(231deg 28% 86%);
 cursor: pointer;
 top: 0;
}
​
input:checked + .love-heart, input:checked + .love-heart::after, input:checked + .love-heart .bottom {
 border-color: hsl(347deg 81% 61%);
 box-shadow: inset 6px -5px 0px 2px hsl(347deg 99% 72%);
}
​
.love-heart::after, .love-heart .bottom {
 content: "";
 display: block;
 box-sizing: border-box;
 position: absolute;
 border-color: hsl(231deg 28% 86%);
}
​
.love-heart::after {
 right: -9px;
 transform: rotate(90deg);
 top: 7px;
}
​
.love-heart .bottom {
 width: 11px;
 height: 11px;
 border-left: 1px solid;
 border-bottom: 1px solid;
 border-color: hsl(231deg 28% 86%);
 left: -1px;
 top: 5px;
 border-radius: 0px 0px 0px 5px;
}
​

非常的美妙? 不是吗?

用css实现一个input输入框的效果:

input.gif

先看看html的结构:

<div class="form-control">
    <input type="value" required="">
    <label>
        <span style="transition-delay:0ms">U</span><span style="transition-delay:50ms">s</span><span style="transition-delay:100ms">e</span><span style="transition-delay:150ms">r</span><span style="transition-delay:200ms">n</span><span style="transition-delay:250ms">a</span><span style="transition-delay:300ms">m</span><span style="transition-delay:350ms">e</span>
    </label>
</div>

在这个结构的基础上, 我们加上css样式:

.form-control {
  position: relative;
  margin: 20px 0 40px;
  width: 190px;
}
​
.form-control input {
  background-color: transparent;
  border: 0;
  border-bottom: 2px #fff solid;
  display: block;
  width: 100%;
  padding: 15px 0;
  font-size: 18px;
  color: #fff;
}
​
.form-control input:focus,
.form-control input:valid {
  outline: 0;
  border-bottom-color: lightblue;
}
​
.form-control label {
  position: absolute;
  top: 15px;
  left: 0;
  pointer-events: none;
}
​
.form-control label span {
  display: inline-block;
  font-size: 18px;
  min-width: 5px;
  color: #fff;
  transition: 0.3s cubic-bezier(0.68, -0.55, 0.265, 1.55);
}
​
.form-control input:focus+label span,
.form-control input:valid+label span {
  color: lightblue;
  transform: translateY(-30px);
}

用css实现一个卡片的效果:

card.gif

上代码:

<div class="flip">
    <div class="content">
        <div class="front">
            <h2>Front</h2>
            <p>Front Description</p>
        </div>
        <div class="back">
            <h2>Back</h2>
            <p>Back Description</p>
        </div>
    </div>
</div>

css部分:

.flip {
  box-shadow: 0 0 10px rgba(128, 128, 128, 0.5);
  padding: 1em;
  width: 190px;
  height: 254px;
  transform-style: preserve-3d;
  transition: 3s ease;
}
​
.flip:hover {
  transform: rotateY(180deg);
}
/* Content */
.flip .content {
  transform-style: preserve-3d;
}
​
.flip .back, .flip .front {
  transform-style: preserve-3d;
  backface-visibility: hidden;
  display: flex;
  flex-direction: column;
}
​
.flip .back {
  transform: rotateY(180deg);
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
}
​
.flip h2,
.flip p {
  transform: translateZ(90px);
  text-shadow: 0 0 3px black;
  text-align: center;
}
​
.flip h2 {
  font-size: 3em;
  color: #fff;
  letter-spacing: 1px;
}
​
.flip p {
  font-size: 1em;
  color: #eee;
  line-height: 1.6em;
}
​
.flip::before,
.flip::after {
  content: "";
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
  position: absolute;
  background-image: linear-gradient(purple, red);
  background-position: center center;
  background-repeat: no-repeat;
  background-size: cover;
  transform: rotateY(180deg)translateZ(1px);
}
​
.flip::before {
  transform: none;
  background-image: linear-gradient(violet, orange);
  background-position: center center;
  background-repeat: no-repeat;
  background-size: cover;
}

用css实现一个加载动画:

loading.gif

html部分:

<div aria-label="Orange and tan hamster running in a metal wheel" role="img" class="wheel-and-hamster">
    <div class="wheel"></div>
    <div class="hamster">
        <div class="hamster__body">
            <div class="hamster__head">
                <div class="hamster__ear"></div>
                <div class="hamster__eye"></div>
                <div class="hamster__nose"></div>
            </div>
            <div class="hamster__limb hamster__limb--fr"></div>
            <div class="hamster__limb hamster__limb--fl"></div>
            <div class="hamster__limb hamster__limb--br"></div>
            <div class="hamster__limb hamster__limb--bl"></div>
            <div class="hamster__tail"></div>
        </div>
    </div>
    <div class="spoke"></div>
</div>

接下来我们来看看css部分:

.wheel-and-hamster {
  --dur: 1s;
  position: relative;
  width: 12em;
  height: 12em;
  font-size: 14px;
}
​
.wheel,
.hamster,
.hamster div,
.spoke {
  position: absolute;
}
​
.wheel,
.spoke {
  border-radius: 50%;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
}
​
.wheel {
  background: radial-gradient(100% 100% at center,hsla(0,0%,60%,0) 47.8%,hsl(0,0%,60%) 48%);
  z-index: 2;
}
​
.hamster {
  animation: hamster var(--dur) ease-in-out infinite;
  top: 50%;
  left: calc(50% - 3.5em);
  width: 7em;
  height: 3.75em;
  transform: rotate(4deg) translate(-0.8em,1.85em);
  transform-origin: 50% 0;
  z-index: 1;
}
​
.hamster__head {
  animation: hamsterHead var(--dur) ease-in-out infinite;
  background: hsl(30,90%,55%);
  border-radius: 70% 30% 0 100% / 40% 25% 25% 60%;
  box-shadow: 0 -0.25em 0 hsl(30,90%,80%) inset,
        0.75em -1.55em 0 hsl(30,90%,90%) inset;
  top: 0;
  left: -2em;
  width: 2.75em;
  height: 2.5em;
  transform-origin: 100% 50%;
}
​
.hamster__ear {
  animation: hamsterEar var(--dur) ease-in-out infinite;
  background: hsl(0,90%,85%);
  border-radius: 50%;
  box-shadow: -0.25em 0 hsl(30,90%,55%) inset;
  top: -0.25em;
  right: -0.25em;
  width: 0.75em;
  height: 0.75em;
  transform-origin: 50% 75%;
}
​
.hamster__eye {
  animation: hamsterEye var(--dur) linear infinite;
  background-color: hsl(0,0%,0%);
  border-radius: 50%;
  top: 0.375em;
  left: 1.25em;
  width: 0.5em;
  height: 0.5em;
}
​
.hamster__nose {
  background: hsl(0,90%,75%);
  border-radius: 35% 65% 85% 15% / 70% 50% 50% 30%;
  top: 0.75em;
  left: 0;
  width: 0.2em;
  height: 0.25em;
}
​
.hamster__body {
  animation: hamsterBody var(--dur) ease-in-out infinite;
  background: hsl(30,90%,90%);
  border-radius: 50% 30% 50% 30% / 15% 60% 40% 40%;
  box-shadow: 0.1em 0.75em 0 hsl(30,90%,55%) inset,
        0.15em -0.5em 0 hsl(30,90%,80%) inset;
  top: 0.25em;
  left: 2em;
  width: 4.5em;
  height: 3em;
  transform-origin: 17% 50%;
  transform-style: preserve-3d;
}
​
.hamster__limb--fr,
.hamster__limb--fl {
  clip-path: polygon(0 0,100% 0,70% 80%,60% 100%,0% 100%,40% 80%);
  top: 2em;
  left: 0.5em;
  width: 1em;
  height: 1.5em;
  transform-origin: 50% 0;
}
​
.hamster__limb--fr {
  animation: hamsterFRLimb var(--dur) linear infinite;
  background: linear-gradient(hsl(30,90%,80%) 80%,hsl(0,90%,75%) 80%);
  transform: rotate(15deg) translateZ(-1px);
}
​
.hamster__limb--fl {
  animation: hamsterFLLimb var(--dur) linear infinite;
  background: linear-gradient(hsl(30,90%,90%) 80%,hsl(0,90%,85%) 80%);
  transform: rotate(15deg);
}
​
.hamster__limb--br,
.hamster__limb--bl {
  border-radius: 0.75em 0.75em 0 0;
  clip-path: polygon(0 0,100% 0,100% 30%,70% 90%,70% 100%,30% 100%,40% 90%,0% 30%);
  top: 1em;
  left: 2.8em;
  width: 1.5em;
  height: 2.5em;
  transform-origin: 50% 30%;
}
​
.hamster__limb--br {
  animation: hamsterBRLimb var(--dur) linear infinite;
  background: linear-gradient(hsl(30,90%,80%) 90%,hsl(0,90%,75%) 90%);
  transform: rotate(-25deg) translateZ(-1px);
}
​
.hamster__limb--bl {
  animation: hamsterBLLimb var(--dur) linear infinite;
  background: linear-gradient(hsl(30,90%,90%) 90%,hsl(0,90%,85%) 90%);
  transform: rotate(-25deg);
}
​
.hamster__tail {
  animation: hamsterTail var(--dur) linear infinite;
  background: hsl(0,90%,85%);
  border-radius: 0.25em 50% 50% 0.25em;
  box-shadow: 0 -0.2em 0 hsl(0,90%,75%) inset;
  top: 1.5em;
  right: -0.5em;
  width: 1em;
  height: 0.5em;
  transform: rotate(30deg) translateZ(-1px);
  transform-origin: 0.25em 0.25em;
}
​
.spoke {
  animation: spoke var(--dur) linear infinite;
  background: radial-gradient(100% 100% at center,hsl(0,0%,60%) 4.8%,hsla(0,0%,60%,0) 5%),
        linear-gradient(hsla(0,0%,55%,0) 46.9%,hsl(0,0%,65%) 47% 52.9%,hsla(0,0%,65%,0) 53%) 50% 50% / 99% 99% no-repeat;
}
​
/* Animations */
@keyframes hamster {
  from, to {
    transform: rotate(4deg) translate(-0.8em,1.85em);
  }
​
  50% {
    transform: rotate(0) translate(-0.8em,1.85em);
  }
}
​
@keyframes hamsterHead {
  from, 25%, 50%, 75%, to {
    transform: rotate(0);
  }
​
  12.5%, 37.5%, 62.5%, 87.5% {
    transform: rotate(8deg);
  }
}
​
@keyframes hamsterEye {
  from, 90%, to {
    transform: scaleY(1);
  }
​
  95% {
    transform: scaleY(0);
  }
}
​
@keyframes hamsterEar {
  from, 25%, 50%, 75%, to {
    transform: rotate(0);
  }
​
  12.5%, 37.5%, 62.5%, 87.5% {
    transform: rotate(12deg);
  }
}
​
@keyframes hamsterBody {
  from, 25%, 50%, 75%, to {
    transform: rotate(0);
  }
​
  12.5%, 37.5%, 62.5%, 87.5% {
    transform: rotate(-2deg);
  }
}
​
@keyframes hamsterFRLimb {
  from, 25%, 50%, 75%, to {
    transform: rotate(50deg) translateZ(-1px);
  }
​
  12.5%, 37.5%, 62.5%, 87.5% {
    transform: rotate(-30deg) translateZ(-1px);
  }
}
​
@keyframes hamsterFLLimb {
  from, 25%, 50%, 75%, to {
    transform: rotate(-30deg);
  }
​
  12.5%, 37.5%, 62.5%, 87.5% {
    transform: rotate(50deg);
  }
}
​
@keyframes hamsterBRLimb {
  from, 25%, 50%, 75%, to {
    transform: rotate(-60deg) translateZ(-1px);
  }
​
  12.5%, 37.5%, 62.5%, 87.5% {
    transform: rotate(20deg) translateZ(-1px);
  }
}
​
@keyframes hamsterBLLimb {
  from, 25%, 50%, 75%, to {
    transform: rotate(20deg);
  }
​
  12.5%, 37.5%, 62.5%, 87.5% {
    transform: rotate(-60deg);
  }
}
​
@keyframes hamsterTail {
  from, 25%, 50%, 75%, to {
    transform: rotate(30deg) translateZ(-1px);
  }
​
  12.5%, 37.5%, 62.5%, 87.5% {
    transform: rotate(10deg) translateZ(-1px);
  }
}
​
@keyframes spoke {
  from {
    transform: rotate(0);
  }
​
  to {
    transform: rotate(-1turn);
  }
}