CSS 之 跑马灯边框

news2025/1/13 10:30:53

一、简介

​ 之前有做过渐变色边框的样式,然后某天刷抖🎵,看到某个老师在讲跑马灯的样式效果,于是就自己尝试实现一下跑马灯样式的边框,虽然这种样式并不常见(基本没卵用),其使用场景我至今没想到,但是它足够花里胡哨,玩的就是花活。CSS才是前端最难精通的技术,也是前端对于后端最大的技术难点。以后可不敢在简历上写精通、熟练CSS了,最多写个见过CSS就可以了。

​ 经过一番实践,我实现了两种形态的跑马灯样式边框,其效果如下图所示。其主要使用的CSS属性有:overflowpositiontransform animation@keyframes以及::after::before等等。

案例效果:

在这里插入图片描述

二、具体代码

1、首尾不相连的跑马灯边框
实现思路:

border属性本身肯定是实现不了跑马灯的效果,因为其不能变化。因此我们就要想别的办法来实现边框的样式。实现方法:

​ ① 利用padding属性使元素的内容区域与最外层之间形成一个间隔。

​ ② 利用伪元素::after position,将该伪元素模拟为元素的内容区域,并设置背景颜色和圆角等样式,此时我们就实现了一个有透明边框的元素了,padding区域就是边框区域。

​ ③ 利用伪元素::before定义一个具有渐变色背景的伪元素,然后通过动画使其围绕元素的中心点旋转。该伪元素的渐变背景决定了跑马灯边框的颜色。

​ ④设置元素的overflow: hidden;,隐藏伪元素::before在旋转时,超出元素的部分,并通过设置层级,使伪元素::after 覆盖在伪元素::before之上。这样旋转的伪元素::before就只能在padding区域内显示出来,也就是将其模拟成边框的效果,再加上旋转动画,从而显示出跑马灯边框的效果。

