HTML&CSS :数字卡片翻转效果

596 阅读7分钟

这个页面实现了一个动态的数字翻转效果,用于显示分钟和秒。HTML 提供了结构,CSS 定义了样式和动画,JavaScript 则通过定时器动态更新数字,实现翻转效果。


大家复制代码时,可能会因格式转换出现错乱,导致样式失效。建议先少量复制代码进行测试,若未能解决问题,私信我,我会发送完整的压缩包给你。

演示效果

HTML&CSS


<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>公众号关注:前端Hardy</title>
    <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
    <style>
        * {
            margin: 0;
            padding: 0;
            box-sizing: border-box;
        }

        a {
            cursor: pointer;
            text-decoration: none;
            color: #ccc;
        }

        a:hover {
            color: #fff;
        }

        ul {
            list-style: none
        }

        html,
        body {
            min-height: 100%;
        }

        body {
            font: normal 11px "Helvetica Neue", Helvetica, sans-serif;
            user-select: none;
            color: #888;
            text-shadow: 0 1px 0 rgba(0, 0, 0, .3);
            background: rgb(150, 150, 150);
            background: -moz-radial-gradient(center, ellipse cover, rgba(150, 150, 150, 1) 0%, rgba(89, 89, 89, 1) 100%);
            background: -webkit-gradient(radial, center center, 0px, center center, 100%, color-stop(0%, rgba(150, 150, 150, 1)), color-stop(100%, rgba(89, 89, 89, 1)));
            background: -webkit-radial-gradient(center, ellipse cover, rgba(150, 150, 150, 1) 0%, rgba(89, 89, 89, 1) 100%);
            background: -o-radial-gradient(center, ellipse cover, rgba(150, 150, 150, 1) 0%, rgba(89, 89, 89, 1) 100%);
            background: -ms-radial-gradient(center, ellipse cover, rgba(150, 150, 150, 1) 0%, rgba(89, 89, 89, 1) 100%);
            background: radial-gradient(ellipse at center, rgba(150, 150, 150, 1) 0%, rgba(89, 89, 89, 1) 100%);
            filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#969696', endColorstr='#595959', GradientType=1);

        }

        .container {
            text-align: center;
            position: absolute;
            left: 50%;
            top: 50%;
            width: 140px;
            height: 90px;
            margin: -45px 0 0 -70px;
        }

        ul.flip {
            position: relative;
            float: left;
            margin: 5px;
            width: 60px;
            height: 90px;
            font-size: 80px;
            font-weight: bold;
            line-height: 87px;
            border-radius: 6px;
            box-shadow: 0 2px 5px rgba(0, 0, 0, .7);
        }

        ul.flip li {
            z-index: 1;
            position: absolute;
            left: 0;
            top: 0;
            width: 100%;
            height: 100%;

        }

        ul.flip li:first-child {
            z-index: 2;
        }

        ul.flip li a {
            display: block;
            height: 100%;
            perspective: 200px;
        }

        ul.flip li a div {
            z-index: 1;
            position: absolute;
            left: 0;
            width: 100%;
            height: 50%;
            overflow: hidden;
        }

        ul.flip li a div .shadow {
            position: absolute;
            width: 100%;
            height: 100%;
            z-index: 2;
        }

        ul.flip li a div.up {
            transform-origin: 50% 100%;
            top: 0;
        }

        ul.flip li a div.up:after {
            content: "";
            position: absolute;
            top: 44px;
            left: 0;
            z-index: 5;
            width: 100%;
            height: 3px;
            background-color: rgba(0, 0, 0, .4);
        }

        ul.flip li a div.down {
            transform-origin: 50% 0%;
            bottom: 0;
        }

        ul.flip li a div div.inn {
            position: absolute;
            left: 0;
            z-index: 1;
            width: 100%;
            height: 200%;
            color: #ccc;
            text-shadow: 0 1px 2px #000;
            text-align: center;
            background-color: #333;
            border-radius: 6px;
        }

        ul.flip li a div.up div.inn {
            top: 0;

        }

        ul.flip li a div.down div.inn {
            bottom: 0;
        }


        body.play ul li.before {
            z-index: 3;
        }

        body.play ul li.active {
            animation: asd .5s .5s linear both;
            z-index: 2;
        }

        @keyframes asd {
            0% {
                z-index: 2;
            }

            5% {
                z-index: 4;
            }

            100% {
                z-index: 4;
            }
        }

        body.play ul li.active .down {
            z-index: 2;
            animation: turn .5s .5s linear both;
        }

        @keyframes turn {
            0% {
                transform: rotateX(90deg);
            }

            100% {
                transform: rotateX(0deg);
            }
        }

        body.play ul li.before .up {
            z-index: 2;
            animation: turn2 .5s linear both;
        }

        @keyframes turn2 {
            0% {
                transform: rotateX(0deg);
            }

            100% {
                transform: rotateX(-90deg);
            }
        }


        body.play ul li.before .up .shadow {
            background: -moz-linear-gradient(top, rgba(0, 0, 0, .1) 0%, rgba(0, 0, 0, 1) 100%);
            background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, rgba(0, 0, 0, .1)), color-stop(100%, rgba(0, 0, 0, 1)));
            background: linear-gradient(top, rgba(0, 0, 0, .1) 0%, rgba(0, 0, 0, 1) 100%);
            background: -o-linear-gradient(top, rgba(0, 0, 0, .1) 0%, rgba(0, 0, 0, 1) 100%);
            background: -ms-linear-gradient(top, rgba(0, 0, 0, .1) 0%, rgba(0, 0, 0, 1) 100%);
            background: linear-gradient(to bottom, rgba(0, 0, 0, .1) 0%, rgba(0, 0, 0, 1) 100%);
            animation: show .5s linear both;
        }

        body.play ul li.active .up .shadow {
            background: -moz-linear-gradient(top, rgba(0, 0, 0, .1) 0%, rgba(0, 0, 0, 1) 100%);
            background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, rgba(0, 0, 0, .1)), color-stop(100%, rgba(0, 0, 0, 1)));
            background: linear-gradient(top, rgba(0, 0, 0, .1) 0%, rgba(0, 0, 0, 1) 100%);
            background: -o-linear-gradient(top, rgba(0, 0, 0, .1) 0%, rgba(0, 0, 0, 1) 100%);
            background: -ms-linear-gradient(top, rgba(0, 0, 0, .1) 0%, rgba(0, 0, 0, 1) 100%);
            background: linear-gradient(to bottom, rgba(0, 0, 0, .1) 0%, rgba(0, 0, 0, 1) 100%);
            animation: hide .5s .3s linear both;
        }

        body.play ul li.before .down .shadow {
            background: -moz-linear-gradient(top, rgba(0, 0, 0, 1) 0%, rgba(0, 0, 0, .1) 100%);
            background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, rgba(0, 0, 0, 1)), color-stop(100%, rgba(0, 0, 0, .1)));
            background: linear-gradient(top, rgba(0, 0, 0, 1) 0%, rgba(0, 0, 0, .1) 100%);
            background: -o-linear-gradient(top, rgba(0, 0, 0, 1) 0%, rgba(0, 0, 0, .1) 100%);
            background: -ms-linear-gradient(top, rgba(0, 0, 0, 1) 0%, rgba(0, 0, 0, .1) 100%);
            background: linear-gradient(to bottom, rgba(0, 0, 0, 1) 0%, rgba(0, 0, 0, .1) 100%);
            animation: show .5s linear both;
        }

        body.play ul li.active .down .shadow {
            background: -moz-linear-gradient(top, rgba(0, 0, 0, 1) 0%, rgba(0, 0, 0, .1) 100%);
            background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, rgba(0, 0, 0, 1)), color-stop(100%, rgba(0, 0, 0, .1)));
            background: linear-gradient(top, rgba(0, 0, 0, 1) 0%, rgba(0, 0, 0, .1) 100%);
            background: -o-linear-gradient(top, rgba(0, 0, 0, 1) 0%, rgba(0, 0, 0, .1) 100%);
            background: -ms-linear-gradient(top, rgba(0, 0, 0, 1) 0%, rgba(0, 0, 0, .1) 100%);
            background: linear-gradient(to bottom, rgba(0, 0, 0, 1) 0%, rgba(0, 0, 0, .1) 100%);
            animation: hide .5s .3s linear both;
        }

        @keyframes show {
            0% {
                opacity: 0;
            }

            100% {
                opacity: 1;
            }
        }

        @keyframes hide {
            0% {
                opacity: 1;
            }

            100% {
                opacity: 0;
            }
        }
    </style>
