当前位置: 首页 > article >正文

HTMLCSS:打造酷炫下载安装模拟按钮

效果演示

这段代码通过HTML和CSS创建了一个具有交互效果的下载按钮,当复选框被选中时,会触发一系列动画和样式变化,模拟了一个下载和安装的过程,包括圆形的动画、文本的显示和隐藏等。

HTML

<div class="container">
    <label class="label">
        <input type="checkbox" class="input" />
        <span class="circle"><svg class="icon" aria-hidden="true" xmlns="http://www.w3.org/2000/svg" fill="none"
                viewBox="0 0 24 24">
                <path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5"
                    d="M12 19V5m0 14-4-4m4 4 4-4"></path>
            </svg>
            <div class="square"></div>
        </span>
        <p class="title1">Download</p>
        <p class="title1">Open</p>
    </label>
</div>
  • container:外层容器,用于包裹整个组件,设置了一些基本的样式属性如字体、布局等。
  • label:一个标签元素,包含了以下内容:
  • checkbox:一个复选框,用于触发后续的交互效果,初始状态下隐藏。
  • circle:一个圆形容器,内部包含一个 SVG 图标和一个白色正方形,用于表示不同的状态。
  • icon:一个 SVG 图标,路径描述了一个特定的图形,初始状态下显示。
  • square:一个白色正方形,初始状态下隐藏。
  • Download:一个文本标签,表示 “Download”。
  • Open:另一个文本标签,表示 “Open”,初始状态下隐藏。

CSS

.container {
    padding: 0;
    margin: 0;
    box-sizing: border-box;
    font-family: Arial, Helvetica, sans-serif;
    display: flex;
    justify-content: center;
    align-items: center;
}

.label {
    background-color: transparent;
    border: 2px solid rgb(91, 91, 240);
    display: flex;
    align-items: center;
    border-radius: 50px;
    width: 160px;
    cursor: pointer;
    transition: all 0.4s ease;
    padding: 5px;
    position: relative;
}

.label::before {
    content: "";
    position: absolute;
    top: 0;
    bottom: 0;
    left: 0;
    right: 0;
    background-color: #fff;
    width: 8px;
    height: 8px;
    transition: all 0.4s ease;
    border-radius: 100%;
    margin: auto;
    opacity: 0;
    visibility: hidden;
}

.label .input {
    display: none;
}

.label .title1 {
    font-size: 18px;
    color: #fff;
    transition: all 0.4s ease;
    position: absolute;
    right: 18px;
    text-align: center;
}

.label .title1:last-child {
    opacity: 0;
    visibility: hidden;
}

.label .circle {
    height: 45px;
    width: 45px;
    border-radius: 50%;
    background-color: rgb(91, 91, 240);
    display: flex;
    justify-content: center;
    align-items: center;
    transition: all 0.4s ease;
    position: relative;
    box-shadow: 0 0 0 0 rgb(255, 255, 255);
    overflow: hidden;
}

.label .circle .icon {
    color: #fff;
    width: 30px;
    position: absolute;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);
    transition: all 0.4s ease;
}

.label .circle .square {
    aspect-ratio: 1;
    width: 15px;
    border-radius: 2px;
    background-color: #fff;
    opacity: 0;
    visibility: hidden;
    position: absolute;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);
    transition: all 0.4s ease;
}

.label .circle::before {
    content: "";
    position: absolute;
    left: 0;
    top: 0;
    background-color: #3333a8;
    width: 100%;
    height: 0;
    transition: all 0.4s ease;
}

.label:has(.input:checked) {
    width: 57px;
    animation: installed 0.4s ease 3.5s forwards;
}

.label:has(.input:checked)::before {
    animation: rotate 3s ease-in-out 0.4s forwards;
}

.label .input:checked+.circle {
    animation:
        pulse 1s forwards,
        circleDelete 0.2s ease 3.5s forwards;
    rotate: 180deg;
}

