CSS效果之翻书效果

代码来自 https://github.com/Aaronliu2016/css-tricks


<!-- run -->
<style>
.image-preloader {
  position: fixed;
  animation: preLoad 1s steps(1);
  width: 1px;
  height: 1px;
}
@keyframes preLoad {
  0% {
    background-image: url('https://picsum.photos/420/300?random=1');
  }
  10% {
    background-image: url('https://picsum.photos/420/300?random=2');
  }
  20% {
    background-image: url('https://picsum.photos/420/300?random=3');
  }
  30% {
    background-image: url('https://picsum.photos/420/300?random=4');
  }
  40% {
    background-image: url('https://picsum.photos/420/300?random=5');
  }
  100% {
    display: none;
  }
}

.container {
  position: relative;
  width: 420px;
  height: 420px;
  margin-left: 50px;
  border: #fff solid 2px;
  border-radius: 4px;
}

.title {
  position: absolute;
  top: 45px;
  left: 0;
  width: 100%;
  font-size: 2em;
  font-weight: normal;
  line-height: 1;
}

.book {
  position: relative;
  perspective: 630px;
  perspective-origin: center 50px;
  transform: scale(1.2);
  filter: drop-shadow(0 10px 5px rgba(0, 0, 0, 0.25));
}

.page {
  width: 210px;
  height: 300px;
  background-color: #bbb;
  position: absolute;
  top: 0%;
  right: 50%;
  border: solid 2px #555;
  transform-origin: 100% 100%;
  background-size: 420px 300px;
  background-position: center;
  transform-style: preserve-3d;
}

.page:nth-child(1) {
  transform: rotateX(60deg) rotateY(3deg);
}

.page:nth-child(2) {
  transform: rotateX(60deg) rotateY(4.5deg);
}

.page:nth-child(3) {
  transform: rotateX(60deg) rotateY(6deg);
  animation: nextPage 25s infinite -24s steps(1);
  background-size: 420px 300px;
  background-position: -2px -2px;
}

.page:nth-child(4) {
  transform: rotateX(60deg) rotateY(177deg);
}

.page:nth-child(5) {
  transform: rotateX(60deg) rotateY(175.5deg);
}

.page:nth-child(6) {
  transform: rotateX(60deg) rotateY(174deg);
  overflow: hidden;
}

.page:nth-child(6)::after {
  content: '';
  width: 210px;
  height: 300px;
  position: absolute;
  top: 0;
  right: 0;
  transform-origin: center;
  transform: rotateY(180deg);
  animation: nextPage 25s -20s infinite steps(1);
  background-size: 420px 300px;
  background-position: 100% -2px;
}

@keyframes nextPage {
  0% {
    background-image: url('https://picsum.photos/420/300?random=1');
  }

  20% {
    background-image: url('https://picsum.photos/420/300?random=2');
  }

  40% {
    background-image: url('https://picsum.photos/420/300?random=3');
  }

  60% {
    background-image: url('https://picsum.photos/420/300?random=4');
  }

  80% {
    background-image: url('https://picsum.photos/420/300?random=5');
  }
}

.gap {
  width: 10px;
  height: 300px;
  background: none;
  transform: rotateX(60deg);
  transform-origin: bottom;
  position: absolute;
  top: 0%;
  left: calc(50% - 5px);
}

.gap::after {
  content: '';
  position: absolute;
  bottom: 0;
  left: 50%;
  transform: translate(-50%, 50%);
  background-color: #555;
  width: 10px;
  height: 5px;
  border-radius: 50%;
}

.pages,
.flips {
  transform-style: preserve-3d;
}

.flip {
  width: 32px;
  height: 300px;
  position: absolute;
  top: 0px;
  transform-origin: 100% 100%;
  right: 100%;
  border: solid #555;
  border-width: 2px 0px;
  perspective: 4200px;
  perspective-origin: center;
  transform-style: preserve-3d;
  background-size: 420px 300px;
}

.flip::after {
  content: '';
  position: absolute;
  top: 0;
  right: 0%;
  width: 100%;
  height: 100%;
  transform-origin: center;
  background-size: 420px 300px;
}

.flip.flip1 {
  right: 50%;
  animation: flip1 5s infinite ease-in-out;
  border-width: 2px 2px 2px 0px;
}

.flip.flip1::after {
  animation: nextFlip1 25s -20s infinite steps(1);
}

