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属性的效果图:

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

牛客-寻找第K大、LeetCode215. 数组中的第K个最大元素【中等】

文章目录 前言牛客-寻找第K大、LeetCode215. 数组中的第K个最大元素【中等】题目及类型思路思路1&#xff1a;大顶堆思路2&#xff1a;快排二分随机基准点 前言 博主所有博客文件目录索引&#xff1a;博客目录索引(持续更新) 牛客-寻找第K大、LeetCode215. 数组中的第K个最大元…

云计算概述(发展过程、定义、发展阶段、云计算榜单)(一)

云计算概述&#xff08;一&#xff09; &#xff08;发展过程、定义、发展阶段、云计算榜单&#xff09; 本文目录&#xff1a; 零、00时光宝盒 一、前言 二、云计算的发展过程 三、云计算的定义 四、云计算发展阶段 五、云计算公司榜单看云计算兴衰 六、参考资料 零、0…

小程序中滚动字幕

需求&#xff1a;在录像时需要在屏幕上提示字幕&#xff0c;整体匀速向上滚动 html部分&#xff1a; <view class"subtitles_main"><view style"font-size:34rpx;color: #fff;line-height: 60rpx;" animation"{{animation}}">人生的…

Linux工具-搭建文件服务器

当我们使用linux系统作为开发环境时&#xff0c;经常需要在Linux系统之间、Linux和Windows之间传输文件。 对少量文件进行传输时&#xff0c;可以使用scp工具在两台主机之间实现文件传输&#xff1a; rootubuntu:~$ ssh --help unknown option -- - usage: ssh [-46AaCfGgKkMN…

五种嵌入式经典通信总线协议

一.先前知识 1.并行与串行 并行通信和串行通信是两种不同的数据传输方式&#xff1a; 并行通信&#xff1a;并行通信是指在同一时间使用多条并行传输的线路传输多个比特的数据。每个比特使用独立的线路进行传输&#xff0c;同时进行。这样可以在一个时钟周期内传输多个比特&…

nova组件讲解和glance对接swift

1、openstack架构 &#xff08;1&#xff09;openstack是一种SOA架构&#xff08;微服务就是从这种架构中剥离出来的&#xff09; &#xff08;2&#xff09;这种SOA架构&#xff0c;就是把每个服务独立成一个组件&#xff0c;每个组件通过定义好的api接口进行互通 &#xff…

复合机器人作为一种新型的智能制造装备高效、精准和灵活的生产方式

随着汽车制造业的快速发展&#xff0c;对于高效、精准和灵活的生产方式需求日益增强。复合机器人作为一种新型的智能制造装备&#xff0c;以其独特的优势在汽车制造中发挥着越来越重要的作用。因此&#xff0c;富唯智能顺应时代的发展趋势&#xff0c;研发出了ICR系列的复合机器…

京东年度数据报告-2023全年度笔记本十大热门品牌销量(销额)榜单

2023年度&#xff0c;在电脑办公市场整体销售下滑的环境下&#xff0c;笔记本市场的整体销售也不景气。 根据鲸参谋平台的数据显示&#xff0c;京东平台上笔记本的年度销量为650万&#xff0c;同比下滑约16%&#xff1b;销售额约为330亿&#xff0c;同比下滑约19%。同时&#…

CF1178F2 Long Colorful Strip 题解 搜索

Long Colorful Strip 传送门 题面翻译 题目描述 这是 F 题的第二个子任务。F1 和 F2 的区别仅在对于 m m m 和时间的限制上 有 n 1 n1 n1 种颜色标号从 0 0 0 到 n n n&#xff0c;我们有一条全部染成颜色 0 0 0 的长为 m m m 的纸带。 Alice 拿着刷子通过以下的过…

uniapp微信小程序投票系统实战 (SpringBoot2+vue3.2+element plus ) -投票帖子明细实现

锋哥原创的uniapp微信小程序投票系统实战&#xff1a; uniapp微信小程序投票系统实战课程 (SpringBoot2vue3.2element plus ) ( 火爆连载更新中... )_哔哩哔哩_bilibiliuniapp微信小程序投票系统实战课程 (SpringBoot2vue3.2element plus ) ( 火爆连载更新中... )共计21条视频…