具体代码:
<style>
    /* 定义一个全局的css变量 该宽度决定了边框的宽度 */
    :root {
      --border-width: 5px;
    }

    /* 定义盒子区域的宽高 包含边框所占区域 */
    .d1 {
      position: relative;
      width: 200px;
      height: 60px;
      /* 为了让内容区域不被边框覆盖 设置等宽的padding */
      padding: var(--border-width);
      margin: 200px auto;
      /* 设置元素圆角 */
      border-radius: 10px;
      text-align: center;
      line-height: 60px;
      color: #333;
      /* 隐藏超出的部分 这很重要 */
      overflow: hidden;
    }

    /* 利用伪元素::after 定义盒子内容区域 */
    .d1::after {
      content: '';
      position: absolute;
      /* 使用css变量定位内容区域位置 */
      left: var(--border-width);
      top: var(--border-width);
      /* 根据css变量设置内容区域的宽高 */
      width: calc(100% - var(--border-width) * 2);
      height: calc(100% - var(--border-width) * 2);
      background: #ccc;
      /* 设置元素层级小于父级元素 使父元素的内容能够显示在该内容区域之上 */
      z-index: -1;
      /* 设置圆角 要比父元素的圆角小一些 */
      border-radius: 6px;
    }

    /* 利用伪元素::before 定义盒子边框区域 */
    .d1::before {
      content: '';
      position: absolute;
      /* 利用定位将元素的左上角定位到父元素的中心 */
      left: 50%;
      top: 50%;
      /* 设置该元素的宽高 要大于父元素的宽高 */
      width: 220px;
      height: 220px;
      /* 设置该元素的渐变背景 */
      background: linear-gradient(90deg, #000, yellow 20%);
      /* 设置该元素的层级 要小于用伪元素::after 定义的盒子内容区域 */
      z-index: -2;
      /* 利用动画旋转该元素 */
      animation: rotate1 1.3s linear infinite;
      /* 定义旋转的圆心为元素的左上角 */
      transform-origin: 0 0;
    }

    /* 声明旋转动画 */
    @keyframes rotate1 {
      0% {
        transform: rotate(0deg);
      }

      100% {
        transform: rotate(360deg);
      }
    }
</style>

<!-- 跑马灯边框的根元素 -->
<div class="d1">跑马灯边框1</div>
页面效果:

在这里插入图片描述

为了帮助理解,去除掉overflow: hidden属性的效果图:

在这里插入图片描述

2、首尾相连的跑马灯边框
实现思路:

​ 其实该样式的实现思路与前面的基本相同,只不过是修改了边框元素的位置和旋转的中心点,使其能够在旋转动的过程中,覆盖边框的所有区域,从而使跑马灯首尾相连。实现方法:

​ ① 利用padding属性使元素的内容区域与最外层之间形成一个间隔。

​ ② 利用伪元素::after position,将该伪元素模拟为元素的内容区域,并设置背景颜色和圆角等样式,此时我们就实现了一个有透明边框的元素了,padding区域就是边框区域。

​ ③ 利用伪元素::before定义一个具有渐变色背景的伪元素,先通过positiontransform使该伪元素的中心点与根元素的中心点对齐,然后通过动画使其围绕元素的中心点旋转。同时该伪元素的渐变背景决定了跑马灯边框的颜色。

​ ④设置元素的overflow: hidden;,隐藏伪元素::before在旋转时,超出元素的部分,并通过设置层级,使伪元素::after 覆盖在伪元素::before之上。这样旋转的伪元素::before就只能在padding区域内显示出来,也就是将其模拟成边框的效果,再加上旋转动画,从而显示出跑马灯边框的效果。

具体代码:
<style>
		/* 定义一个全局的css变量 该宽度决定了边框的宽度 */
    :root {
      --border-width: 5px;
    }
  	    /* 定义盒子区域的宽高 包含边框所占区域 */
    .d2 {
      position: relative;
      width: 200px;
      height: 60px;
      /* 为了让内容区域不被边框覆盖 设置等宽的padding */
      padding: var(--border-width);
      margin: 200px auto;
      /* 设置元素圆角 */
      border-radius: 10px;
      text-align: center;
      line-height: 60px;
      color: #333;
      /* 隐藏超出的部分 这很重要 */
      overflow: hidden;
    }

    /* 利用伪元素::after 定义盒子内容区域 */
    .d2::after {
      content: '';
      position: absolute;
      /* 使用css变量定位内容区域位置 */
      left: var(--border-width);
      top: var(--border-width);
      /* 根据css变量设置内容区域的宽高 */
      width: calc(100% - var(--border-width) * 2);
      height: calc(100% - var(--border-width) * 2);
      background: #ccc;
      /* 设置元素层级小于父级元素 使父元素的内容能够显示在该内容区域之上 */
      z-index: -1;
      /* 设置圆角 要比父元素的圆角小一些 */
      border-radius: 6px;
    }

    /* 利用伪元素::before 定义盒子边框区域 */
    .d2::before {
      content: '';
      position: absolute;
      /* 利用定位和位移将元素的中心点定位到父元素的中心点 */
      left: 50%;
      top: 50%;
      transform: translateY(-50%) translateX(-50%);
      width: 220px;
      height: 220px;
      /* 设置该元素的渐变背景 该背景决定了跑马灯边框的颜色 */
      background: linear-gradient(-45deg, #000, yellow 60%);
      /* 设置该元素的层级 要小于用伪元素::after 定义的盒子内容区域 */
      z-index: -2;
      /* 利用动画旋转该元素 */
      animation: rotate2 1.5s linear infinite;
      /* 设置旋转的圆心为元素的中心点 */
      transform-origin: 50% 50%;
    }

    /* 声明旋转动画 旋转的同时 保持元素位置不变 */
    @keyframes rotate2 {
      0% {
        transform: translateY(-50%) translateX(-50%) rotate(0deg);
      }

      100% {
        transform: translateY(-50%) translateX(-50%) rotate(360deg);
      }
    }
</style>

<!-- 跑马灯边框的根元素 -->
<div class="d2">跑马灯边框2</div>
页面效果:

在这里插入图片描述

为了帮助理解,去除掉overflow: hidden属性的效果图:

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1393011.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

手机崩溃日志的查找与分析

手机崩溃日志的查找与分析 摘要 本文介绍了一款名为克魔助手的iOS应用日志查看工具&#xff0c;该工具可以方便地查看iPhone设备上应用和系统运行时的实时日志和崩溃日志。同时还提供了崩溃日志的分析查看模块&#xff0c;可以对苹果崩溃日志进行符号化、格式化和分析&#x…

CMake+QT+大漠插件的桌面应用开发(QThread)

文章目录 CMakeQT大漠插件的桌面应用开发&#xff08;QThread&#xff09;简介环境项目结构配置编译环境代码 CMakeQT大漠插件的桌面应用开发&#xff08;QThread&#xff09; 简介 在CMakeQT大漠插件的桌面应用开发中已经给出了QT配合大漠插件开发桌面应用的样例 不过由于主…

Android车载系统Car模块架构链路分析

一、模块主要成员 CarServiceHelperService SystemServer 中专门为 AAOS 设立的系统服务&#xff0c;用来管理车机的核心服务 CarService。该系统服务的具体实现在 CarServiceHelperServiceUpdatableImpl CarService Car模块核心服务APP&#xff0c;Android 13版本开始分为…

PXE和kickstart无人值守安装

PXE高效批量网络装机 引言 1.系统装机的引导方式 启动 操作 系统 1.硬盘 2.光驱&#xff08;u盘&#xff09; 3.网络启动 pxe 重装系统&#xff1f; 在已有操作系统 新到货了一台服务器&#xff0c; 装操作系统 系统镜像 u盘 光盘 pe&#xff1a; 小型的 操作系统 在操…

RocketMQ Dashboard 详解

RocketMQ Dashboard 是 RocketMQ 的管控利器&#xff0c;为用户提供客户端和应用程序的各种事件、性能的统计信息&#xff0c;支持以可视化工具代替 Topic 配置、Broker 管理等命令行操作。 一、介绍​ 功能概览​ 面板功能运维修改nameserver 地址; 选用 VIPChannel驾驶舱查…

【Docker】网络模式详解及容器间网络通信

目录 一、概述 二、默认网络 三、网络模式及应用 1. Bridge模式 2. Host模式 3. none网络模式 四、自定义网络应用 1. 网络相连 2. 自定义通讯 3. 自定义IP 每篇一获 一、概述 在 Docker 中&#xff0c;网络设置包括 IP 地址、子网掩码、网关、DNS 和端口号等关键组…

循环神经网络的变体模型-LSTM、GRU

一.LSTM&#xff08;长短时记忆网络&#xff09; 1.1基本介绍 长短时记忆网络&#xff08;Long Short-Term Memory&#xff0c;LSTM&#xff09;是一种深度学习模型&#xff0c;属于循环神经网络&#xff08;Recurrent Neural Network&#xff0c;RNN&#xff09;的一种变体。…

数据结构学习之链式栈应用的案例(最小栈)

实例要求&#xff1a; 设计一个支持入栈、出栈、取栈顶元素等操作&#xff0c;并能在常数时间内检索到最小元素的栈&#xff1b; 实现 MinStack 类: MinStack* minStackCreate() 初始化堆栈对象&#xff0c;即建栈&#xff1b; void minStackPush(MinStack* obj, int val) …

springmvc上传与下载

文件上传 结构图 导入依赖 <dependency><groupId>jstl</groupId><artifactId>jstl</artifactId><version>1.2</version></dependency><dependency><groupId>org.springframework</groupId><artifactId…

机器学习之常用激活函数

人工神经网络中最基本的单元叫神经元,又叫感知器,它是模拟人脑神经系统的神经元(分析和记忆)、树突(感知)、轴突(传导)的工作原理,借助计算机的快速计算和存储来实现。它的主体结构如下: 激活函数常用类型有:线性激活函数、符号激活函数、Sigmoid激活函数、tanh激活…

MySQL中根据出生日期计算年龄

创建student表 mysql> create table student( -> sid int primary key comment 学生号, -> sname varchar(20) comm…

mybatis----小细节

1、起别名 在MyBatis中&#xff0c;<typeAliases>元素用于定义类型别名&#xff0c;它可以将Java类名映射为一个更简短的别名&#xff0c;这样在映射文件中可以直接使用别名而不需要完整的类名。 下面是一个示例&#xff1a; 在mybatis核心配置文件中配置typeAliases标…

QT第二周周三

题目&#xff1a;使用图片绘制出仪表盘 代码&#xff1a; widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widget : public QWidget {Q_OBJECTpublic:Widget(QWidget *paren…

社交媒体数据分析:解读Facebook用户行为

在当今数字化时代&#xff0c;社交媒体已经成为人们生活不可或缺的一部分&#xff0c;而Facebook作为这个领域的巨头&#xff0c;承载了数十亿用户的社交活动。这庞大的用户群体产生了海量的数据&#xff0c;通过深度数据分析&#xff0c;我们能够深入解读用户行为&#xff0c;…

用C++和Python分别实现归并排序(详细讲解!!!)

目录 一、归并排序的背景1. 分治算法2. 分治算法的解题步骤2.1 分解2.2 治理2.3 合并 2. 归并排序2.1 大致思路2.2 算法分析 二、C代码三、Python代码 一、归并排序的背景 1. 分治算法 归并排序&#xff0c;本质上就是分治算法的一种&#xff0c;那么什么是分治算法呢。在算法…

【Java】HttpServlet类简单方法和请求显示

1、HttpServlet类简介&#x1f340; Servlet类中常见的三个类有&#xff1a;☑️HttpServlet类&#xff0c;☑️HttpServletRequest类&#xff0c;☑️HttpResponse类 &#x1f42c;其中&#xff0c;HttpServlet首先必须读取Http请求的内容。Servlet容器负责创建HttpServlet对…

F. Sum of Progression

题面 输入 每个测试由几个测试用例组成。第一行包含一个整数 t&#xff08;1 ≤ t ≤ 1e4&#xff09;——测试用例的数量。接下来的几行包含测试用例的描述。 每个测试用例的第一行包含两个数字n&#xff0c;q&#xff08;1 ≤ n ≤ 1e5&#xff0c;1 ≤ q ≤ 2e5&#xff09;…

电子雨html代码

废话不多说下面是代码&#xff1a; <!DOCTYPE html><html lang"en"><head><meta charset"UTF-8"><title>Code</title><style>body{margin: 0;overflow: hidden;}</style></head><body><c…

Demo: 实现PDF加水印以及自定义水印样式

实现PDF加水印以及自定义水印样式 <template><div><button click"previewHandle">预览</button><button click"downFileHandle">下载</button><el-input v-model"watermarkText" /><el-input v-mo…

【Java 设计模式】创建型之原型模式

文章目录 1. 定义2. 应用场景3. 代码实现4. 应用示例结语 在软件开发中&#xff0c;原型模式是一种创建型设计模式&#xff0c;它允许通过复制现有对象来创建新对象&#xff0c;而无需知道其具体实现。原型模式通常包含一个原型接口和多个实现了该接口的具体原型类。在本文中&a…