工作问题记录React(持续更新中)

一、backdrop-filter:blur(20px);

毛玻璃效果,在安卓机上有兼容问题,添加兼容前缀也无效;
解决方案:让设计师调整渐变,不要使用该属性!

在这里插入图片描述

复制代码

background: radial-gradient(33% 33% at 100% 5%, #e9e5e5 0%, rgba(254, 251, 243, 0) 100%),radial-gradient(54% 54% at -5% 6%,#d2d1cf 0%,#ebe9e2 30%,#fdfaf0 42%,rgba(255, 255, 255, 0) 100%),linear-gradient(160deg, #edeae3 0%, #fffdfe 31%, #ffeff7 94%),linear-gradient(180deg, rgba(255, 255, 255, 0.6) 0%, #ffffff 32%);

二、如何实现倒计时效果

首先我们需要一个时间差,并且这个差值根据现在的差值一直在递减
其次我们需要维护一个时间状态,每隔一秒钟就需要更新这个状态从而触发页面的更新
JavaScript
复制代码

useEffect(()=>{let timer = null;// 注意月份是从0开始的,所以4月是3const targetTime = new Date(2024, 3, 20, 20, 0, 0).getTime();timer = setInterval(() => {const currentTime = new Date().getTime();if (new Date(2024, 3, 20, 0, 0, 1).getTime() >= new Date(2024, 3, 20, 0, 0, 0).getTime()) {setShowCount(true);} else {return;}const remainingTime = targetTime - currentTime;if (remainingTime >= 0) {const total = remainingTime / 1000; // 剩余秒数const hh = parseInt(total / (60 * 60)); // 剩余小时const day = parseInt(hh / 24); // 剩余天数const h = hh - parseInt(day * 24);const mm = parseInt((total - hh * 60 * 60) / 60); // 剩余分钟const ss = parseInt(total % 60); // 剩余秒setTime({day,h,m: mm,s: ss,});} else {clearInterval(timer);}}, 1000);return () => {if (timer) clearInterval(timer);};
},[]);
<View className="header">距离直播开始{time.day}天{time.h}小时{time.m.toString().padStart(2, '0')}分钟{time.s.toString().padStart(2, '0')}秒钟
</View>

三、如何实现两个动画丝滑的切换

大概的思路基本上是只针对url的切换,但是只是这样局部更新url 并不会引起容器里动画的更新

const initLottieRef = useRef();// 展示动画的容器
const [url, setUrl] = useState('https://g.alicdn.com/ani-assets/1bb995ac4ad001ab8f091e412dc5e7c0/0.0.1/lottie.json',
);
const curlt = useRef();// 用来接第一个动画实例
useEffect(() => {curlt.current = lottie.loadAnimation({container: initLottieRef.current,renderer: 'svg',loop: true,autoplay: true,path: url, // 替换为你的第一个动画的 JSON 文件路径});
}, [url]);const onClick = () => {// 停止第一个动画并移除其容器curlt.current.stop();// 清空容器以移除第一个动画initLottieRef.current.innerHTML = ''; // 初始化并显示第二个动画setUrl('https://g.alicdn.com/ani-assets/93cbb9eeb82ff32a1fd746bc7a284e04/0.0.1/lottie.json');};

四、弹窗组件如何阻止点击滚动穿透

蒙层级别提高,在容器点击阻止冒泡和默认行为

onClick={(e) => e.stopPropagation()}
onTouchMove={(e) => e.preventDefault()}设置了这个可能回影响本身的滚动
const onAppear = () => {// 防止蒙层滚动穿透document.body.style.overflow = 'hidden';goldlog.realtime('pending-payment-prompt-pop', 'EXP', 'pending-payment-prompt-pop-express');};const onClose = () => {setIsShow(false);document.body.style.overflow = 'auto';};

五、实现淡入淡出

用原生js 动态添加类名的方式试了好久,还是不行
reatc 组件有自己的更新机制,即使添加上了类名但没有遵守react 更新规则并不会触发更新

<div className={`${classlist.join(' ')}`} ></div>
const [classlist, setClasslist] = useState(['container', 'show-pop']);
const onClose = () => {goldlog.realtime('equity-comparison-pop', 'CLK', 'equity-comparison-pop-close');setClasslist(['container', 'hide-pop']);setTimeout(() => {setIsShow(false);document.body.style.overflow = 'auto';setClasslist(['container', 'show-pop']);}, 300);};
.show-pop {animation: show-pop 0.3s ease-in-out forwards;
}
.hide-pop {animation: hide-pop 0.3s ease-in-out forwards;
}@keyframes show-pop {0% {transform: translateY(100%); /* 初始位置:屏幕底部之外 */opacity: 0; /* 初始透明度为0,实现淡入效果 */}100% {transform: translateY(0); /* 结束位置:屏幕顶部 */opacity: 1; /* 结束透明度为1,完全显示 */}
}@keyframes hide-pop {0% {transform: translateY(0); /* 结束位置:屏幕顶部 */opacity: 1; /* 结束透明度为1,完全显示 */}100% {transform: translateY(100%); /* 初始位置:屏幕底部之外 */opacity: 0; /* 初始透明度为0,实现淡入效果 */}
}

六、实现骨架屏

先上关键代码

 background: linear-gradient(90deg,rgba(190, 190, 190, 0.2) 25%,rgba(129, 129, 129, 0.24) 37%,rgba(190, 190, 190, 0.2) 63%);background-size: 400% 100%;animation: skeleton 1.4s ease infinite; @keyframes skeleton {0% {background-position: 0% 0%;}100% {background-position: 100% 0%;}}

为什么这样能实现?
以下是这段代码的工作原理:

背景渐变: background: linear-gradient(90deg, …); 定义了一个从左到右的线性渐变。渐变中有三个颜色停止点:

rgba(190, 190, 190, 0.2) 25%: 在25%的位置,颜色为浅灰色,透明度为20%。
rgba(129, 129, 129, 0.24) 37%: 在37%的位置,颜色为深灰色,透明度为24%。
rgba(190, 190, 190, 0.2) 63%: 在63%的位置,再次变为浅灰色,透明度为20%。 这样的渐变在视觉上产生了一种类似条纹的效果,模拟数据加载时的动态感。
背景尺寸: background-size: 400% 100%; 设置背景的尺寸为元素宽度的400%。这使得背景图像是元素宽度的4倍,为动画提供了足够的空间。

动画: animation: skeleton 1.4s ease infinite; 应用名为skeleton的动画,持续时间为1.4秒,缓动函数为ease(意味着动画开始和结束时速度较慢,中间速度快),并且无限循环。

@keyframes定义了一个动画,从0%到100%的动画过程中,背景的位置从0%平移到100%,即从左到右移动一个完整背景的长度。由于背景尺寸是元素宽度的400%,所以在动画过程中,这个条纹效果会来回移动,模拟数据加载的进度。

这个简单动画组合起来就形成了一个骨架屏效果,给人一种数据正在加载的感觉。当然,真正的骨架屏通常会包含更复杂的形状和元素来匹配页面的实际布局。

七、隐藏滚动条

 <style>{` #scroll-list::-webkit-scrollbar { display: none }`}</style><div className="root" id="scroll-list">

八、实现吸顶效果

使用粘性定位来实现,他的参考点是距离它最近的一个拥有滚动机制的祖先元素,不设置默认就是当前窗口

  position: -webkit-sticky; /* Safari */position: sticky;top: 30px;

九、实现回到顶部,按钮带动画效果

按钮实现从右向左出现,从左向右消失

import React, { useState, useEffect } from 'react';
import './styles.css'; // 引入样式const ScrollToTopButton = () => {const [isVisible, setIsVisible] = useState(false);const [isAnimating, setIsAnimating] = useState(false);const scrollToTop = () => {window.scrollTo({ top: 0, behavior: 'smooth' });};useEffect(() => {const toggleVisibility = () => {if (window.pageYOffset > 300) {setIsVisible(true);setIsAnimating(true);} else {setIsAnimating(false);setTimeout(() => {setIsVisible(false);}, 1000); // 动画持续时间加一点延迟,确保动画完成后再重置}};window.addEventListener('scroll', toggleVisibility);// 清理函数,移除滚动事件监听器return () => window.removeEventListener('scroll', toggleVisibility);}, [])return ({isVisible && <button className={`back-top ${isAnimating ? 'fade-in-right' : 'fade-out-left'}`} onClick={scrollToTop}>top</button>});
};export default ScrollToTopButton;
.fade-in-right {animation: fade-in-right 1s ease-in-out forwards;
}.fade-out-left {animation: fade-out-left 1s ease-in-out forwards;
}@keyframes fade-in-right {0% {transform: translateX(100%);opacity: 0;}100% {transform: translateX(0);opacity: 1;}
}@keyframes fade-out-left {0% {transform: translateX(0);opacity: 1;}100% {transform: translateX(100%);opacity: 0;}
}

十、轮播

滚动的方式:
1 transform
2 scrollto
3 绝对定位移动left
困惑 :滚完就反向弹回了第一个,怎么让他继续滚?
要解决视觉上回弹的问题只需要在滚到最初位置的时候取消过渡效果

import React, { useEffect, useRef } from 'react';
import './index.css'; // 假设你有一个外部CSS文件来定义样式const Slider = () => {const images = ['1', '2', '3', '4']const currentIndex = useRef(0);const sliderRef = useRef(null);// 自动切换到下一张的逻辑useEffect(() => {const timer = setInterval(() => {const nextIndex = currentIndex.current === images.length - 1 ? 0 : currentIndex.current + 1;const translateX = nextIndex * -100 + '%'; // 假设每张图片占据100%的宽度。sliderRef.current.style.transform = `translateX(${translateX})`;if (translateX === '0%') {sliderRef.current.style.transition = '';//取消过渡视觉上不会出现反向滚动} else {sliderRef.current.style.transition = 'transform 0.5s ease-in-out';}currentIndex.current = nextIndex;}, 2000);// 清理函数,防止内存泄漏return () => {clearInterval(timer);};}, []);return (<div ref={sliderRef} ><div style={{ display: 'flex' }}>{images.map((image, index) => (<div style={{ width: '100%', height: 100, border: '1px solid red', flexShrink: 0, boxSizing: 'border-box' }}>slide {index + 1}</div>))}</div></div>);
};export default function App() {return (<div className="App"><Slider /></div>);
}

十一、下拉刷新

import React, { useState, useEffect, useRef } from 'react';
import './index.css';let startY;
// 提取防抖函数到组件外
const debounce = (func, wait) => {let timeout;return function (...args) {clearTimeout(timeout);timeout = setTimeout(() => {try {func.apply(this, args);} catch (error) {console.error('Error in debounced function:', error);}}, wait);};
};
const MyComponent = () => {const scrollRef = useRef(null);const [loading, setLoading] = useState(false);const [refresh, setRefresh] = useState(false);const fetachData = () => new Promise(resolve => setTimeout(() => {console.log('数据刷新完成');setLoading(false);resolve();}, 1000));const fetchNewData = debounce(async () => {await fetachData();}, 500); // 防抖延迟时间const onTouchStart = (e) => {startY = e.touches[0].clientY;}const onTouchmove = (e) => {requestAnimationFrame(() => { // 使用 requestAnimationFrame 优化const moveY = e.touches[0].clientY;const diffY = moveY - startY;scrollRef.current.style.transform = `translateY(${diffY > 100 ? 100 : diffY}px)`;if (diffY > 90) {setRefresh(true);// 发起请求if (!loading) {setLoading(true);fetchNewData();}}});};const onTouchend = () => {requestAnimationFrame(() => { // 使用 requestAnimationFrame 优化scrollRef.current.style.transform = `translateY(0)`;scrollRef.current.style.transition = 'transform 0.3s ease';setRefresh(false);setLoading(false);});}useEffect(() => {const element = scrollRef.current;element.addEventListener('touchstart', onTouchStart);element.addEventListener('touchmove', onTouchmove);element.addEventListener('touchend', onTouchend);return () => {element.removeEventListener('touchstart', onTouchStart);element.removeEventListener('touchmove', onTouchmove);element.addEventListener('touchend', onTouchend);};}, []);useEffect(() => {if (refresh && !loading) {setTimeout(() => {scrollRef.current.style.transform = `translateY(0)`;scrollRef.current.style.transition = 'transform 0.3s ease';setRefresh(false);}, 500)}}, [loading]);return (<div ref={scrollRef} >{refresh && <div className='top-container'>{loading ? '数据刷新中...' : '刷新成功了'}</div>}<div className='tabbar'>我是导航栏</div><div className='content'>{Array.from({ length: 10 }, (v, i) => {return <div key={i} className='content-item'>我是内容{i}</div>})}</div></div >);
};export default MyComponent;

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

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

相关文章

C++类定义时成员变量初始化

在C11中允许在类定义时对成员变量初始化。 class A { public:A() { }void show(){cout << "m_a " << m_a << endl;cout << "m_b " << m_b << endl;} private:int m_a 10;//类定义时初始化int m_b; //没有初始化…

Microsoft 365 for Mac(Office 365)v16.84正式激活版

office 365 for mac包括Word、Excel、PowerPoint、Outlook、OneNote、OneDrive和Teams的更新。Office提供了跨应用程序的功能&#xff0c;帮助用户在更短的时间内创建令人惊叹的内容&#xff0c;您可以在这里创作、沟通、协作并完成重要工作。 Microsoft 365 for Mac(Office 36…

Delta lake with Java--liquid clustering

网上说liquid clustering还是实验阶段&#xff0c;python和scala有对应的函数&#xff0c;java没有&#xff0c;只能用sql语句来建表&#xff0c;尝试了两天&#xff0c;遇到很奇怪的情况&#xff0c;先上代码&#xff1a; import io.delta.tables.DeltaTable; import org.apa…

HTML_CSS学习:浮动

一、浮动简介 相关代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>浮动_简介</title><style>div{width: 600px;height: 400px;background-color: #1c80d9;}img{float:…

智慧旅游引领旅游行业创新发展:借助智能科技的力量,实现旅游资源的优化配置和高效利用,推动旅游行业的转型升级和可持续发展

目录 一、引言 二、智慧旅游的定义与特点 1、信息化程度高 2、智能化服务丰富 3、互动性强 4、个性化服务突出 5、可持续性发展 三、智慧旅游在旅游行业创新发展中的作用 &#xff08;一&#xff09;优化旅游资源配置 &#xff08;二&#xff09;提升旅游服务质量 &…

VMware虚拟机下载安装教程【超详细】

推荐大佬文章&#xff1a;VMware下载安装教程(超详细)-CSDN博客 目录 一、VMware下载 二、VMware安装 一、VMware下载 1、进入VMware官网 2、点击“Products”&#xff0c;向下滑动 --> 选择“Workstation Pro” 3、向下滑动&#xff0c;找到并选择“Download VMware Wo…

智慧文旅展现文化新风貌,科技助力旅行品质升级:借助智慧技术,文旅产业焕发新生机,为旅行者带来更高品质的文化体验之旅

一、引言 在数字化、智能化的浪潮下&#xff0c;文旅产业正迎来前所未有的发展机遇。智慧文旅作为文旅产业与信息技术深度融合的产物&#xff0c;不仅为旅行者带来了全新的文化体验&#xff0c;也为文旅产业注入了新的活力。本文旨在探讨智慧文旅如何借助智慧技术展现文化新风…

pyinstaller打包pytorch和transformers程序

记录使用pyinstaller打包含有pytorch和transformers库的程序时遇到的问题和解决方法。 环境和版本信息 操作系统&#xff1a;Windows 11 Python&#xff1a;3.10.12 pyinstaller&#xff1a;5.13.0 torch&#xff1a;2.2.2 transformers&#xff1a;4.40.1 打包过程和问…

LLaMA详细解读

LLaMA 是目前为止&#xff0c;效果最好的开源 LLM 之一。精读 LLaMA 的论文及代码&#xff0c;可以很好的了解 LLM 的内部原理。本文对 LLaMA 论文进行了介绍&#xff0c;同时附上了关键部分的代码&#xff0c;并对代码做了注释。 摘要 LLaMA是一个系列模型&#xff0c;模型参…

深入理解 Java 并发:AbstractQueuedSynchronizer 源码分析

序言 在多线程编程中&#xff0c;同步机制是保障线程安全和协调线程之间操作顺序的重要手段。AQS 作为 Java 中同步机制的基础框架&#xff0c;为开发者提供了一个灵活且高效的同步工具。本文将通过对 AQS 源码的分析&#xff0c;解读 AQS 的核心实现原理&#xff0c;并深入探…

使用FastGPT+OneAPI在本地使用Llama3

FastGPT 是一个基于 LLM 大语言模型的知识库问答系统&#xff0c;提供开箱即用的数据处理、模型调用等能力。同时可以通过 Flow 可视化进行工作流编排&#xff0c;从而实现复杂的问答场景&#xff01;他的重要特点就是工作流编排。 工作流编排&#xff1a;基于 Flow 模块的工作…

微信小程序 uniapp家庭食谱菜谱食材网上商城系统小程序ko137

随着生活节奏的不断加快&#xff0c;越来越多的人因为工作忙而没有时间自己出去订购喜欢的菜品。随着Internet的飞速发展&#xff0c;网络已经成为我们日常生活中必不可少的部分&#xff0c;越来越多的人也接受了电子商务这种快捷、方便的交易方式。网上订餐其独有的便捷性和直…

口才训练:如何用声音和语言展现自我魅力

口才训练&#xff1a;如何用声音和语言展现自我魅力 这里有一篇1270字左右的文章&#xff0c;主要介绍如何用声音和语言来展现自我魅力&#xff1a; 口才训练是提升个人魅力的重要途径之一。魅力不仅取决于外表&#xff0c;更重要的是声音和语言的运用。良好的语言表达能力可以…

Spring扩展点(一)Bean生命周期扩展点

Bean生命周期扩展点 影响多个Bean的实例化InstantiationAwareBeanPostProcessorBeanPostProcessor 影响单个Bean的实例化纯粹的生命周期回调函数InitializingBean&#xff08;BeanPostProcessor 的before和after之间调用&#xff09;DisposableBean Aware接口在生命周期实例化过…

二叉树的实现(详解,数据结构)

目录 一&#xff0c;二叉树需要实现的功能 二&#xff0c;下面是各功能详解 0.思想&#xff1a; 1.创建二叉树结点&#xff1a; 2.通过前序遍历的数组"ABD##E#H##CF##G##"构建二叉树 3.二叉树销毁&#xff1a; 4.前序遍历&#xff1a; 5.中序遍历&#xff1a;…

RabbitMQ之顺序消费

什么是顺序消费 例如&#xff1a;业务上产生者发送三条消息&#xff0c; 分别是对同一条数据的增加、修改、删除操作&#xff0c; 如果没有保证顺序消费&#xff0c;执行顺序可能变成删除、修改、增加&#xff0c;这就乱了。 如何保证顺序性 一般我们讨论如何保证消息的顺序性&…

3GPP官网下载协议步骤

1.打开官网 https://www.3gpp.org/ 2.点击 3.在界面选择要找的series&#xff0c;跳转到查找界面 以V2X通信协议为例&#xff0c;论文中通常会看到许多应用&#xff1a; [7] “Study on evaluation methodology of new Vehicle-to-Everything (V2X) use cases for LTE and NR…

3.2Java全栈开发前端+后端(全栈工程师进阶之路)-前端框架VUE3框架-企业级应用- Vuex

Vuex简介 Vuex概述 Vuex是一个专门为Vue.js应用程序开发的状态管理模式, 它采用集中式存储管理所有组件的公共状态, 并以相应的规 则保证状态以一种可预测的方式发生变化. 试想这样的场景, 比如一个Vue的根实例下面有一个根组件名为App.vue, 它下面有两个子组件A.vue和B.vu…

022、Python+fastapi,第一个Python项目走向第22步:ubuntu 24.04 docker 安装mysql8集群、redis集群(三)

这次来安装mysql8了&#xff0c;以前安装不是docker安装&#xff0c;这个我也是第一次&#xff0c;人人都有第一次嚒 前言 前面的redis安装还是花了点时间的&#xff0c;主要是网上教程&#xff0c;各有各的好&#xff0c;大家千万别取其长处&#xff0c;个人觉得这个环境影响…

ASP.NET网上车辆档案管理系统

摘 要 本文采用基于Web的Asp.net技术&#xff0c;并与sql server 2000数据库相结合&#xff0c;研发了一套车辆档案管理系统。该系统扩展性好&#xff0c;易于维护。简化了车辆档案设计流程&#xff0c;去除了冗余信息。汽车销售企业可以通过本系统完成整个销售及售后所有档案…