首页 > 其他分享 >HTML&CSS:雪花飘落邮票动画

HTML&CSS:雪花飘落邮票动画

时间:2025-01-10 13:59:16浏览次数:3  
标签:blue 动画 -- height stamp HTML var 0px CSS

这段代码创建了一个带有动画效果的邮票场景,通过 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>
    <style>
        @import url('https://fonts.googleapis.com/css2?family=Dancing+Script:wght@400..700&family=Inter:ital,opsz,wght@0,14..32,100..900;1,14..32,100..900&display=swap');

        :root {
            --bg: #fffaed;
            --blue: #90c2d1;
            --red: #d14a45;
            --white: #fffaed;
            --brown: #363334;
        }

        body {
            height: 100vh;
            display: flex;
            align-items: center;
            justify-content: center;
            background: var(--bg);
        }

        div.stamp {
            position: relative;
            display: flex;
            align-items: center;
            justify-content: center;
            height: 200px;
            width: 345px;
            background: var(--blue);
        }

        div.stamp::before {
            content: "";
            bottom: 0;
            position: absolute;
        }

        div.stamp::after {
            content: "";
            position: absolute;
            top: 0;
            left: 0;
            height: 20px;
            width: 20px;
            border-radius: 50%;
            background: var(--blue);
            transform: translateY(-12px) translateX(12px);
            box-shadow: 30px 0px var(--blue), 60px 0px var(--blue), 90px 0px var(--blue), 120px 0px var(--blue), 150px 0px var(--blue), 180px 0px var(--blue), 210px 0px var(--blue), 240px 0px var(--blue), 270px 0px var(--blue), 300px 0px var(--blue), 0px 205px var(--blue), 30px 205px var(--blue), 60px 205px var(--blue), 90px 205px var(--blue), 120px 205px var(--blue), 150px 205px var(--blue), 180px 205px var(--blue), 210px 205px var(--blue), 240px 205px var(--blue), 270px 205px var(--blue), 300px 205px var(--blue), -23px 25px var(--blue), -23px 55px var(--blue), -23px 85px var(--blue), -23px 115px var(--blue), -23px 145px var(--blue), -23px 175px var(--blue), 324px 25px var(--blue), 324px 55px var(--blue), 324px 85px var(--blue), 324px 115px var(--blue), 324px 145px var(--blue), 324px 175px var(--blue);
        }

        div.inner-stamp {
            display: flex;
            align-items: flex-end;
            position: relative;
            overflow: hidden;
            background-image: linear-gradient(#27272a, #304259);
            height: 165px;
            width: 310px;
        }

        div.inner-stamp::before {
            content: "来自Hardy的祝福";
            color: var(--white);
            display: flex;
            align-items: center;
            justify-content: center;
            position: absolute;
            font-weight: 400;
            font-family: Inter;
            font-size: 12px;
            width: 310px;
            height: 26px;
            background: var(--red);
            letter-spacing: 3px;
            z-index: 100;
        }

        .house {
            display: flex;
            justify-content: center;
            margin-left: 19px;
            height: 30px;
            margin-bottom: 10px;
            width: 40px;
            background: var(--white);
        }

        .house::before {
            content: "";
            position: absolute;
            bottom: 39px;
            width: 40px;
            height: 25px;
            clip-path: polygon(0 100%, 50% 0, 100% 100%);
            background: var(--white);
            z-index: 2;
        }

        .house::after {
            content: "";
            position: absolute;
            bottom: 40px;
            width: 50px;
            height: 31px;
            clip-path: polygon(0 100%, 50% 0, 100% 100%);
            background: var(--red);
            z-index: 1;
        }

        .window {
            transform: translateY(-10px);
            height: 6.5px;
            width: 5.2px;
            background: var(--brown);
            z-index: 3;
            border-radius: 1px;
            box-shadow: 12px 12px var(--brown), -12px 12px var(--brown), 0px 12px var(--brown), -12px 24px var(--brown), 0px 24px var(--brown), 12px 24px var(--brown);
        }

        .window::before {
            content: "";
            position: absolute;
            width: 12px;
            height: 18px;
            background: var(--red);
            border-radius: 1px;
            z-index: 2;
            transform: translateY(24px) translateX(-2.6px);
        }

        .snow {
            position: absolute;
            background: var(--white);
            border-radius: 50%;
            opacity: .7;
            height: 2px;
            width: 2px;
        }

        span {
            position: absolute;
            top: 10px;
            right: 12px;
            color: var(--white);
            font-size: 18px;
            letter-spacing: 1px;
            font-family: "Dancing Script", cursive;
        }

        span::before {
            content: "";
            position: absolute;
            height: 18px;
            width: 18px;
            border-radius: 50%;
            transform: translateX(-220px) translateY(20px);
            background: var(--white);
            box-shadow: 0 0 14px yellow;
        }

        @media screen and (max-height: 600px) {
            .stamp {
                transform: scale(1.1);
            }
        }
    </style>
</head>

<body>
    <div class='stamp'>
        <div id='innerStamp' class='inner-stamp'>
            <span>你的家乡下雪了吗</span>
            <div class='snow'></div>
            <div class='house'>
                <div class='window'></div>
            </div>
            <div class='house'>
                <div class='window'></div>
            </div>
            <div class='house'>
                <div class='window'></div>
            </div>
            <div class='house'>
                <div class='window'></div>
            </div>
            <div class='house'>
                <div class='window'></div>
            </div>
        </div>
    </div>
    <script>
        innerStamp = document.getElementById("innerStamp");
        for (let i = 0; i < 800; i++) {
            makeSnow();
        }
        function makeSnow() {
            const snow = document.createElement("div");
            snow.classList.add('snow');
            let positionX = Math.random() * (window.innerWidth);
            let positionY = Math.random() * window.innerHeight;
            let speed = Math.random(2);
            snow.style.top = `${positionY}px`;
            snow.style.left = `${positionX}px`;
            function drop() {
                positionY += speed;
                snow.style.top = `${positionY}px`;
                if (positionY > window.innerHeight) {
                    positionY = - 5;
                }
                requestAnimationFrame(drop);
            }
            drop();
            innerStamp.appendChild(snow);
        }
    </script>
</body>

</html>

HTML 结构

  • stamp: 创建一个类名为“stamp”的 div 元素,用于包含整个邮票场景。
  • innerStamp inner-stamp: 包含内部场景的 div 元素,类名为“inner-stamp”。
  • span: 显示文本“你的家乡下雪了吗”。
  • 多个 house 和 window 元素,用于构建房子和窗户。
  • snow: 用于创建雪花效果的 div 元素。

CSS 样式

  • @import url(‘…’);: 导入 Google 字体
  • :root: 定义了一些 CSS 变量,用于页面的背景色、蓝色、红色、白色和棕色。
  • body: 设置页面的高度、显示方式、背景色等。
  • .stamp: 设置邮票的样式,包括尺寸、背景色和定位。
  • .stamp::before 和 .stamp::after: 用于创建邮票的装饰效果,如边框和背景。
  • .inner-stamp: 设置内部场景的样式,包括尺寸、背景渐变和定位。
  • .inner-stamp::before: 用于显示“来自 Hardy 的祝福”文本。
  • .house 和 .window: 用于构建房子和窗户的样式。
  • .snow: 用于创建雪花效果的样式。
  • span: 用于显示文本“你的家乡下雪了吗”及其装饰效果。
  • @media screen and (max-height: 600px): 媒体查询,用于在屏幕高度小于 600px 时调整邮票的尺寸。

JavaScript 部分

  • makeSnow 函数: 创建雪花效果,通过随机生成雪花的位置和速度,并使用 requestAnimationFrame 实现雪花的下落动画。
  • for 循环: 生成 800 个雪花,调用 makeSnow 函数。

标签:blue,动画,--,height,stamp,HTML,var,0px,CSS
From: https://blog.csdn.net/weixin_52814911/article/details/145056695

相关文章

  • manim边做边学--动画更新
    今天介绍Manim中用于动画更新的3个类,分别是:UpdateFromFunc:根据自定义的函数来动态更新Mobject的属性UpdateFromAlphaFunc:根据动画的进度来平滑地改变Mobject的属性MaintainPositionRelativeTo:保持多个Mobject之间的相对位置关系这3个类分别从自定义更新、基于进度的过......
  • HTML+CSS+JS制作中国传统节日主题网站(内附源码,含5个页面)
    一、作品介绍HTML+CSS+JS制作一个中国传统节日主题网站,包含首页、节日介绍页、民俗文化页、节日活动页、联系我们页等5个静态页面。其中每个页面都包含一个导航栏、一个主要区域和一个底部区域。二、页面结构1.顶部横幅区包含传统中国风格的网站标题'中国传统节日',配以传......
  • HTML基础知识笔记
    参考视频:【狂神说Java】HTML5完整教学通俗易懂_哔哩哔哩_bilibili一、基本结构二、基本标签 <h1>:一级标题,通常用于页面的主标题,字体较大且醒目。<h2>:二级标题,用于副标题或主要章节标题,字体稍小于 <h1>。<h3>:三级标题,可用于子章节标题,以此类推,还有 <h4>、<h5>、<h6>......
  • 你真的了解html中的事件绑定吗
    前言:事件的绑定方式主要有两大类:在html中直接绑定和在js中绑定,细分的话可以有三种(js有两种)。函数名或者函数表达式后面紧跟(),则会自动调用。1.内联模式:将函数名直接作为html标签中的属性的属性值-----------这种的缺点是:不符合行为分离的基本规范这种方式叫做内联绑定事件,HTM......
  • HTML深入
    注释将帮助其他人(以及未来的你!)理解代码。在HTML中,注释表达为<!--…-->示例:<!--Paragraphelementbelow--> <p>Thisproductisawesome!</p> 可以使用注释暂时禁用部分代码,使其不被浏览器显示。<!--<button>OK</button>--> HTML是一种不区分大小写的语言。这意味着......
  • 如何在nginx上设置html/json不缓存
    一、简介前端项目发布以后,经常会遇到访问不到最新的版本,这主要是由于我们项目的入口文件index.html被浏览器或者代理缓存了,没有实时拉取到最新文件。本文将介绍一下在nginx上如何设置html文件不缓存。二、Cache-Control介绍2.1服务器可以在响应中使用的标准Cache-Control指......
  • 《前端技术基础》第02章 CSS基础【合集】
    目录......
  • html+Css网页设计库洛米首页
      一、......
  • JS将docx转为html代码--Vue3(简易版)
    这两天突然接了一个把节气文章转成html页面的需求,本来只是需要多按几下ctrl+c,ctrl+v能解决的事,但是想想后续一年24个节气,就做个自动转换的工具吧。由于做软件还涉及到其他语言和配置环境,所以还是选择了web。首先创建一个vue3项目,我用的vite搭建的,不会的请自行移步到vite官网。......
  • HTML+CSS+JS制作中华传统文化主题网站(内附源码,含5个页面)
    一、作品介绍HTML+CSS+JS制作一个中华传统文化主题网站,包含首页、文化艺术页、传统工艺页、文化遗产页、关于我们页等5个静态页面。其中每个页面都包含一个导航栏、一个主要区域和一个底部区域。二、页面结构1.顶部导航区包含网站Logo、主导航菜单(首页、文化分类、活动......