惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

C
Check Point Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
GbyAI
GbyAI
WordPress大学
WordPress大学
月光博客
月光博客
V
Visual Studio Blog
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Google DeepMind News
Google DeepMind News
H
Help Net Security
MongoDB | Blog
MongoDB | Blog
P
Proofpoint News Feed
博客园 - 司徒正美
S
SegmentFault 最新的问题
Apple Machine Learning Research
Apple Machine Learning Research
Blog — PlanetScale
Blog — PlanetScale
B
Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Microsoft Azure Blog
Microsoft Azure Blog
V
V2EX
L
LangChain Blog
腾讯CDC
T
The Blog of Author Tim Ferriss
量子位

kshao-blog-前端知识记录

win or mac clash 无 TUN 让 Antigravity、Chrome 强制 proxy(解决 Antigravity 无法加载选择 model、自动更新无法登录、跳转) 【大杂烩】在 pnpm 中直接修改 node_modules(.pnpm) 中的依赖项,项目中持久化 - pnpm 中的依赖处理、幽灵依赖、寻址规则等 在 html 中直接使用 Esm、Jsx 脚本快速调试和使用 React@19 和 Vue@3 源码,解决 React19 UMD 构建等问题 一键在本地批量检测并升级更新 package.json 中的模块依赖,ncu(npm-check-updates)在 npm、pnpm 或 workspace 项目中的使用教程 解决 Mac Docker Desktop 中启动出现的问题合集 通过阿里云、腾讯云无服务器搭建自定义的企业域名邮箱,实现在 QQ邮箱 收发等功能(附腾讯 SMTP 和 IMAP) 解决使用代理(clash 等)进行 SSH 连接(如 Github ssh key clone/push)出现 kex_exchange_identification 错误 静态文件资源 cdnjs, jsdelivr 抖音字节国内快速 CDN 镜像推荐【2025】- 仍在使用 bootcdn 和 staticfile CDN 请注意验证资源的完整性(SRI) pnpm monorepo 中管理依赖的最佳实践,与 Catalogs(目录)协议的使用(monorepo 中统一版本管理) Web 安全中的 Secure Contexts(安全上下文)- 解决在本地中使用 clipboard 或 Crypto 等 API 限制或关闭上下文限制 使用 serve 配合 openssl 或 mkcert 创建本地自签名可信任的证书 - 创建本地 TLS\SSL https 协议服务 利用 Github Actions 和 Acme 自动申请、更新和部署至阿里云、腾讯云 CDN Lets Encrypt SSl\TLS ECC RSA 双证书 【CSS】解决在 flex 容器中使用 align-content 或 justify-content 属性 center 居中时的溢出滚动和截断问题 - 理解 safe 关键字 在线工具 - 一键获取下载抖音无水印视频、抖音去水印解析工具、下载抖音无水印高清图集【2025 最新】 【React Router】v6 data router 在非组件(或工具方法)中如何优雅的跳转路由 【React】为什么路由跳转时页面滚动高度不会被重置(保留上个页面高度)?理解 history scrollRestoration 的场景与使用,以及如何使用 React Router 重置和跳转前保留滚动高度 【React】在本地 Html 中快速 debug(调试)React 源码 【React】结合源码和 EventLoop 分析 - 为什么 useLayoutEffect 会阻止 DOM 重绘(而 useEffect 闪烁)?为什么其内部 useState 会“同步”执行? React Compiler - 解放在函数中编程时的性能焦虑(React Conf 2024)附 Next 在线演示 在 github actions 中获取时间,并转换为中国标准时间(中国时区) 【npm】npm ci - npm clean install,在 CI、CD 中保持构建的一致性和可重复性 eslint 9.x 升级或使用指南,eslint.config.js 配置,包含 react、typescript、prettier 等常用配置升级迁移 使用 Spicetify 自定义 Spotify - 歌词翻译、全屏展示、主题替换 在 node 中快速代理请求(Proxy),解决跨域或请求转发问题 - http-proxy-middleware 修改请求体和返回 在 Hexo 中使用 AI(Gemini、deepseek、Azure)生成文章摘要,支持自定义模板。hexo-ai-summaries 插件文档(默认适配主题 Butterfly) 解决在 webstorm 或 idea 等 jetbrains 工具中遇到 Git 无法 force push,或 force push 灰色禁用无法点击(protected branches) hexo-seo-submit,Hexo 博客 SEO 优化插件 - 每日定时自动或手动提交链接至百度、Bing、Google,支持 Github Actions 和 Coding Jenkins 等CI(Hexo 插件编写) 一文吃透 pnpm 如何使用 workspace 构建 monorepo,与 npm、yarn 的用法对比(pnpm 9.x 内部安装依赖问题 link-workspace-packages) 【Node】Corepack - 解决 pnpm 或 yarn 的多版本管理、解决本地版本与 packageManager 中的版本一致性问题 解决 npm、cnpm 或 pnpm install 遇到 certificate has expired (证书已过期)
css 指定方向模糊 - 鸿蒙开机效果(animation 事件)
kshao · 2021-07-27 · via kshao-blog-前端知识记录
<svg>
  <filter id="blur">
    <feGaussianBlur in="SourceGraphic" stdDeviation="0 2" />
  </filter>
</svg>

直截了当,没错是用 svg 来实现,其实 css 的样式与 svg 还是蛮接近的(一模一样)

效果

使用

