CSS 之 跑马灯边框

一、简介

​ 之前有做过渐变色边框的样式,然后某天刷抖🎵,看到某个老师在讲跑马灯的样式效果,于是就自己尝试实现一下跑马灯样式的边框,虽然这种样式并不常见(基本没卵用),其使用场景我至今没想到,但是它足够花里胡哨,玩的就是花活。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属性的效果图:

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

git的分支的使用,创建分支,合并分支,删除分支,合并冲突,分支管理策略,bug分支,强制删除分支

GIT | 分支 文章目录 GIT | 分支创建分支合并分支删除分支合并冲突分支管理策略bug分支强制删除分支 创建分支 查看当前本地仓库中有哪些分支 git branchHEAD所指向的分支就是当前正在工作的分支 cat .git/HEAD创建一个分支 git branch dev创建好了&#xff0c;但是目前还是…

Redis基础系列-哨兵模式

Redis基础系列-哨兵模式 文章目录 Redis基础系列-哨兵模式1. 引言2. 什么是哨兵模式&#xff1f;3. 哨兵模式的配置4. 哨兵模式的启动和验证4.1 主master宕机&#xff0c;看会出现什么问题4.2 重启6379主机 5. 哨兵模式的工作原理和选举原理5.1. SDown主观下线&#xff08;Subj…

Vue.js轻量级框架:快速搭建可扩展的管理系统

一、前言 在项目实战开发中&#xff0c;尤其是大平台系统的搭建&#xff0c;针对不同业务场景&#xff0c;需要为用户多次编写用于录入、修改、展示操作的相应表单页面。一旦表单需求过多&#xff0c;对于开发人员来说&#xff0c;算是一种重复开发&#xff0c;甚至是繁杂的工作…

RFID技术在汽车装备中的应用:提升安全性与效率

RFID技术在汽车装备中的应用&#xff1a;提升安全性与效率 射频识别&#xff08;RFID&#xff09;技术是一种非接触式的自动识别技术&#xff0c;它利用射频信号及其空间耦合和传输特性&#xff0c;实现对目标对象的信息读写。随着汽车工业的不断发展&#xff0c;汽车装备的技…

开源28181协议视频平台搭建流程

最近项目中用到流媒体平台&#xff0c;java平台负责信令部分&#xff0c;c平台负责流媒体处理&#xff0c;找了评分比较好的开源项目 https://gitee.com/pan648540858/wvp-GB28181-pro 流媒体服务基于 c写的 https://github.com/ZLMediaKit/ZLMediaKit 说明文档&#xff1a;h…

ElasticSearch扫盲概念篇[ES系列] - 第500篇

历史文章&#xff08;文章累计500&#xff09; 《国内最全的Spring Boot系列之一》 《国内最全的Spring Boot系列之二》 《国内最全的Spring Boot系列之三》 《国内最全的Spring Boot系列之四》 《国内最全的Spring Boot系列之五》 《国内最全的Spring Boot系列之六》 E…

laravel异步消息队列详细攻略Supervisor队列进程管理(实战)

1、laravel配置开启队列 这里仅演示数据库队列 查看下面/config/queue.php&#xff0c;里面defult 对应的 env常量是 QUEUE_DRIVER&#xff0c;那就在 项目根目录下的.env文件修改 QUEUE_DRIVERdatabase <?phpreturn [/*|----------------------------------------------…

64位ATT汇编语言学习第一课:汇编和链接

源文件exitTest.s内容如下&#xff1a; # This is the first program .global _start .section .text _start:movq $60,%raxmovq $9,%rdisyscall源文件里边放的就是源代码&#xff0c;而我这里源代码是使用汇编语言写的&#xff0c;都是一些人类都可以阅读的字符。之后需要经过…

c语言do while循环语句

c语言do while循环语句 c语言do while循环语句 c语言do while循环语句一、do while循环语句格式二、do while 循环案例 一、do while循环语句格式 do while语句先循环后判断,条件不符合就结束循环&#xff0c;条件符合继续循环 do { 代码 } while(表达式);int main() {int a 0…

【STM32】STM32学习笔记-MPU6050简介(32)