.label .input:checked+.circle::before {
    animation: installing 3s ease-in-out forwards;
}

.label .input:checked+.circle .icon {
    opacity: 0;
    visibility: hidden;
}

.label .input:checked~.circle .square {
    opacity: 1;
    visibility: visible;
}

.label .input:checked~.title1 {
    opacity: 0;
    visibility: hidden;
}

.label .input:checked~.title1:last-child {
    animation: showInstalledMessage 0.4s ease 3.5s forwards;
}

@keyframes pulse {
    0% {
        scale: 0.95;
        box-shadow: 0 0 0 0 rgba(255, 255, 255, 0.7);
    }

    70% {
        scale: 1;
        box-shadow: 0 0 0 16px rgba(255, 255, 255, 0);
    }

    100% {
        scale: 0.95;
        box-shadow: 0 0 0 0 rgba(255, 255, 255, 0);
    }
}

@keyframes installing {
    from {
        height: 0;
    }

    to {
        height: 100%;
    }
}

@keyframes rotate {
    0% {
        transform: rotate(-90deg) translate(27px) rotate(0);
        opacity: 1;
        visibility: visible;
    }

    99% {
        transform: rotate(270deg) translate(27px) rotate(270deg);
        opacity: 1;
        visibility: visible;
    }

    100% {
        opacity: 0;
        visibility: hidden;
    }
}

@keyframes installed {
    100% {
        width: 150px;
        border-color: rgb(35, 174, 35);
    }
}

@keyframes circleDelete {
    100% {
        opacity: 0;
        visibility: hidden;
    }
}

@keyframes showInstalledMessage {
    100% {
        opacity: 1;
        visibility: visible;
        right: 56px;
    }
}
  • .container类:padding: 0; margin: 0; box-sizing: border-box;去除默认的内边距和外边距,并使用box-sizing属性确保元素的尺寸计算包括边框和内边距。font-family: Arial, Helvetica, sans-serif;设置字体为 Arial 等通用字体。display: flex; justify-content: center; align-items: center;使容器内部的内容水平和垂直居中。
  • .label类:background-color: transparent;设置背景透明。border: 2px solid rgb(91, 91, 240);设置边框为蓝色。display: flex; align-items: center; border-radius: 50px;设置为弹性布局,使内部元素垂直居中,并设置圆角边框。width: 160px; cursor: pointer; transition: all 0.4s ease;设置初始宽度、鼠标指针为手型,并设置所有属性的过渡效果为 0.4 秒缓动。padding: 5px; position: relative;设置内边距和相对定位,为内部的绝对定位元素提供参考。
  • .label::before伪元素:用于创建一个圆形的元素,初始状态下隐藏,用于后续的动画效果。content: “”; position: absolute; top: 0; bottom: 0; left: 0; right: 0; background-color: #fff; width: 8px; height: 8px; transition: all 0.4s ease; border-radius: 100%; margin: auto; opacity: 0; visibility: hidden;设置绝对定位、白色背景、圆形形状、隐藏状态和过渡效果。
  • .label.input选择器:display: none;隐藏复选框。
  • .label.title1选择器:font-size: 18px; color: #fff; transition: all 0.4s ease; position: absolute;设置文本的字体大小、颜色、过渡效果和绝对定位。.label.title1:last-child表示第二个title1元素,初始状态下隐藏。
  • .label.circle选择器:height: 45px; width: 45px; border-radius: 50%; background-color: rgb(91, 91, 240); display: flex; justify-content: center; align-items: center; transition: all 0.4s ease; position: relative; box-shadow: 0 0 0 0 rgb(255, 255, 255); overflow: hidden;设置圆形的大小、背景颜色、弹性布局、过渡效果、相对定位、阴影和溢出隐藏。
  • .label.circle.icon选择器:color: #fff; width: 30px; position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); transition: all 0.4s ease;设置 SVG 图标的颜色、宽度、绝对定位和过渡效果,使其在圆形中心。
  • .label.circle.square选择器:aspect-ratio: 1; width: 15px; border-radius: 2px; background-color: #fff; opacity: 0; visibility: hidden; position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); transition: all 0.4s ease;设置白色正方形的宽高比、大小、背景颜色、绝对定位、隐藏状态和过渡效果,使其在圆形中心。
  • .label.circle::before伪元素:content: “”; position: absolute; left: 0; top: 0; background-color: #3333a8; width: 100%; height: 0; transition: all 0.4s ease;创建一个覆盖在圆形上的深蓝色元素,初始高度为 0,用于动画效果。
  • 各种动画关键帧定义:@keyframes pulse:定义了一个脉冲动画效果,用于圆形的缩放和阴影变化。@keyframes installing:定义了一个动画,使圆形上方的深蓝色元素从高度为0逐渐变为100%。@keyframes rotate:定义了一个旋转动画,用于隐藏圆形前面的白色圆形元素。@keyframes installed:定义了一个动画,当复选框被选中时,改变标签的宽度和边框颜色。@keyframes circleDelete:定义了一个动画,使圆形隐藏。@keyframes showInstalledMessage:定义了一个动画,显示 “Open” 文本并调整其位置。
  • 基于复选框状态的样式变化:.label:has(.input:checked):当复选框被选中时,改变标签的宽度并应用一个动画。.label:has(.input:checked)::before:当复选框被选中时,应用一个旋转动画给前面的白色圆形元素。.label.input:checked +.circle:当复选框被选中时,对圆形应用多个动画效果,包括脉冲、旋转和最终隐藏。.label.input:checked +.circle::before:当复选框被选中时,应用安装动画给圆形上方的深蓝色元素。.label.input:checked +.circle.icon:当复选框被选中时,隐藏 SVG 图标。.label.input:checked ~.circle.square:当复选框被选中时,显示白色正方形。.label.input:checked ~.title1:当复选框被选中时,隐藏 “Download” 文本。.label.input:checked ~.title1:last-child:当复选框被选中时,显示 “Open” 文本并应用动画调整其位置。