.flip:not(.flip1) {
  right: calc(100% - 2px);
  top: -2px;
  transform-origin: right;
  animation: flip2 5s infinite ease-in-out;
}

.flip.flip2::after {
  animation: nextFlip2 25s -20s infinite steps(1);
}

.flip.flip3::after {
  animation: nextFlip3 25s -20s infinite steps(1);
}

.flip.flip4::after {
  animation: nextFlip4 25s -20s infinite steps(1);
}

.flip.flip5::after {
  animation: nextFlip5 25s -20s infinite steps(1);
}

.flip.flip6::after {
  animation: nextFlip6 25s -20s infinite steps(1);
}

.flip.flip7::after {
  animation: nextFlip7 25s -20s infinite steps(1);
}

.flip.flip7 {
  width: 30px;
  border-width: 2px 0px 2px 2px;
}

@keyframes flip1 {

  0%,
  20% {
    transform: rotateX(60deg) rotateY(6deg)
  }

  80%,
  100% {
    transform: rotateX(60deg) rotateY(174deg)
  }
}

@keyframes flip2 {

  0%,
  20% {
    transform: rotateY(0deg) translateY(0px)
  }

  50% {
    transform: rotateY(-15deg) translateY(0px)
  }
}

@keyframes nextFlip1 {
  0% {
    background-image: url("https://picsum.photos/420/300?random=1");
    background-position: -178px -2px;
    transform: rotateY(0deg);
  }

  10% {
    background-image: url("https://picsum.photos/420/300?random=2");
    background-position: -210px -2px;
    transform: rotateY(180deg);
  }

  20% {
    background-image: url("https://picsum.photos/420/300?random=2");
    background-position: -178px -2px;
    transform: rotateY(0deg);
  }

  30% {
    background-image: url("https://picsum.photos/420/300?random=3");
    background-position: -210px -2px;
    transform: rotateY(180deg);
  }

  40% {
    background-image: url("https://picsum.photos/420/300?random=3");
    background-position: -178px -2px;
    transform: rotateY(0deg);
  }

  50% {
    background-image: url("https://picsum.photos/420/300?random=4");
    background-position: -210px -2px;
    transform: rotateY(180deg);
  }

  60% {
    background-image: url("https://picsum.photos/420/300?random=4");
    background-position: -178px -2px;
    transform: rotateY(0deg);
  }

  70% {
    background-image: url("https://picsum.photos/420/300?random=5");
    background-position: -210px -2px;
    transform: rotateY(180deg);
  }

  80% {
    background-image: url("https://picsum.photos/420/300?random=5");
    background-position: -178px -2px;
    transform: rotateY(0deg);
  }

  90% {
    background-image: url("https://picsum.photos/420/300?random=1");
    background-position: -210px -2px;
    transform: rotateY(180deg);
  }
}

@keyframes nextFlip2 {
  0% {
    background-image: url("https://picsum.photos/420/300?random=1");
    background-position: -148px -2px;
    transform: rotateY(0deg);
  }

  10.5% {
    background-image: url("https://picsum.photos/420/300?random=2");
    background-position: -238px -2px;
    transform: rotateY(180deg);
  }

  20% {
    background-image: url("https://picsum.photos/420/300?random=2");
    background-position: -148px -2px;
    transform: rotateY(0deg);
  }

  30.5% {
    background-image: url("https://picsum.photos/420/300?random=3");
    background-position: -238px -2px;
    transform: rotateY(180deg);
  }

  40% {
    background-image: url("https://picsum.photos/420/300?random=3");
    background-position: -148px -2px;
    transform: rotateY(0deg);
  }

  50.5% {
    background-image: url("https://picsum.photos/420/300?random=4");
    background-position: -238px -2px;
    transform: rotateY(180deg);
  }

  60% {
    background-image: url("https://picsum.photos/420/300?random=4");
    background-position: -148px -2px;
    transform: rotateY(0deg);
  }

  70.5% {
    background-image: url("https://picsum.photos/420/300?random=5");
    background-position: -238px -2px;
    transform: rotateY(180deg);
  }

  80% {
    background-image: url("https://picsum.photos/420/300?random=5");
    background-position: -148px -2px;
    transform: rotateY(0deg);
  }

  90.5% {
    background-image: url("https://picsum.photos/420/300?random=1");
    background-position: -238px -2px;
    transform: rotateY(180deg);
  }
}

