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

news2024/12/25 9:06:04

一、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月是3
    const 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.coloradmin.cn/o/1644297.html

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

相关文章

[贪心] 带期限的作业调度问题

照学校ppt上写&#xff1a; #include<iostream> #include<algorithm> using namespace std;int n;struct Job {int D;int P;bool operator<(Job& j){if(Pj.P)return D<j.D;return P > j.P;} };Job Jobs[1000005]; int J[1000005];int main() {scanf(…

Fourier 测试时间自适应与多级一致性用于鲁棒分类

文章目录 Fourier Test-Time Adaptation with Multi-level Consistency for Robust Classification摘要方法实验结果 Fourier Test-Time Adaptation with Multi-level Consistency for Robust Classification 摘要 该研究提出了一种名为 Fourier 测试时间适应&#xff08;FTT…

目标检测正负样本区分和平衡

1、正负样本定义 rpn和rcnn的正负样本定义都是基于MaxIoUAssigner&#xff0c;只不过定义阈值不一样而已。 MaxIoUAssigner的操作包括4个步骤&#xff1a; 首先初始化时候假设每个anchor的mask都是-1&#xff0c;表示都是忽略anchor 将每个anchor和所有gt的iou的最大Iou小于…

【iOS】KVO

文章目录 前言一、KVO使用1.基本使用2.context使用3.移除KVO通知的必要性4.KVO观察可变数组 二、代码调试探索1.KVO对属性观察2.中间类3.中间类的方法3.dealloc中移除观察者后&#xff0c;isa指向是谁&#xff0c;以及中间类是否会销毁&#xff1f;总结 三、KVO本质GNUStep窥探…

Rust语言系统编程实战(小北学习笔记)

前言 进入大学以来&#xff08;计算机应用技术——大数据方向&#xff09;&#xff0c;就像很多程序猿&#x1f412;一样&#xff0c;小北开始每学期学习一种新的编程语言。通过学习另一个编程语言&#xff0c;可以了解很多规范和规则&#xff0c;并得到了一些想法&#xff0c;…

【Linux】目录和文件相关的命令,补充:centos7系统目录结构

【Linux】Linux操作系统的设计理念之一就是“一切皆文件”&#xff08;Everything is a file&#xff09;&#xff0c;即将设备、文件等都当作“文件”处理。 “文件”主要类型有&#xff1a;目录&#xff08;即文件夹&#xff09;&#xff0c;链接文档&#xff08;即快捷方式…

物联网小demo

机智云生成代码 具体参考之前的文章 初始化 ADC用来使用光敏电阻 连续采样开启 采样的周期调高 定时器 定时器1用来实现延时 为了只用温湿度模块DHT11 定时器4用来和51进行交互 实现定时的发送和检测心跳信号 IIC 用来使用oled屏幕 USART 串口1和串口2是机智云自己…

第二代增强-创建采购申请时的增强

文章目录 第二代增强-创建采购申请时的增强业务要求实现过程创建项目编写代码激活增强 维护消息类运行效果断点关键点另一种形式的错误提示-出口函数EXIT_SAPLMEREQ_005运行结果 第二代增强-创建采购申请时的增强 业务要求 实现过程 创建项目 编写代码 "AFNAM&#xff0c…

Flutter笔记:Widgets Easier组件库(11)- 使用提示吐丝

Flutter笔记 Widgets Easier组件库&#xff08;11&#xff09;使用提示吐丝 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite&#xff1a;http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this …

C#核心之面向对象-多态

面向对象-多态 文章目录 1、Vob1、多态的概念2、多态的实现 2、抽象类和抽象方法1、抽象类2、抽象方法 3、接口1、接口的概念2、接口的声明3、接口的使用4、接口可以继承接口5、显示实现接口总结思考 电脑使用USB接口读取数据 4、密封方法 1、Vob 1、多态的概念 多态&#xf…

libmodbus使用