未使用(使用 blur)

鸿蒙开机效果

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8" />
  <title>Title</title>
</head>

<style>
  body {
    margin: 0;
    height: 100vh;
    display: block;
  }

  .ct-circle-content {
    --circle-width: 100px;
    --circle-height: 100px;
    display: flex;
    flex-direction: column;
    gap: 16px;
    margin: 100px auto;
    width: 30%;
    height: 40%;
  }

  .ct-circle-container {
    display: flex;
    align-items: center;
    justify-content: center;
    background: black;
  }

  .circle-wrap {
    width: var(--circle-width, 100px);
    height: calc(var(--circle-height) / 2);
    padding: 40px;
    overflow: hidden;
  }

  .circle {
    height: var(--circle-height);
    border: 10px solid #fff;
    border-radius: 50%;
    box-shadow: 0 0 10px 0 #fff, inset 0 0 10px 0 #fff;
    box-sizing: border-box;
  }

  .circle-wrap:first-of-type {
    padding-bottom: 0;
  }

  .circle-wrap:first-of-type .circle {
    transform: translateY(calc(var(--circle-height) / 2));
    animation: 1.2s ease forwards;
    animation-name: move;
  }

  .circle-wrap:last-of-type {
    transform: rotate(180deg);
    padding-bottom: 0;
  }

  .circle-wrap:last-of-type .circle {
    transform: translateY(calc(var(--circle-height) / 2));
    /* animation-fill-mode:forwards;指定动画在结束时如何处理,forwards 为保持动画在结束后保持最终状态 */
    animation: 1.2s ease forwards;
    animation-name: move;
    filter: url(#blur);
  }

  svg {
    width: 0;
    height: 0;
  }

  @keyframes move {
    to {
      transform: translateY(0px);
    }
  }
</style>

<body>
<div class="ct-circle-content">
  <div class="ct-circle-actions">
    <button class="ct-circle-start">start</button>
    <button class="ct-circle-pause">pause</button>
  </div>

  <div class="ct-circle-container">
    <div class="ct-circle-wrap">
      <div class="circle-wrap">
        <div class="circle"></div>
      </div>

      <div class="circle-wrap">
        <div class="circle"></div>
      </div>
    </div>

    <svg class="ct-circle-blur">
      <filter id="blur">
        <feGaussianBlur in="SourceGraphic" stdDeviation="0 2" />
      </filter>
    </svg>
  </div>
</div>
</body>

<script>
  // 清除 svg 模糊
  const svgBlur = document.querySelector('#blur feGaussianBlur');
  const startButton = document.querySelector('.ct-circle-start');
  const pauseButton = document.querySelector('.ct-circle-pause');
  const firstCircle = document.querySelector('.circle-wrap:first-of-type .circle');
  const lastCircle = document.querySelector('.circle-wrap:last-of-type .circle');
  const animationRunStatusMap = {
    running: 'running',
    paused: 'paused',
    start: 'start',
    end: 'end'
  }
  let animationRunStatus;
  let blurValue = 2;

  const getCurrentElBlur = () => {
    return svgBlur.getAttribute('stdDeviation').split(' ')[1];
  };

  const setCircleRunStatus = (status) => {
    document.querySelector('.circle-wrap:first-of-type .circle').style.animationPlayState =
      status;
    document.querySelector('.circle-wrap:last-of-type .circle').style.animationPlayState = status;
  };

  const clearBlur = () => {
    if (animationRunStatus === animationRunStatusMap.paused) {
      return;
    }
    if (animationRunStatus === animationRunStatusMap.end) {
      blurValue = 0;
      svgBlur.setAttribute('stdDeviation', `0 0`);
      return;
    }

    const value = getCurrentElBlur() - 0.01;
    blurValue = value;
    if (value > 0 && animationRunStatus === animationRunStatusMap.running) {
      svgBlur.setAttribute('stdDeviation', `0 ${value}`);
    } else {
      return;
    }
    requestAnimationFrame(clearBlur);
  };

  startButton.addEventListener('click', () => {
    if (animationRunStatus === animationRunStatusMap.running) {
      return;
    }

    if (blurValue === 0) {
      firstCircle.style.animationName = 'none';
      lastCircle.style.animationName = 'none';
      svgBlur.setAttribute('stdDeviation', `0 2`);
      lastCircle.offsetWidth;
      firstCircle.style.animationName = 'move';
      lastCircle.style.animationName = 'move';
    } else {
      setCircleRunStatus('running');
      clearBlur();
    }
  });

  pauseButton.addEventListener('click', () => {
    if (animationRunStatus !== animationRunStatusMap.running) {
      return;
    }

    animationRunStatus = animationRunStatusMap.paused;

    setCircleRunStatus('paused');
  });

  lastCircle.addEventListener('animationstart', (event) => {
    console.log('animationstart', event);
    animationRunStatus = animationRunStatusMap.running;
    clearBlur();
  });

  lastCircle.addEventListener('animationend', (event) => {
    console.log('animationend', animationRunStatus, event);
    animationRunStatus = animationRunStatusMap.end;
    blurValue = 0;
    clearBlur();
  });
</script>
</html>

版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 kshao-blog-前端知识记录

赞助

  • 微信

    微信

  • 支付宝

    支付宝


avatar

kshao

免费服务器,kshao-blog,seo,面试题,前端,vue,react,JavaScript,js,html,css,less

Follow Me