@keyframes nextFlip3 {
  0% {
    background-image: url("https://picsum.photos/420/300?random=1");
    background-position: -118px -2px;
    transform: rotateY(0deg);
  }

  11% {
    background-image: url("https://picsum.photos/420/300?random=2");
    background-position: -268px -2px;
    transform: rotateY(180deg);
  }

  20% {
    background-image: url("https://picsum.photos/420/300?random=2");
    background-position: -118px -2px;
    transform: rotateY(0deg);
  }

  31% {
    background-image: url("https://picsum.photos/420/300?random=3");
    background-position: -268px -2px;
    transform: rotateY(180deg);
  }

  40% {
    background-image: url("https://picsum.photos/420/300?random=3");
    background-position: -118px -2px;
    transform: rotateY(0deg);
  }

  51% {
    background-image: url("https://picsum.photos/420/300?random=4");
    background-position: -268px -2px;
    transform: rotateY(180deg);
  }

  60% {
    background-image: url("https://picsum.photos/420/300?random=4");
    background-position: -118px -2px;
    transform: rotateY(0deg);
  }

  71% {
    background-image: url("https://picsum.photos/420/300?random=5");
    background-position: -268px -2px;
    transform: rotateY(180deg);
  }

  80% {
    background-image: url("https://picsum.photos/420/300?random=5");
    background-position: -118px -2px;
    transform: rotateY(0deg);
  }

  91% {
    background-image: url("https://picsum.photos/420/300?random=1");
    background-position: -268px -2px;
    transform: rotateY(180deg);
  }
}

@keyframes nextFlip4 {
  0% {
    background-image: url("https://picsum.photos/420/300?random=1");
    background-position: -88px -2px;
    transform: rotateY(0deg);
  }

  11.5% {
    background-image: url("https://picsum.photos/420/300?random=2");
    background-position: -298px -2px;
    transform: rotateY(180deg);
  }

  20% {
    background-image: url("https://picsum.photos/420/300?random=2");
    background-position: -88px -2px;
    transform: rotateY(0deg);
  }

  31.5% {
    background-image: url("https://picsum.photos/420/300?random=3");
    background-position: -298px -2px;
    transform: rotateY(180deg);
  }

  40% {
    background-image: url("https://picsum.photos/420/300?random=3");
    background-position: -88px -2px;
    transform: rotateY(0deg);
  }

  51.5% {
    background-image: url("https://picsum.photos/420/300?random=4");
    background-position: -298px -2px;
    transform: rotateY(180deg);
  }

  60% {
    background-image: url("https://picsum.photos/420/300?random=4");
    background-position: -88px -2px;
    transform: rotateY(0deg);
  }

  71.5% {
    background-image: url("https://picsum.photos/420/300?random=5");
    background-position: -298px -2px;
    transform: rotateY(180deg);
  }

  80% {
    background-image: url("https://picsum.photos/420/300?random=5");
    background-position: -88px -2px;
    transform: rotateY(0deg);
  }

  91.5% {
    background-image: url("https://picsum.photos/420/300?random=1");
    background-position: -298px -2px;
    transform: rotateY(180deg);
  }
}

@keyframes nextFlip5 {
  0% {
    background-image: url("https://picsum.photos/420/300?random=1");
    background-position: -58px -2px;
    transform: rotateY(0deg);
  }

  12% {
    background-image: url("https://picsum.photos/420/300?random=2");
    background-position: -328px -2px;
    transform: rotateY(180deg);
  }

  20% {
    background-image: url("https://picsum.photos/420/300?random=2");
    background-position: -58px -2px;
    transform: rotateY(0deg);
  }

  32% {
    background-image: url("https://picsum.photos/420/300?random=3");
    background-position: -328px -2px;
    transform: rotateY(180deg);
  }

  40% {
    background-image: url("https://picsum.photos/420/300?random=3");
    background-position: -58px -2px;
    transform: rotateY(0deg);
  }

  52% {
    background-image: url("https://picsum.photos/420/300?random=4");
    background-position: -328px -2px;
    transform: rotateY(180deg);
  }

  60% {
    background-image: url("https://picsum.photos/420/300?random=4");
    background-position: -58px -2px;
    transform: rotateY(0deg);
  }

  72% {
    background-image: url("https://picsum.photos/420/300?random=5");
    background-position: -328px -2px;
    transform: rotateY(180deg);
  }

  80% {
    background-image: url("https://picsum.photos/420/300?random=5");
    background-position: -58px -2px;
    transform: rotateY(0deg);
  }

  92% {
    background-image: url("https://picsum.photos/420/300?random=1");
    background-position: -328px -2px;
    transform: rotateY(180deg);
  }
}

