前端炫酷动画--图片(一)

目录

一、四角线框的跟随移动

二、元素倒影(-webkit-box-reflect)

三、模特换装(mask+blend)

四、元素平滑上升

五、无限视差滚动

六、判断鼠标进入方向(轮播方向)

七、环形旋转效果

八、黑白小球交替旋转

九、hover时圆形放大

十、画一棵随机树(canvas)

十一、代码雨效果(canvas)

一、四角线框的跟随移动

    <style>body {background: black;}.container {width: 400px;height: 40vh;position: relative;display: grid; /* 使用 Grid 布局 */grid-template-columns: repeat(2, 1fr); /* 设置两列 */grid-gap: 20px; /* 设置网格项之间的间距 */justify-items: center;align-items: center;margin: 20px;}.pointer {position: absolute;--l: 30px; /* 长度 */--g: 15px; /* 间隔 */--t: 3px; /* 粗细 */--s: 394px; /* 框住的大小 */--x: 0px;--y: 0px;width: calc(var(--s) + var(--g) * 2);height: calc(var(--s) + var(--g) * 2);border: var(--t) solid #fff;left: calc(var(--x) - var(--g));top: calc(var(--y) - var(--g));transition: 0.5s;/* 圆锥渐变(conic-gradient)作为遮罩效果 */-webkit-mask: conic-gradient(at var(--l) var(--l),transparent 75%,red 75%)0 0 / calc(100% - var(--l)) calc(100% - var(--l));}</style><body><div class="container"><div class="pointer"></div><div class="item"><img src="https://picsum.photos/id/371/400/400" alt="" /></div><div class="item"><img src="https://picsum.photos/id/372/400/400" alt="" /></div><div class="item"><img src="https://picsum.photos/id/374/400/400" alt="" /></div><div class="item"><img src="https://picsum.photos/id/376/400/400" alt="" /></div></div><script>const imgs = document.querySelectorAll(".container img");const pointer = document.querySelector(".pointer");for (const img of imgs) {img.onmouseenter = () => {pointer.style.setProperty("--x", img.offsetLeft + "px");pointer.style.setProperty("--y", img.offsetTop + "px");pointer.style.setProperty("--s", img.offsetWidth + "px");};}</script></body>

二、元素倒影(-webkit-box-reflect)

      .card {box-shadow: 0 0 8px #fff;width: 200px;-webkit-box-reflect: below 15pxlinear-gradient(transparent, transparent, #0005);}

三、模特换装(mask+blend)

前提:准备一张白色完整图片和要换装的衣服块图片,后期再混合

    <style>.card {width: 300px;height: 500px;position: relative;}.source {display: block;width: 100%;height: 100%;object-fit: cover;}.skirt {position: absolute;inset: 0; /*等同于 left:0;top:0;bottom: 0;right: 0; */background:red;--mask:url(./partImg.png) 50% 50% / cover;/* 将用蒙版将衣服块“染成”背景色 */mask:var(--mask);-webkit-mask:var(--mask);/* 混合衣服块和背景色 */mix-blend-mode: multiply;}</style><body><div class="card"><img src="./whiteImg.png" alt="" class="source" /><div class="skirt"></div></div></body>

四、元素平滑上升

// useSlideIn.js
const DISTANCE = 150;
const DURATION = 500;
const map = new WeakMap();
const ob = new IntersectionObserver((entries) => {for (const entry of entries) {if (entry.isIntersecting) {// 该元素和视口相交 播放该元素的动画const animation = map.get(entry.target);if (animation) {animation.play();ob.unobserve(entry.target); // 播放一次,取消观察}}}
});
function isBelowViewport(el) {const rect = el.getBoundingClientRect();return rect.top - DISTANCE > window.innerHeight;
}
export default {mounted(el) {if (!isBelowViewport(el)) {return;}const animation = el.animate([{transform: `translateY(${DISTANCE}px)`,opacity: 0.5},{transform: 'translateY(0)',opacity: 1}],{duration: DURATION,easing: 'ease-in-out',fill: 'forwards'});animation.pause();ob.observe(el);map.set(el, animation);},unmounted(el) {ob.unobserve(el);}
};
<template><div><div v-slide-in class="item" v-for="n in 10" :key="n">{{ n }}BOX</div></div>
</template>
<script>
import slideIn from './useSlideIn';
export default {directives: {'slide-in': slideIn},
};
</script>

五、无限视差滚动

  <style>.scroll-container {display: flex;overflow: hidden;position: relative;height: 400px; /* 设置容器高度 */}.item {position: absolute;width: 100%;height: 100%;transition: transform 0.5s ease;}.item img {width: 100%;height: 100%;object-fit: cover;}.scroll-down .cur {transform: translateY(100%);}.scroll-up .cur {transform: translateY(-100%);}</style>
<body><div class="scroll-container"></div><script>const imgs = ["https://picsum.photos/id/376/800/800","https://picsum.photos/id/372/800/800","https://picsum.photos/id/373/800/800","https://picsum.photos/id/374/800/800","https://picsum.photos/id/375/800/800"];const container = document.querySelector(".scroll-container");let curIndex = 0;function getPrevIndex() {return curIndex === 0 ? imgs.length - 1 : curIndex - 1;}function getNextIndex() {return curIndex === imgs.length - 1 ? 0 : curIndex + 1;}function createElement(i) {const div = document.createElement("div");div.className = "item";const img = document.createElement("img");img.src = imgs[i];div.appendChild(img);container.appendChild(div);return div;}function resetElements() {container.innerHTML = "";const prevIndex = getPrevIndex();const nextIndex = getNextIndex();createElement(prevIndex).classList.add("prev");const curItem = createElement(curIndex);curItem.classList.add("cur");createElement(nextIndex).classList.add("next");}resetElements();let isAnimation = false;window.addEventListener("wheel", (e) => {if (!e.deltaY || isAnimation) {return;}isAnimation = true;if (e.deltaY > 0) {curIndex = getNextIndex();container.classList.add("scroll-down");} else {curIndex = getPrevIndex();container.classList.add("scroll-up");}});container.addEventListener("transitionend", () => {container.classList.remove("scroll-down");container.classList.remove("scroll-up");isAnimation = false;resetElements();});</script>
</body>

六、判断鼠标进入方向(轮播方向)

    <script>const container = document.querySelector(".container");const rect = container.getBoundingClientRect();const theta = Math.atan2(rect.height, rect.width);container.addEventListener("mouseenter", (e) => {const x = e.offsetX - rect.width / 2;const y = rect.height / 2 - e.offsetY;const d = Math.atan2(y, x);if (d < theta && d >= -theta) {container.classList.add("right");} else if (d >= theta && d < Math.PI - theta) {container.classList.add("top");} else if (d >= Math.PI - theta || d < -(Math.PI - theta)) {container.classList.add("left");} else {container.classList.add("bottom");}});container.addEventListener("mouseleave", () => {container.className = "container";});</script>

七、环形旋转效果

$size: 300px;
$imgSize: 80px;
.container {width: $size;height: $size;outline: 1px solid #000;margin: 0 auto;position: relative;margin-top: 60px;display: flex;justify-content: center;align-items: start;border-radius: 50%;animation: rotation 20s linear infinite;@keyframes rotation {to {transform: rotate(calc(360deg - var(--initDeg, 0deg)));}}.item {width: $imgSize;height: $imgSize;position: absolute;margin-top: -40px;img {width: 100%;height: 100%;object-fit: cover;border-radius: 50%;}}
}
$n: 5;
$pDeg: 360deg / $n;
.item {transform-origin: center $size / 2 + $imgSize / 2;@for $i from 1 through $n {$deg: $pDeg * ($i - 1);&:nth-child(#{$i}) {transform: rotate($deg);img {--initDeg:#{$deg};transform: rotate(-$deg); //将歪斜的图片矫正animation: rotation 20s linear infinite reverse;}}}
}

八、黑白小球交替旋转

  <div class="loading"><!-- 快捷键:div.dot*36 --></div>
body {background: #66c7f4;
}
$ballSize: 10px; //小球尺寸
$containerSize: 150px; //容器尺寸
$n: 36;
$pDeg: 360deg / $n;
$d:2s;
.loading {width: $containerSize;height: $containerSize;margin: 50px auto;position: relative;border-radius: 50%;// outline: 1px solid #fff;
}
.dot {position: absolute;left: 50%;top: 0;width: $ballSize;height: $ballSize;margin-left: -$ballSize / 2;margin-top: -$ballSize / 2;perspective: 70px;// background: #f40;transform-origin: center $containerSize / 2 + $ballSize / 2;perspective: 70px;transform-style: preserve-3d;@for $i from 1 through $n {&:nth-child(#{$i}) {transform: rotate($pDeg * ($i - 1));&::before,&::after {animation-delay: -$d / $n * ($i - 1) * 6;}}&::before,&::after {content: "";position: absolute;width: 100%;height: 100%;border-radius: 50%;}&::before {background: #000;top: -100%;animation: rotation-black $d infinite;@keyframes rotation-black {0% {animation-timing-function: ease-in;}25% {transform: translate3d(0, 100%, $ballSize);animation-timing-function: ease-out;}50% {transform: translate3d(0, 200%, 0);animation-timing-function: ease-in;}75% {transform: translate3d(0, 100%, -$ballSize);animation-timing-function: ease-out;}}}&::after {background: #fff;top: 100%;animation: rotation-white $d infinite;@keyframes rotation-white {0% {animation-timing-function: ease-in;}25% {transform: translate3d(0, -100%, -$ballSize);animation-timing-function: ease-out;}50% {transform: translate3d(0, -200%, 0);animation-timing-function: ease-in;}75% {transform: translate3d(0, -100%, $ballSize);animation-timing-function: ease-out;}}}}
}

九、hover时圆形放大

    <style>.avatar {width: 200px;height: 200px;border-radius: 50%;background: url("./qiang.jpg");cursor: pointer;position: relative;}.avatar::before,.avatar::after {content: "";position: absolute;inset: 0;border-radius: 50%;}.avatar::before {background: rgba(0, 0, 0, 0.5);}.avatar::after {background: inherit; /* 继承自父元素 */clip-path: circle(0% at 50% 50%);transition: .3s;}.avatar:hover::after {clip-path: circle(50% at 50% 50%);}</style><body><div class="avatar"></div></body>

十、画一棵随机树(canvas)

  <body><canvas id="bg"></canvas><script>const cvs = document.getElementById("bg");const ctx = cvs.getContext("2d");cvs.width = window.innerWidth;cvs.height = window.innerHeight;// 更改坐标原点ctx.translate(cvs.width / 2, cvs.height);ctx.scale(1, -1);// 画树干drawBranch([0, 0], 200, 30, 90);function drawBranch(v0, length, thick, dir) {if (thick < 10 && Math.random() < 0.3) {return;}if (thick < 2) {ctx.beginPath();ctx.arc(...v0, 10, 0, 2 * Math.PI);ctx.fillStyle = "red";ctx.fill();return;}ctx.beginPath();ctx.moveTo(...v0);const v1 = [v0[0] + length * Math.cos((dir * Math.PI) / 180),v0[1] + length * Math.sin((dir * Math.PI) / 180),];ctx.lineTo(...v1);ctx.lineWidth = thick;ctx.fillStyle = "#333";ctx.lineCap = "round";ctx.stroke();// 递归调用画左右两边的树枝drawBranch(v1, length * 0.8, thick * 0.8, dir + Math.random() * 30);drawBranch(v1, length * 0.8, thick * 0.8, dir - Math.random() * 30);}</script></body>

十一、代码雨效果(canvas)

  <body><canvas id="bg"></canvas><script>const cvs = document.getElementById("bg");const width = window.innerWidth * devicePixelRatio,height = window.innerHeight * devicePixelRatio;// 设置canvas尺寸为窗口尺寸cvs.width = width;cvs.height = height;const ctx = cvs.getContext("2d");const fontSize = 20 * devicePixelRatio;const columnWidth = fontSize; //列宽const columnCount = Math.floor(width / columnWidth); //列的数量const nextChar = new Array(columnCount).fill(0); //每列下一个文字是第几个文字// 获取随机颜色 (HEX 格式)function getRandomColor() {const r = Math.floor(Math.random() * 256);const g = Math.floor(Math.random() * 256);const b = Math.floor(Math.random() * 256);// 将每个颜色分量转换为两位的十六进制格式,并拼接成 HEX 颜色值return `#${((1 << 24) | (r << 16) | (g << 8) | b).toString(16).slice(1).toUpperCase()}`;}// 获取随机字符function getRandomChar() {const chars ="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";const randomIndex = Math.floor(Math.random() * chars.length);return chars[randomIndex];}function draw() {ctx.fillStyle = "rgba(0,0,0,0.1)";ctx.fillRect(0, 0, width, height);for (let i = 0; i < columnCount; i++) {const char = getRandomChar();ctx.fillStyle ='green';//赋值为getRandomColor()就是随机彩色ctx.font = `${fontSize}px "Roboto Mono"`;const x = columnWidth * i;const index = nextChar[i];const y = (index + 1) * fontSize;ctx.fillText(char, x, y);if (y > height && Math.random() > 0.99) {nextChar[i] = 0;} else {nextChar[i]++;}}}draw();setInterval(draw, 40);</script></body>

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

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

相关文章

STL--list(双向链表)

目录 一、list 对象创建 1、默认构造函数 2、初始化列表 3、迭代器 4、全0初始化 5、全值初始化 6、拷贝构造函数 二、list 赋值操作 1、赋值 2、assign&#xff08;迭代器1&#xff0c;迭代器2&#xff09; 3、assign&#xff08;初始化列表&#xff09; 4、assig…

【语言处理和机器学习】概述篇(基础小白入门篇)

前言 自学笔记&#xff0c;分享给语言学/语言教育学方向的&#xff0c;但对语言数据处理感兴趣但是尚未入门&#xff0c;却需要在论文中用到的小伙伴&#xff0c;欢迎大佬们补充或绕道。ps&#xff1a;本文不涉及公式讲解&#xff08;文科生小白友好体质&#xff09;&#xff…

小程序获取微信运动步数

1、用户点击按钮&#xff0c;在小程序中触发getuserinfo方法&#xff0c;获取用户信息 <scroll-view class"scrollarea" scroll-y type"list"><view class"container"><button bind:tap"getLogin">获取</button&…

C 语言雏启:擘画代码乾坤,谛观编程奥宇之初瞰

大家好啊&#xff0c;我是小象٩(๑ω๑)۶ 我的博客&#xff1a;Xiao Xiangζั͡ޓއއ 很高兴见到大家&#xff0c;希望能够和大家一起交流学习&#xff0c;共同进步。* 这一课主要是让大家初步了解C语言&#xff0c;了解我们的开发环境&#xff0c;main函数&#xff0c;库…

VSCode下EIDE插件开发STM32

VSCode下STM32开发环境搭建 本STM32教程使用vscode的EIDE插件的开发环境&#xff0c;完全免费&#xff0c;有管理代码文件的界面&#xff0c;不需要其它IDE。 视频教程见本人的 VSCodeEIDE开发STM32 安装EIDE插件 Embedded IDE 嵌入式IDE 这个插件可以帮我们管理代码文件&am…

Linux内核编程(二十一)USB驱动开发

一、驱动类型 USB 驱动开发主要分为两种&#xff1a;主机侧的驱动程序和设备侧的驱动程序。一般我们编写的都是主机侧的USB驱动程序。 主机侧驱动程序用于控制插入到主机中的 USB 设备&#xff0c;而设备侧驱动程序则负责控制 USB 设备如何与主机通信。由于设备侧驱动程序通常与…

论文笔记-arXiv2025-A survey about Cold Start Recommendation

论文笔记-arXiv2025-Cold-Start Recommendation towards the Era of Large Language Models: A Comprehensive Survey and Roadmap 面向大语言模型&#xff08;LLMs&#xff09;时代的冷启动推荐&#xff1a;全面调研与路线图1.引言2.前言3.内容特征3.1数据不完整学习3.1.1鲁棒…

C#使用WMI获取控制面板中安装的所有程序列表

C#使用WMI获取控制面板中安装的所有程序列表 WMI 全称Windows Management Instrumentation,Windows Management Instrumentation是Windows中用于提供共同的界面和对象模式以便访问有关操作系统、设备、应用程序和服务的管理信息。如果此服务被终止&#xff0c;多数基于 Windo…

风光并网对电网电能质量影响的matlab/simulink仿真建模

这个课题早在一几年的时候比较热门&#xff0c;之前作电科院配电网的一个项目中也有所涉及&#xff0c;我把其中一部分经典仿真模型思路分享给大家&#xff0c;电能质量影响这部分&#xff0c;我在模型中主要体现的就是不同容量的光伏、风电接入&#xff0c;对并网点的电压影响…

.Net Core微服务入门全纪录(六)——EventBus-事件总线

系列文章目录 1、.Net Core微服务入门系列&#xff08;一&#xff09;——项目搭建 2、.Net Core微服务入门全纪录&#xff08;二&#xff09;——Consul-服务注册与发现&#xff08;上&#xff09; 3、.Net Core微服务入门全纪录&#xff08;三&#xff09;——Consul-服务注…

C#防止重复提交

C#防止重复提交 文章目录 C#防止重复提交前言防止重复提交的思路Web API 防止重复提交代码实现代码讲解使用方法 MVC防止重复提交总结 前言 当用户在前端进行提交数据时&#xff0c;如果网络出现卡顿和前端没有给出响应的话顾客通常都会狂点提交按钮&#xff0c;这样就很容易导…

python学opencv|读取图像(三十九 )阈值处理Otsu方法

【1】引言 前序学习了5种阈值处理方法&#xff0c;包括(反)阈值处理、(反)零值处理和截断处理&#xff0c;还学习了一种自适应处理方法&#xff0c;相关文章链接为&#xff1a; python学opencv|读取图像&#xff08;三十三&#xff09;阈值处理-灰度图像-CSDN博客 python学o…

嵌入式硬件篇---PID控制

文章目录 前言第一部分&#xff1a;连续PID1.比例&#xff08;Proportional&#xff0c;P&#xff09;控制2.积分&#xff08;Integral&#xff0c;I&#xff09;控制3.微分&#xff08;Derivative&#xff0c;D&#xff09;控制4.PID的工作原理5..实质6.分析7.各种PID控制器P控…

日志收集Day001

1.ElasticSearch 作用&#xff1a;日志存储和检索 2.单点部署Elasticsearch与基础配置 rpm -ivh elasticsearch-7.17.5-x86_64.rpm 查看配置文件yy /etc/elasticsearch/elasticsearch.yml&#xff08;这里yy做了别名&#xff0c;过滤掉空行和注释行&#xff09; yy /etc/el…

《offer 来了:Java 面试核心知识点精讲 -- 框架篇》(附资源)

继上篇文章介绍了《offer 来了&#xff1a;Java 面试核心知识点精讲 -- 原理篇》书后&#xff0c;本文章再给大家推荐兄弟篇 《offer来了&#xff1a;Java面试核心知识点精讲--框架篇》&#xff0c; 简直就是为Java开发者量身定制的面试神器。 本书是对Java程序员面试中常见的…

Low-Level 大一统:如何使用Diffusion Models完成视频超分、去雨、去雾、降噪等所有Low-Level 任务?

Diffusion Models专栏文章汇总:入门与实战 前言:视频在传输过程中常常因为各种因素(如恶劣天气、噪声、压缩和传感器分辨率限制)而出现质量下降,这会严重影响计算机视觉任务(如目标检测和视频监控)的性能。现有的视频修复方法虽然取得了一些进展,但通常只能针对特定的退…

Video-RAG:一种将视频RAG新框架

1. 摘要及主要贡献点 摘要&#xff1a; 检索增强生成&#xff08;RAG&#xff09;是一种强大的策略&#xff0c;通过检索与查询相关的外部知识并将其整合到生成过程中&#xff0c;以解决基础模型生成事实性错误输出的问题。然而&#xff0c;现有的RAG方法主要集中于文本信息&…

Docker Load后存储的镜像及更改镜像存储目录的方法

Docker Load后存储的镜像及更改镜像存储目录的方法 Docker Load后存储的镜像更改镜像存储目录的方法脚本说明注意事项Docker作为一种开源的应用容器引擎,已经广泛应用于软件开发、测试和生产环境中。通过Docker,开发者可以将应用打包成镜像,轻松地进行分发和运行。而在某些场…

Amazon MSK 开启 Public 访问 SASL 配置的方法

1. 开启 MSK Public 1.1 配置 MSK 参数 进入 MSK 控制台页面&#xff0c;点击左侧菜单 Cluster configuration。选择已有配置&#xff0c;或者创建新配置。在配置中添加参数 allow.everyone.if.no.acl.foundfalse修改集群配置&#xff0c;选择到新添加的配置。 1.2 开启 Pu…

Windows FileZila Server共享电脑文件夹 映射21端口外网连接

我有这样一个使用场景&#xff0c;在外部网络环境下&#xff0c;通过手机便捷地读取存储在电脑上的视频文件。比如在外出旅行、出差&#xff0c;身边没有携带电脑&#xff0c;仅依靠手机设备&#xff0c;就能随时获取电脑里存储的各类视频&#xff0c;无论是学习资料视频、工作…