安装可以看这个博客&#xff1a; https://blog.csdn.net/hanhui22/article/details/105786762 它的安装可以&#xff0c;但是编译测试看不太懂&#xff0c;我没跟着它的编译&#xff0c;完了后把/lib下的 放到开发板的/usr/lib下 编写代码: #include <stdio.h> #inclu…

研究论文的蓝图:精通论文大纲的编写技巧

研究论文大纲是一个补充文件&#xff0c;描述了按计划顺序纳入论文的所有主题&#xff0c;通常按段落分割。正常的研究论文大纲包括额外的细节&#xff0c;例如子主题和证据来源&#xff0c;以帮助作者保持结构。本文讨论了研究论文大纲的内容以及如何撰写。 研究论文大纲的含…

【AI】指定python3.10安装Jupyter Lab

家里电脑 13900K, bash 不识别pythoncmd可以,但是cmd似乎默认是python2.7这个是webrtc构建需要的.python3 则可以识别到但是版本是python3.12*多个版本如何通过制定的python3.10 的pip来安装软件,例如Jupyter Lab安装3.10 C:\Users\zhangbin\AppData\Roaming\Microsoft\Windo…

中国各地级市城投债详细数据(2006年-2023年2月)

01、数据简介 城投债又称为准市政债&#xff0c;发行主体是地方ZF投资平台&#xff0c;公开发行企业债和中期票据&#xff0c;其业主一般是地方基础设施建设&#xff0c;或者公益性项目主体&#xff0c;参与债券发行环节的当地ZF发债。 数据整理中国各地级市的城投债详细数据…

Inflate动态Huffman解压缩

上个已经实现GZIP压缩文件格式的Inflate静态Huffman解压&#xff0c;这个实现Inflate的无压缩输出和动态Huffman解压。 Java语言实现&#xff0c;Eclipse下编写。 范式Huffman解码实现&#xff0c;输入huffman编码&#xff0c;输出原始数据 // 范式huffman解码static class C…

推荐一个开源的MES系统

软件介绍 HM-MES是一款旨在帮助工厂实现生产计划、工艺管理和质量控制的工业生产管理软件。该软件基于Java Web技术和MySql数据库开发&#xff0c;拥有简洁、易用、安全和稳定等特点&#xff0c;适用于广泛的生产管理场景。 功能描述 1.产品和原材料双向溯源&#xff0c;支持二…

练习题(2024/5/3)

1对称二叉树 给你一个二叉树的根节点 root &#xff0c; 检查它是否轴对称。 示例 1&#xff1a; 输入&#xff1a;root [1,2,2,3,4,4,3] 输出&#xff1a;true示例 2&#xff1a; 输入&#xff1a;root [1,2,2,null,3,null,3] 输出&#xff1a;false提示&#xff1a; 树中…

meshlab: pymeshlab计算两个模型的布尔交集(mesh boolean intersection)

一、关于环境 请参考&#xff1a;pymeshlab遍历文件夹中模型、缩放并导出指定格式-CSDN博客 二、关于代码 本文所给出代码仅为参考&#xff0c;禁止转载和引用&#xff0c;仅供个人学习。 本案例以两个圆环为例。 左侧为两个圆环&#xff0c;右上是重叠&#xff0c;右下是圆…

斯坦福开源端侧大模型Octopus v2,2B参数量可在移动端运行,性能超越GPT-4,准确率超Llama7B

前言 斯坦福大学研究人员近日推出了开源端侧大模型Octopus v2&#xff0c;引起了广泛关注。Octopus v2拥有20亿参数量&#xff0c;可以在智能手机、车载系统等终端设备上高效运行&#xff0c;在准确性和推理速度方面都超越了GPT-4。 Huggingface模型下载&#xff1a;https://h…

力扣每日一题113:路径总和||

题目 中等 给你二叉树的根节点 root 和一个整数目标和 targetSum &#xff0c;找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。 叶子节点 是指没有子节点的节点。 示例 1&#xff1a; 输入&#xff1a;root [5,4,8,11,null,13,4,7,2,null,null,5,1], targetSu…