@keyframes nextFlip6 {
  0% {
    background-image: url("https://picsum.photos/420/300?random=1");
    background-position: -28px -2px;
    transform: rotateY(0deg);
  }

  12.5% {
    background-image: url("https://picsum.photos/420/300?random=2");
    background-position: -358px -2px;
    transform: rotateY(180deg);
  }

  20% {
    background-image: url("https://picsum.photos/420/300?random=2");
    background-position: -28px -2px;
    transform: rotateY(0deg);
  }

  32.5% {
    background-image: url("https://picsum.photos/420/300?random=3");
    background-position: -358px -2px;
    transform: rotateY(180deg);
  }

  40% {
    background-image: url("https://picsum.photos/420/300?random=3");
    background-position: -28px -2px;
    transform: rotateY(0deg);
  }

  52.5% {
    background-image: url("https://picsum.photos/420/300?random=4");
    background-position: -358px -2px;
    transform: rotateY(180deg);
  }

  60% {
    background-image: url("https://picsum.photos/420/300?random=4");
    background-position: -28px -2px;
    transform: rotateY(0deg);
  }

  72.5% {
    background-image: url("https://picsum.photos/420/300?random=5");
    background-position: -358px -2px;
    transform: rotateY(180deg);
  }

  80% {
    background-image: url("https://picsum.photos/420/300?random=5");
    background-position: -28px -2px;
    transform: rotateY(0deg);
  }

  92.5% {
    background-image: url("https://picsum.photos/420/300?random=1");
    background-position: -358px -2px;
    transform: rotateY(180deg);
  }
}

@keyframes nextFlip7 {
  0% {
    background-image: url("https://picsum.photos/420/300?random=1");
    background-position: -2px -2px;
    transform: rotateY(0deg);
  }

  13% {
    background-image: url("https://picsum.photos/420/300?random=2");
    background-position: -388px -2px;
    transform: rotateY(180deg);
  }

  20% {
    background-image: url("https://picsum.photos/420/300?random=2");
    background-position: -2px -2px;
    transform: rotateY(0deg);
  }

  33% {
    background-image: url("https://picsum.photos/420/300?random=3");
    background-position: -388px -2px;
    transform: rotateY(180deg);
  }

  40% {
    background-image: url("https://picsum.photos/420/300?random=3");
    background-position: -2px -2px;
    transform: rotateY(0deg);
  }

  53% {
    background-image: url("https://picsum.photos/420/300?random=4");
    background-position: -388px -2px;
    transform: rotateY(180deg);
  }

  60% {
    background-image: url("https://picsum.photos/420/300?random=4");
    background-position: -2px -2px;
    transform: rotateY(0deg);
  }

  73% {
    background-image: url("https://picsum.photos/420/300?random=5");
    background-position: -388px -2px;
    transform: rotateY(180deg);
  }

  80% {
    background-image: url("https://picsum.photos/420/300?random=5");
    background-position: -2px -2px;
    transform: rotateY(0deg);
  }

  93% {
    background-image: url("https://picsum.photos/420/300?random=1");
    background-position: -388px -2px;
    transform: rotateY(180deg);
  }
}
</style>

 <div class="image-preloader"></div>
  <div class="container">
    <h1 class="title">清风不识字,何故乱翻书</h1>
    <div class="book">
      <div class="gap"></div>
      <div class="pages">
        <div class="page"></div>
        <div class="page"></div>
        <div class="page"></div>
        <div class="page"></div>
        <div class="page"></div>
        <div class="page"></div>
      </div>
      <div class="flips">
        <div class="flip flip1">
          <div class="flip flip2">
            <div class="flip flip3">
              <div class="flip flip4">
                <div class="flip flip5">
                  <div class="flip flip6">
                    <div class="flip flip7"></div>
                  </div>
                </div>
              </div>
            </div>
          </div>
        </div>
      </div>
    </div>
  </div>
posted @ 2022-11-02 20:06  CoderWGB  阅读(444)  评论(0)    收藏  举报