00. 目录 文章目录 00. 目录01. MPU6050简介02. MPU6050参数03. MPU6050硬件电路04. MPU6050框图05. MPU6050常用寄存器06. 附录 01. MPU6050简介 •MPU6050是一个6轴姿态传感器&#xff0c;可以测量芯片自身X、Y、Z轴的加速度、角速度参数&#xff0c;通过数据融合&#xff0…

LLM推理部署(七):FireAttention——通过无损量化比vLLM快4倍

Mixtral作为第一个在数万亿tokens上训练的OSS模型&#xff0c;最近在人工智能社区掀起了波澜&#xff0c;它支持“混合专家”&#xff08;MoE&#xff09;&#xff0c;并且训练和推理速度非常快。 Fireworks AI是第一个托管Mixtral的平台&#xff0c;在Mixtral公开发布之前就托…

第15届蓝桥杯嵌入式省赛准备第一天总结笔记(使用STM32cubeMX创建hal库工程+点亮LED)

一.使用STM32cubeMX创建工程 1.安装芯片包 点击红圈 找到STM32G4安装最新版本 2.创建工程 点击红圈 在搜索框里搜索STM32G431RBT6&#xff0c;然后点击Start。 然后点击System Core选择RCC&#xff0c;这里是设置外部晶振引脚。 然后配置外部高速时钟为80MHz 然后我们查看电…

基于开源组件自主开发工作流引擎系统

目前基于Java语言开发的主流开源工作流引擎有osworkflow、jbpm、activiti、flowable、camunda。其中osworkflow、jbpm技术较老已经过时&#xff0c;activiti包括activiti5、activiti6、activiti7三个版本&#xff0c;flowable分开源版和商业版&#xff0c;camunda包括camunda7和…

强化学习AI构建实战 - 基于“黄金点”游戏(二)

服务端接口 为了让大家的AI可以顺利地进行游戏&#xff0c;并验证我们对策略和AI的一些实现&#xff0c;我们需要一些基础设施来帮助我们完成一些工作。这些工作包括游戏回合的控制、参与者之间的数据同步、游戏数据的储存等功能。 为了简化这些基础工作&#xff0c;以便大家…

旧路由重置新路由设置新路由设置教程|适用于PPPoE拨号

前言 前几天朋友说路由器想要重置&#xff0c;但不知道怎么弄。所以就想着只帮忙重置路由器的话&#xff0c;只能帮到一个人。但把整个过程写成图文&#xff0c;就可以帮助更多人。 本文章适合电脑小白&#xff0c;请注意每一步哦&#xff01; 注意事项 开始之前需要确认光猫…

TAX个税小知识

人&#xff1a;个人&#xff0c;非居民个人 种类&#xff1a;工资薪金&#xff0c;劳务报酬所得&#xff0c;特许使用费&#xff0c;稿酬所得 工资按月支付扣税&#xff0c;不用个人提供发票&#xff0c;有签劳动合同&#xff1b; 其他三项按月或按次扣税&#xff0c;需要开发…

TTL篇-TtlAgent的使用

接上篇&#xff0c;TTL篇-TTL的使用-CSDN博客 TtlAgent是什么 ttl使用的典型代码是如下所示&#xff0c; DataAllArgsConstructorpublic static class Bean {private String name;}Testpublic void testBean() throws InterruptedException {TransmittableThreadLocal<Be…

10、Kafka ------ 消费者组 和 消费者实例,分区 和 消费者实例 之间的分配策略

目录 消费者组 和 消费者实例★ 消费者组★ 分区 和 消费者实例★ 分配分区&#xff08;分区 和 消费者实例 之间的分配策略&#xff09;3种分配策略★ range策略★ round-robin策略 &#xff08;轮询&#xff09;★ stick策略 如何指定分配分区的策略&#xff1a; 消费者组 和…

Git 基本使用

Git Git是一种分布式版本控制系统&#xff0c;它可以帮助开发团队更好地管理代码并进行协同开发。 gitee,github,gitlab&#xff0c;是基于git的代码托管平台。 官方文档地址(中文)&#xff1a;Git - Git 是什么&#xff1f; 安装和配置 官网下载地址&#xff1a;Git - Downl…