</head>

<body>

    <div class="container">
        <ul class="flip minutePlay">
            <li>
                <a href="#">
                    <div class="up">
                        <div class="shadow"></div>
                        <div class="inn">0</div>
                    </div>
                    <div class="down">
                        <div class="shadow"></div>
                        <div class="inn">0</div>
                    </div>
                </a>
            </li>
            <li>
                <a href="#">
                    <div class="up">
                        <div class="shadow"></div>
                        <div class="inn">1</div>
                    </div>
                    <div class="down">
                        <div class="shadow"></div>
                        <div class="inn">1</div>
                    </div>
                </a>
            </li>
            <li>
                <a href="#">
                    <div class="up">
                        <div class="shadow"></div>
                        <div class="inn">2</div>
                    </div>
                    <div class="down">
                        <div class="shadow"></div>
                        <div class="inn">2</div>
                    </div>
                </a>
            </li>
            <li>
                <a href="#">
                    <div class="up">
                        <div class="shadow"></div>
                        <div class="inn">3</div>
                    </div>
                    <div class="down">
                        <div class="shadow"></div>
                        <div class="inn">3</div>
                    </div>
                </a>
            </li>
            <li>
                <a href="#">
                    <div class="up">
                        <div class="shadow"></div>
                        <div class="inn">4</div>
                    </div>
                    <div class="down">
                        <div class="shadow"></div>
                        <div class="inn">4</div>
                    </div>
                </a>
            </li>
            <li>
                <a href="#">
                    <div class="up">
                        <div class="shadow"></div>
                        <div class="inn">5</div>
                    </div>
                    <div class="down">
                        <div class="shadow"></div>
                        <div class="inn">5</div>
                    </div>
                </a>
            </li>
        </ul>
        <ul class="flip secondPlay">
            <li>
                <a href="#">
                    <div class="up">
                        <div class="shadow"></div>
                        <div class="inn">0</div>
                    </div>
                    <div class="down">
                        <div class="shadow"></div>
                        <div class="inn">0</div>
                    </div>
                </a>
            </li>
            <li>
                <a href="#">
                    <div class="up">
                        <div class="shadow"></div>
                        <div class="inn">1</div>
                    </div>
                    <div class="down">
                        <div class="shadow"></div>
                        <div class="inn">1</div>
                    </div>
                </a>
            </li>
            <li>
                <a href="#">
                    <div class="up">
                        <div class="shadow"></div>
                        <div class="inn">2</div>
                    </div>
                    <div class="down">
                        <div class="shadow"></div>
                        <div class="inn">2</div>
                    </div>
                </a>
            </li>
            <li>
                <a href="#">
                    <div class="up">
                        <div class="shadow"></div>
                        <div class="inn">3</div>
                    </div>
                    <div class="down">
                        <div class="shadow"></div>
                        <div class="inn">3</div>
                    </div>
                </a>
            </li>
            <li>
                <a href="#">
                    <div class="up">
                        <div class="shadow"></div>
                        <div class="inn">4</div>
                    </div>
                    <div class="down">
                        <div class="shadow"></div>
                        <div class="inn">4</div>
                    </div>
                </a>
            </li>
            <li>
                <a href="#">
                    <div class="up">
                        <div class="shadow"></div>
                        <div class="inn">5</div>
                    </div>
                    <div class="down">
                        <div class="shadow"></div>
                        <div class="inn">5</div>
                    </div>
                </a>
            </li>
            <li>
                <a href="#">
                    <div class="up">
                        <div class="shadow"></div>
                        <div class="inn">6</div>
                    </div>
                    <div class="down">
                        <div class="shadow"></div>
                        <div class="inn">6</div>
                    </div>
                </a>
            </li>
            <li>
                <a href="#">
                    <div class="up">
                        <div class="shadow"></div>
                        <div class="inn">7</div>
                    </div>
                    <div class="down">
                        <div class="shadow"></div>
                        <div class="inn">7</div>
                    </div>
                </a>
            </li>
            <li>
                <a href="#">
                    <div class="up">
                        <div class="shadow"></div>
                        <div class="inn">8</div>
                    </div>
                    <div class="down">
                        <div class="shadow"></div>
                        <div class="inn">8</div>
                    </div>
                </a>
            </li>
            <li>
                <a href="#">
                    <div class="up">
                        <div class="shadow"></div>
                        <div class="inn">9</div>
                    </div>
                    <div class="down">
                        <div class="shadow"></div>
                        <div class="inn">9</div>
                    </div>
                </a>
            </li>
        </ul>
    </div>
    <script>
        setInterval(function () {
            secondPlay()
        }, 1000);


        setInterval(function () {
            minutePlay()
        }, 10000);


        function secondPlay() {
            $("body").removeClass("play");
            var aa = $("ul.secondPlay li.active");

            if (aa.html() == undefined) {
                aa = $("ul.secondPlay li").eq(0);
                aa.addClass("before")
                    .removeClass("active")
                    .next("li")
                    .addClass("active")
                    .closest("body")
                    .addClass("play");

            }
            else if (aa.is(":last-child")) {
                $("ul.secondPlay li").removeClass("before");
                aa.addClass("before").removeClass("active");
                aa = $("ul.secondPlay li").eq(0);
                aa.addClass("active")
                    .closest("body")
                    .addClass("play");
            }
            else {
                $("ul.secondPlay li").removeClass("before");
                aa.addClass("before")
                    .removeClass("active")
                    .next("li")
                    .addClass("active")
                    .closest("body")
                    .addClass("play");
            }

        }

        function minutePlay() {
            $("body").removeClass("play");
            var aa = $("ul.minutePlay li.active");

            if (aa.html() == undefined) {
                aa = $("ul.minutePlay li").eq(0);
                aa.addClass("before")
                    .removeClass("active")
                    .next("li")
                    .addClass("active")
                    .closest("body")
                    .addClass("play");

            }
            else if (aa.is(":last-child")) {
                $("ul.minutePlay li").removeClass("before");
                aa.addClass("before").removeClass("active");
                aa = $("ul.minutePlay li").eq(0);
                aa.addClass("active")
                    .closest("body")
                    .addClass("play");
            }
            else {
                $("ul.minutePlay li").removeClass("before");
                aa.addClass("before")
                    .removeClass("active")
                    .next("li")
                    .addClass("active")
                    .closest("body")
                    .addClass("play");
            }

        }
    </script>