http://www.kler.cn/a/380732.html

相关文章:

  • ComfyUI和Photoshop相结合,PS内实现:文生图,图生图,高清放大,局部重绘,面部修复,设计师福音
  • 软件对象粒度控制与设计模式在其中作用的例子
  • 植被遥感常用反射特征表达
  • Python酷库之旅-第三方库Pandas(193)
  • Android亮屏Job的功耗优化方案
  • 哔哩哔哩车机版2.7.0|专为司机打造的车机版B站,内容丰富,功能齐全
  • 信通院大会:上海斯歌主题演讲《流程自动化到运营自主化》实录分享
  • 【Python】【数据可视化】【商务智能方法与应用】课程 作业一 飞桨AI Studio
  • 商业数据库 - oracle -表空间
  • 华为HarmonyOS借助AR引擎帮助应用实现虚拟与现实交互的能力5-识别平面语义
  • 聊一聊Spring中的@Transactional注解【中】【事务传播特性】
  • 【保姆级教程】使用 oh-my-posh 和 clink 打造个性化 PowerShell 和 CMD
  • vue 使用docx-preview 预览替换文档内的特定变量
  • k8s Service四层负载:服务端口暴露
  • 【OJ题解】在字符串中查找第一个不重复字符的索引
  • WPF-实现多语言的静态(需重启)与动态切换(不用重启)
  • 这款Chrome 插件,帮助任意内容即可生成二维码
  • C语言---文件操作万字详细分析(6)
  • Charles抓包安装
  • 一个最简单的网络编程
  • 【车辆车型识别】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+算法模型
  • git使用的一般流程
  • 一周内从0到1开发一款 AR眼镜 相机应用?
  • 浅谈——深度学习和马尔可夫决策过程
  • bert-base-chinese模型使用教程
  • Linux系统-日志轮询(logrotate)