经典目标检测YOLO系列(一)复现YOLOV1(5)模型的训练及验证

经典目标检测YOLO系列(一)复现YOLOV1(5)模型的训练及验证 之前&#xff0c;我们依据《YOLO目标检测》(ISBN:9787115627094)一书&#xff0c;提出了新的YOLOV1架构&#xff0c;继续按照此书进行YOLOV1的复现。 经典目标检测YOLO系列(一)YOLOV1的复现(1)总体架构 经典目标检测Y…

Python Flask教程

Flask Doc: https://rest-apis-flask.teclado.com/docs/course_intro/what_is_rest_api/Github: https://github.com/tecladocode/rest-apis-flask-python 1. 最简单的应用 最小应用 from flask import Flaskapp Flask(__name__)app.route("/") def hello_world()…

18 串口通讯

文章目录 18.0 前言18.1 串口通讯协议简介18.1.1 物理层 18.2 RT1052 的 LPUART 简介18.3 UART 功能框图18.3.1 中断控制 18.4 UART 初始化结构体详解18.4.1 baudRate_Bps18.4.2 parityMode18.4.3 dataBitsCount18.4.4 isMsb18.4.5 stopBitCount18.4.6 txFifoWatermark与rxFifo…

Kubernetes 集群管理—日志架构

日志架构 应用日志可以让你了解应用内部的运行状况。日志对调试问题和监控集群活动非常有用。 大部分现代化应用都有某种日志记录机制。同样地&#xff0c;容器引擎也被设计成支持日志记录。 针对容器化应用&#xff0c;最简单且最广泛采用的日志记录方式就是写入标准输出和标…

RIP【新华三与华为区别】

【介绍】 rip分为rip 1 与 rip 2 &#xff0c;rip 2 是对 rip 1 的一种升级&#xff0c;rip 2 可以进行认证等功能 【命令】 新华三&#xff1a; [HC3-R1] rip #启用rip [HC3-R1-rip] version 2 #告知rip 版本号 [HC3-R1-rip] network 192.168.1.0 #宣告其网段 [HC3-R1-rip] …

ES分词器

Analysis&#xff1a;文本分析是把全文本转换一系列单词的过程&#xff0c;也叫分词。Analysis是通过Analyzer(分词器)来实现的。 1.Analyzer组成 注意&#xff1a;在ES中默认使用标准分词器&#xff1a;StandardAnalyzer。特点是&#xff1a;中文是单字分词&#xff0c;英文是…

Docker 容器之间的互相通信

Docker容器之间的互相通信 步骤一&#xff1a;创建自定义网络 首先&#xff0c;我们需要创建一个自定义网络&#xff0c;以便容器可以连接到这个网络上&#xff0c;从而实现互相通信。在命令行中执行以下命令&#xff1a; # 创建 docker network create ddz # 查看 docker n…

costmap_2d包介绍

文章目录 一. costmap_2d包介绍二. Costmap包的执行入口-- move_base中调用三. Costmap包的初始化以及维护3.1 Costmap2DROS类3.1.1 构造函数 Costmap2DROS::Costmap2DROS3.1.2 地图更新线程 Costmap2DROS::mapUpdateLoop3.1.3 地图更新 Costmap2DROS::updateMap()3.1.4 激活各…

openssl3.2 - 在VS2019下源码调试openssl.exe

文章目录 openssl3.2 - 在VS2019下源码调试openssl.exe概述笔记先看一个用.bat调用openssl干活的实例VS2019调试参数设置设置 - 命令参数设置 - 工作目录设置 - 环境变量将命令行中需要的文件拷贝到exe目录单步调试备注END openssl3.2 - 在VS2019下源码调试openssl.exe 概述 …

多租户体系实现

文章目录 核心思路方案选择设计考量安全性扩展性通用性易用性 具体实现租户信息透传透传变量名命名规范应用内透传应用间透传 数据层租户隔离MySQL存储方案&#xff1a;多租户Mybatis插件Mybatis插件特点使用多租户Mybatis插件的优势参考文档 应用场景 经过工作中的一处场景启发…