</body>

</html>

HTML 结构

  • container:页面的核心容器,居中显示,包含两个翻转效果的数字列表(分钟和秒)。
  • flip minutePlay 和 flip secondPlay:分别用于显示分钟和秒的数字。每个li表示一个数字,包含两个部分:up 和 down,分别表示数字的上半部分和下半部分。每个数字的上下部分都有一个 shadow 用于显示阴影,以及一个 inn用于显示数字内容

CSS 样式

  • *:重置所有元素的外边距和内边距,并设置 box-sizing 为 border-box。
  • body:设置了背景颜色和渐变效果,定义了字体样式、颜色和阴影。
  • a 和 a:hover:定义了链接的样式,鼠标悬停时颜色变化。
  • .container:将容器居中显示,设置为绝对定位。
  • ul.flip:定义了翻转数字的容器样式,包括宽度、高度、字体大小和阴影。
  • ul.flip li:每个数字的样式,绝对定位,覆盖整个父容器。
  • ul.flip li a:为每个数字添加了 perspective(透视效果),使翻转动画更立体。
  • ul.flip li a div:定义了数字上下部分的样式,包括 transform-origin(旋转轴)。
  • ul.flip li a div.up 和 ul.flip li a div.down:分别定义了数字的上半部分和下半部分的样式。
  • ul.flip li a div div.inn:定义了数字内容的样式,包括背景颜色、圆角和阴影。
  • @keyframes asd:定义了数字翻转时的层级变化。
  • @keyframes turn 和 @keyframes turn2:定义了数字上下部分的翻转动画。
  • @keyframes show 和 @keyframes hide:定义了阴影的显示和隐藏动画。

JavaScript部分

secondPlay() 和 minutePlay()

  • 这两个函数分别用于更新秒和分钟的值。
  • 每次调用时,会移除当前激活的数字(active 类),并将其设置为“之前”状态(before 类)。
  • 然后将下一个数字设置为激活状态(active 类),并触发翻转动画。
  • 如果当前数字是最后一个,会循环回到第一个数字。

setInterval

  • 每秒调用一次 secondPlay(),每 10 秒调用一次 minutePlay(),实现动态更新。

各位互联网搭子,要是这篇文章成功引起了你的注意,别犹豫,关注、点赞、评论、分享走一波,让我们把这份默契延续下去,一起在知识的海洋里乘风破浪!