呜啦!日常碎碎念,偶尔掉落优质前端博文推荐、学习资源等
网页:https://tg.cosine.ren
本频道的搜索Bot 来辣 👉 @cosSearchBot
私聊直接发消息就可以搜索啦~
🔖tags
#优质博文 #资源推荐 #博客更新 #碎碎念 #项目更新 #手工 #书摘 #阮一峰的科技周刊 #新动态
图频:Cosine 🎨 Gallery @CosineGallery
猫片: @cosine_cat
联系频道主:@cosine_yu
网页:https://tg.cosine.ren
本频道的搜索Bot 来辣 👉 @cosSearchBot
私聊直接发消息就可以搜索啦~
🔖tags
#优质博文 #资源推荐 #博客更新 #碎碎念 #项目更新 #手工 #书摘 #阮一峰的科技周刊 #新动态
图频:Cosine 🎨 Gallery @CosineGallery
猫片: @cosine_cat
联系频道主:@cosine_yu
#优质博文 #前端 #css #动画
Creating Scroll-Based Animations in Full view() | CSS-Tricks
以下是方便搜索索引的大纲(AI 生成),请读原文:
author Preethi
Creating Scroll-Based Animations in Full view() | CSS-Tricks
AI 摘要:本文深入探讨了 CSS animation-timeline 属性中的 view() 函数,它允许开发者创建基于元素在滚动容器(scrollport)中可见性(visibility)的动画。文章通过一个图片轮播(carousel)示例,详细演示了如何结合传统 CSS 动画、关键帧(keyframes)和 view() 函数,实现元素进入/退出视图时的缩放、模糊等动态效果。此外,文章还比较了 view() 与 scroll() 函数的区别,并介绍了 view() 函数的轴(axis)和插入(inset)参数,以及 animation-range 属性,帮助读者更精细地控制动画的触发时机和范围,为制作交互式滚动动画提供了实用的指导。
以下是方便搜索索引的大纲(AI 生成),请读原文:
1. view() 函数简介与核心概念
• animation-timeline 属性接受 view() 函数,实现基于元素可见性的动画。
• 类比 JavaScript 的 Intersection Observer,动画随元素进入和退出滚动视口(scrollport)而触发。
• 示例:图片轮播中,图片在中间时清晰放大,在边缘时模糊缩小。
2. 搭建基本布局
• 创建一个 <main> 元素作为 carousel 容器。
• 使用 flexbox 使图片横向排列,并设置 overflow-x: auto 实现滚动。
• 定义 carousel-slide 元素作为图片项,设置其宽度为容器的 1/3,实现一次显示三张图片。
3. 实现滚动与滚动捕捉(Scroll Snapping)
• 在 carousel 容器上设置 scroll-snap-type: x mandatory 实现滚动捕捉。
• 使用 scroll-behavior: smooth 实现平滑滚动(可选)。
• 设置 scrollbar-width: none 隐藏滚动条(可选)。
• 为 carousel-slide 设置 scroll-snap-align: center,确保图片居中对齐。
4. 创建基于视图的动画
• 定义 slide 关键帧动画,实现图片在不同阶段的缩放、圆角和模糊效果。
• 将 slide 动画应用于 carousel-slide 元素。
• 使用 animation-timeline: view(inline) 将动画绑定到元素的视图时间线。
• 强调 animation-timeline 需单独声明在 animation 速记属性之后,以避免被覆盖。
5. view() 与 scroll() 函数的比较
• view() 函数创建基于元素在容器中可见性的视图进度时间线,适用于元素特定的显示效果。
• scroll() 函数创建基于容器滚动位置的滚动进度时间线。
• view() 更适合实现当特定元素滚动到视口时触发的动画。
6. view() 函数的参数与 animation-range 属性
• view() 接受 axis (block, inline, x, y)和 inset 参数。
• inset 参数定义滚动视口边缘的偏移量,精确控制动画触发范围。
• animation-range 属性进一步控制动画的开始和结束点,可使用 entry、exit、cover、contain 等关键词。
• 示例:通过 inset 控制动画在元素从底部进入滚动视口时才开始。
7. 创意轮播动画拓展
• 鼓励探索更多 CSS 属性的动画可能性,如背景位置(background position)动画,创造独特的轮播效果。
• 提及注册 CSS 属性(registered CSS properties)可以使更多属性动画化。
author Preethi
#优质博文 #CSS #Tailwind #前端
Tailwind CSS: Targeting Child Elements (when you have to)
以下是方便搜索索引的大纲 (AI 生成),请读原文:
author Christian Ekrem
Tailwind CSS: Targeting Child Elements (when you have to)
AI 摘要:本文探讨了在 Tailwind CSS 中如何针对无法直接控制的子元素(如来自 CMS 或第三方组件的内容)应用样式。尽管作者推荐在多数情况下使用传统的自定义 CSS 样式表,但文章详细介绍了如何利用 Tailwind 的任意变体 (Arbitrary Variants) 和 [&_selector] 语法来实现子元素样式控制。文中通过具体示例展示了如何使用 & 符号结合 CSS 选择器来定位直接子元素、所有后代元素以及处理伪状态 (pseudo-states),并讨论了这种方法适用的场景,最后通过一个实际案例(CMS 内容样式)对比了传统 CSS 和 Tailwind 方式的实现。
以下是方便搜索索引的大纲 (AI 生成),请读原文:
1. 遇到的问题:为什么需要定位子元素
• 传统 Tailwind CSS 的局限性:通常将工具类直接应用于元素,但对于无法控制的嵌套 HTML (如 CMS 内容) 无法直接应用。
• 典型场景:CMS 内容、第三方组件、动态生成的 HTML。
• 解决方案预告:虽然普通 CSS 样式表是首选,但本文将探索 Tailwind CSS 的任意变体 (Arbitrary Variants) 方案。
2. 传统 CSS 解决方案
• 示例:使用 .cms-content a 等选择器为嵌套链接和列表项添加样式。
• 优点:简单、可读、易维护,通常是最佳实践。
3. Tailwind CSS 的任意变体 (Arbitrary Variants)
• 核心概念:使用方括号 [] 在类名中直接编写 CSS 选择器。
• 语法示例:[&_a]:font-semibold。
• & 符号的含义:在 Tailwind 任意变体中,& 代表当前应用类的元素,类似于 Sass/SCSS 或 CSS 嵌套中的 &。
• 生成的 CSS:通过 & 符号,Tailwind 会将类名自身转换为选择器,再拼接我们自定义的子元素选择器,从而实现后代元素样式控制。
4. 常见的子元素定位模式 (Common Patterns)
• 直接子元素 (Direct Children):使用 [&>div] 定位直接子元素,例如为所有直接 div 添加边框和内边距。
• 所有后代元素 (All Descendants):使用 [&_a] 定位所有后代元素,例如为所有链接添加悬停下划线。
• 子元素的伪状态 (Pseudo-states on Children):使用 [&>button:hover] 或 [&_input:disabled] 为子元素在特定状态下应用样式。
5. 何时选择使用任意变体 (When This Makes Sense)
• 场景一:已完全投入 Tailwind 生态,不愿切换到普通 CSS。
• 场景二:只需少量样式规则,为之创建单独的样式表显得过度。
• 场景三:构建流程难以集成额外 CSS 文件。
• 场景四:希望样式与渲染内容的组件协同放置。
• 注意:对于可控内容,直接应用 Tailwind 类依然是最佳实践。
6. 实际案例:CMS 内容样式
• 背景:处理来自无头 CMS 的预渲染 HTML,无法控制内部标记。
• 传统 CSS 方案:展示了为 .cms-content 下的 a、img、li 元素编写的简洁 CSS 样式。
• Tailwind 方案:演示了如何在 Elm 和 React 组件中,通过将所有子元素样式规则整合到父容器的 className 属性中,利用任意变体实现同样的效果。
• 相关插件:提及 @tailwindcss/typography 插件的 prose 类可以处理富文本样式,但有时需要更精细控制。
7. 总结 (The Takeaway)
• 任意变体允许在 Tailwind 框架内使用任意 CSS 选择器,& 代表当前元素,_ 代表空格。
• 强调了通常情况下,独立的普通 CSS 样式表对于嵌入内容来说更简单、更可读、更易维护。
• Tailwind 和传统 CSS 可以良好共存。
• 鼓励读者了解这种方法的可能性,以备不时之需。
author Christian Ekrem
#前端 #优质博文 #CSS #动画 #新特性
CSS Scroll-Triggered Animations are coming to Chrome!
以下是方便搜索索引的大纲 (AI 生成),请读原文:
author Bramus!
CSS Scroll-Triggered Animations are coming to Chrome!
AI 摘要:Chrome 浏览器将在明年初推出纯 CSS 实现的滚动触发动画。这是一种基于时间,并在特定滚动偏移量(scroll offset)触发的动画,与现有的滚动驱动动画不同。这项功能有望在 Chrome 145 版本正式发布,它将替代部分 IntersectionObserver 的用途。
以下是方便搜索索引的大纲 (AI 生成),请读原文:
1. 新特性发布预告
• Chrome 浏览器即将支持纯 CSS 实现的滚动触发动画(Scroll-Triggered Animations)。
• 预计在明年初推出,并在 Chrome 145 版本正式发布。
2. 滚动相关动画的区别
• 滚动驱动动画(Scroll-Driven Animations):动画进度随滚动条移动从 0% 到 100%,停止滚动则暂停,反向滚动则倒退。
• 滚动触发动画(Scroll-Triggered Animations):在达到特定的滚动偏移量时触发,是基于时间的动画。
3. 替代传统实现方式
• 新特性将允许开发者以声明式(declaratively)的 CSS 方式实现,替代部分对 IntersectionObserver 的依赖。
4. 资源与演示
• 为 timeline-trigger 的范围(ranges)创建了一个可视化工具,解释激活范围(activation range)和活动范围(active range)的概念。
• 激活范围(activation range)是触发器被激活的区域,活动范围(active range)是触发器保持激活状态的区域,活动范围必须包含激活范围。
5. 体验方式
• 用户可以在 Chrome Canary 中启用“Experimental Web Platform Features”旗标来提前体验该功能。
author Bramus!
#优质博文 #前端 #CSS #AI #MCP #debug
这个好啊,Chrome DevTools MCP 终于能直接介入浏览器调试了。
Let your Coding Agent debug your browser session with Chrome DevTools MCP
以下是方便搜索索引的大纲(AI 生成),请读原文
author Sebastian Benz
这个好啊,Chrome DevTools MCP 终于能直接介入浏览器调试了。
Let your Coding Agent debug your browser session with Chrome DevTools MCP
AI 摘要:Chrome DevTools MCP 迎来了重大更新,现在允许 AI 编程助手直接连接到活跃的浏览器会话。这项新功能极大地提升了调试效率,编程助手可以重用现有登录会话、访问活跃的调试面板(如网络面板和元素面板),从而实现手动调试与 AI 辅助调试的无缝切换。文章详细介绍了这一功能的实现原理、安全措施(如用户授权弹窗和控制横幅)以及如何配置和使用,为开发者提供了更智能、更便捷的调试体验。
以下是方便搜索索引的大纲(AI 生成),请读原文
1. Chrome DevTools MCP 新功能概述
• 核心更新:Chrome DevTools MCP 服务器现在支持 AI 编程助手直接连接到活跃的浏览器会话。
• 主要优势
• 重用现有浏览器会话:编程助手可以直接访问已登录的会话,无需重新登录。
• 访问活跃调试会话:编程助手可以直接从 DevTools UI 访问并调查选定的元素或网络请求。
• 工作流改进:实现手动调试与 AI 辅助调试的无缝切换。
2. Chrome DevTools MCP 连接方式
• 现有连接方式
• 使用特定用户配置文件运行 Chrome。
• 通过远程调试端口连接到运行中的 Chrome 实例。
• 在独立临时配置文件中运行多个 Chrome 实例。
• 新增自动连接功能:通过 --autoConnect 选项,MCP 服务器可以请求远程调试连接。
3. 远程调试工作原理及安全措施
• 基础机制:基于 Chrome 现有的远程调试能力。
• 启用步骤:用户需在 chrome://inspect#remote-debugging 中手动启用远程调试。
• 连接流程:
• MCP 服务器配置 --autoConnect 选项后,将尝试连接活跃的 Chrome 实例。
• 用户授权:Chrome 会弹出对话框,要求用户授权远程调试会话,以防止滥用。
• 状态提示:调试会话激活时,Chrome 顶部会显示“Chrome is being controlled by automated test software”横幅。
4. 如何开始使用
• 步骤一:在 Chrome 中设置远程调试
• 导航至 chrome://inspect/#remote-debugging。
• 根据对话框提示允许或禁止传入的调试连接。
• 步骤二:配置 Chrome DevTools MCP 服务器
• 在 MCP 服务器配置中,为 chrome-devtools 服务添加 --autoConnect 命令行参数。
• 示例配置适用于 gemini-cli。
• 步骤三:测试设置
• 运行 gemini-cli 并输入性能检查指令。
• 允许 Chrome 弹窗中的远程调试请求。
• 验证 MCP 服务器是否能成功打开网页并执行性能追踪。
• 更多信息:可参考 GitHub 上的 README 文档获取完整说明。
5. 未来展望
• 调试任务交接:AI 编程助手可以接管调试任务,提升效率。
• 面板数据暴露:计划逐步向编程助手暴露更多 DevTools 面板数据。
author Sebastian Benz
#优质博文 #React #前端 #course
Do's and Don'ts of useEffectEvent in React
[以下是方便搜索索引的大纲(AI 生成),请读原文]
author Slicker
Do's and Don'ts of useEffectEvent in React
AI 摘要:useEffectEvent 是 React 新增的 Hook,用来在 Effect 中获取最新的 props / state 而不触发 Effect 重新执行。它通过保持函数引用稳定,解决了“依赖列表必须包含所有变量”导致的频繁重渲染问题。文章列举了它的使用场景、可做与不可做的细节,以及最佳实践和迁移建议,帮助开发者在合适的场景安全使用该特性。
[以下是方便搜索索引的大纲(AI 生成),请读原文]
1. 什么是 useEffectEvent
• 介绍了 useEffectEvent 的核心概念:创建一个始终读取最新值的稳定函数引用
• 说明它如何在不触发 Effect 重跑的情况下访问最新的 props / state
2. 解决的问题
• 通过聊天应用示例,展示传统写法需把所有变量加入依赖导致不必要的重跑
• 对比使用 useEffectEvent 后,仅在真正需要的依赖(如 roomId)变化时才重新执行 Effect
3. Do's 与 Don'ts
• ✅ Do:在 Effect 内直接调用、用于读取最新值、用于需要 Effect 上下文的事件处理、分离响应式与非响应式逻辑、同步调用
• ❌ Don't:在普通 UI 事件处理器中使用、在渲染阶段调用、作为 props 传递、异步或延时调用、替代正常的 memoization
4. 详细示例
• ✅ 正确:在 Effect 中抽离非响应式逻辑(如主题变化)保持连接仅在 roomId 改变时重建
• ❌ 错误:在按钮点击等普通事件中使用 useEffectEvent,建议使用普通函数或 useCallback
• ✅ 正确:在定时器或轮询中读取最新的回调函数(如 onTick)
• ❌ 错误:在异步 fetch 回调中调用 useEffectEvent,可能在组件卸载后仍被调用
• ✅ 正确:在清理函数中也可使用 useEffectEvent 记录页面退出事件
• ❌ 错误:把 useEffectEvent 作为其他 Hook(如 useMemo)的依赖,破坏其稳定性
5. 常见使用场景
• 日志与分析:在路径变化时记录页面访问,内部使用最新的主题、语言、用户 ID 等信息
• 第三方回调:向消息服务订阅回调,回调内部使用最新的用户偏好而无需重新订阅
• 防抖实现:在防抖定时器中使用最新的搜索参数和过滤条件
6. 最佳实践
• 只在确实需要读取非响应式值时使用
• 考虑逻辑是否应该放在 Effect 之外的普通事件处理器里
• 保持 Event 函数单一职责,写清使用原因以便维护
• 等待 stable 版本发布再用于生产环境
7. 迁移路径
• 对比使用 useCallback 并频繁更改依赖或通过 eslint-disable 抑制警告的情形,说明 useEffectEvent 可作为更清晰的替代方案
• 建议先重构组件逻辑,确认是否真的需要该 Hook
author Slicker
#优质博文 #前端 #html #javascript #css #tools #AI
Useful patterns for building HTML tools
Useful patterns for building HTML tools
AI 摘要:Simon Willison 在这篇文章中总结了构建 HTML 工具的核心模式:保持单文件、避免 React、使用 CDN 加载依赖、利用复制粘贴、调试工具、URL 与 localStorage 持久化、收集 CORS API、直接调用 LLM、文件操作、可下载文件、Pyodide 与 WebAssembly、复用已有工具以及记录开发过程。通过这些模式,作者在两年内用 LLM 生成了 150+ 个实用工具,并提供了大量示例与源码链接。
#优质博文 #CSS #前端 #新特性
草案
Fit width text in 1 line of CSS
[以下是方便搜索索引的大纲(AI 生成),请读原文]
author Geoff Graham
草案
Fit width text in 1 line of CSS
AI 摘要:本文介绍了 CSS 实验性新属性 text-grow 和 text-shrink,它们旨在用一行代码解决文本与容器宽度匹配的经典布局问题。文章详细解释了其语法、可选值和工作原理,同时也指出了当前存在的开放性问题和可访问性考量,并鼓励开发者参与相关讨论。
[以下是方便搜索索引的大纲(AI 生成),请读原文]
1. 新属性介绍与语法
• 介绍了实验性 CSS 属性 text-grow 和 text-shrink,它们可以简洁地让文本宽度适配容器。
• 详细解析了语法结构:text-grow: <fit-target> <fit-method>? <length>?;,并解释了 <fit-target> (如 per-line, consistent)、 <fit-method> (如 scale, font-size) 和可选 <length> 参数的含义。
2. 开放问题与社区讨论
• 指出了该属性在可访问性(如用户放大字体时)和具体行为(如最后一行、行高、内联图片的处理)上仍存在待解决的问题。
• 汇总了社区(如 Una Kravets, Donnie D’Amato)对该技术适用场景(如更适合打印样式)的讨论和思考,并提供了参与 W3C GitHub 议题讨论的链接。
3. 发展脉络与展望
• 回顾了从过去依赖 FitText.js 等复杂方案到如今一行 CSS 可能解决问题的技术演进。
• 整体表达了对这一新属性简化前端开发工作流的期待,同时保持了对其成熟度审慎乐观的态度。
author Geoff Graham
酷!
CSS Wrapped 2025
AI 摘要:本文是 Chrome 团队对 2025 年即将到来或已部分实现的 CSS 新特性的全面总结。文章涵盖了从交互增强(如无 JavaScript 的对话框控制、兴趣触发器)、UI 组件现代化(如完全可自定义的 select 元素、原生 CSS 轮播)、布局与定位革新(如锚点容器查询、滚动状态查询),到 CSS 语言能力提升(如 if() 条件语句、自定义函数、增强的 attr() 函数)等多个方面。这些特性旨在让开发者能够用更声明式、更简洁且高性能的代码构建更丰富、更易访问的 Web 体验。
[以下是方便搜索索引的大纲(AI 生成),请读原文]
1. 交互与行为增强
• Invoker Commands**:通过 commandfor 和 command 属性,无需 JavaScript 即可声明式地控制 <dialog> 和 [popover] 元素的显示、隐藏等操作,并支持自定义命令。
• Dialog Light Dismiss:为 <dialog> 元素新增 closedby 属性,实现类似 Popover 的“轻关闭”行为(点击外部或按 ESC 键关闭)。
• Interest Invokers:通过 interestfor 属性,为按钮或链接提供声明式的悬停/聚焦触发 UI(如工具提示),并可设置 interest-delay 控制延迟。
• ToggleEvent.source:在 ToggleEvent 中新增 source 属性,用于识别触发 popover/dialog/details 切换操作的具体元素。
• DOM State-Preserving Move:新的 moveBefore() DOM API,在移动元素(如 iframe、视频)时能保持其内部状态(播放、焦点等),不会重新加载。
2. UI 组件与控件
• Customizable select:通过 appearance: base-select 解锁对 <select> 元素的完全 CSS 定制,包括下拉列表、选项样式,并支持在 <option> 内使用 HTML 内容。
• ::scroll-marker/button()**:新增 CSS 伪元素,用于创建原生的、可访问的轮播导航按钮和标记点,无需 JavaScript。
• scroll-target-group:将一组锚点链接转换为滚动标记组,结合 :target-current 伪类实现“滚动侦测”高亮效果。
• text-box features:通过 text-box-trim 和 text-box-edge 属性,基于字体的视觉边界(如大写字母高度)精确控制文本垂直对齐,实现完美视觉居中。
3. 布局、定位与滚动
• Anchored container queries:结合 CSS 锚点定位,使用 container-type: anchored 和 @container anchored(fallback: ...) 查询,让元素能根据其定位回退状态(如从底部翻转到顶部)自适应样式。
• Scroll-state queries:通过 container-type: scroll-state,让子元素能查询父容器是否处于“可滚动”、“吸附”或“固定”状态,并据此应用样式。
• scrollIntoView() container:scrollIntoView 方法新增 container: 'nearest' 选项,确保只滚动最近的祖先滚动容器,而非整个视口。
• Stretch sizing keyword:新的 stretch 尺寸关键字,让元素在考虑外边距的情况下填满包含块,不同于 100%。
• corner-shape:新的 corner-shape 属性,提供除圆角外的多种边角形状(如斜面、凹口、圆弧、方圆形),并支持 superellipse() 函数进行精细控制。
4. CSS 语言与表达能力
• Tree counting functions:新增 sibling-index() 和 sibling-count() CSS 函数,用于获取元素在兄弟节点中的索引和总数,简化交错动画等效果。
• Advanced attr() function:增强的 attr() 函数,现在可用于任何 CSS 属性,并能将属性值解析为颜色、长度、数字等特定类型。
• if() statements:新的 CSS if() 函数,内联支持条件判断,可与 media()、supports()、style() 查询结合,简化动态样式逻辑。
• Custom Functions:支持使用 @function 定义自定义 CSS 函数,提高样式代码的复用性和可读性。
• Expanded range syntax:现在样式查询和 if() 语句中支持使用范围语法(如 >, <),允许对自定义属性值进行大小比较。
• shape() function:新的 shape() CSS 函数,用于创建复杂、响应式的裁剪路径,比 clip-path: path() 更易于维护和动画。
5. 动画与过渡
• Nested View Transition Groups:视图过渡 API 支持嵌套的 ::view-transition-group ,通过 view-transition-group: nearest 属性在过渡期间保留 3D 变换和裁剪效果。
author Una Kravets
#优质博文 #design #UX
The f*** off contact page - Nic Chan
author Nic Chan
The f*** off contact page - Nic Chan
AI 摘要:本文作者 Nic Chan 分享了一个早年客户案例,客户是一家服务型设计公司,却执意要模仿大型 SaaS 企业的“劝退式联系页面”(fuck off contact page)——一种通过隐藏真实支持渠道来减少咨询量的设计。作者分析了这种页面为何与客户(服务型公司)获取线索的根本目标相悖,并反思了项目中出现这一问题的根源:折扣报价导致客户不尊重专业意见、未能有效教育客户理解设计流程(如线框图)的价值,以及双方缺乏信任。文章最终倡导设计师应通过公开分享价值观来吸引理念一致的客户。
author Nic Chan
#优质博文 #前端 #CSS #Astro #ISR #性能优化
想起以前做的 ISR,心血来潮搜一下 Astro 里的 ISR 怎么做,做一下。
On-Demand ISR For Astro on Vercel
[以下是方便搜索索引的大纲(AI 生成),请读原文]
author Shawn
想起以前做的 ISR,心血来潮搜一下 Astro 里的 ISR 怎么做,做一下。
On-Demand ISR For Astro on Vercel
AI 摘要:本文详细介绍了如何在 Vercel 平台上为 Astro 静态网站配置按需增量静态再生成 (On-Demand ISR)。文章首先解释了 ISR 和按需 ISR 的概念及其适用场景,然后通过一步步的代码示例,指导读者如何初始化项目、添加 Vercel 适配器并配置 ISR 参数、创建动态页面,以及最关键的部分——如何通过一个受保护的 API 端点来手动触发缓存失效和页面重建,从而实现对静态内容更新时间的精细控制。
[以下是方便搜索索引的大纲(AI 生成),请读原文]
1. 概念解析
• 什么是 ISR:解释增量静态再生成 (ISR) 的概念,即无需重新构建或部署整个网站即可更新静态内容(如博客文章或 GET API 端点)。
• 什么是按需 ISR:对比传统基于 TTL(生存时间)的 ISR,说明按需 ISR 允许在 TTL 到期前手动使缓存失效并触发重建,从而更精确地控制内容的新鲜度。
• 适用场景:列举按需 ISR 的典型用例,如不常更新但更新后需立即生效的内容,或渲染成本高(计算、时间、外部 API 费用)的频繁访问内容。
2. 项目配置
• 初始化 Astro 项目:使用命令行工具创建一个包含 Tailwind CSS 和 React 的 Astro 项目,并初始化 Git。
• 添加 Vercel 适配器:通过 astro add vercel 命令添加适配器,并在 astro.config.mjs 文件中配置 ISR 参数,包括设置 bypassToken(用于授权缓存失效的密钥)和 exclude(排除 API 路由不被缓存)。
3. 实现与验证
• 创建动态页面:在首页添加一个显示服务器渲染时间戳的组件,用于验证缓存效果。部署后,刷新页面时间戳不变,且响应头 x-vercel-cache 显示 HIT,证实页面来自缓存。
• 实现按需失效端点:创建一个受保护的 API 端点 (/api/invalidate),该端点接收 POST 请求,内部向目标路由发送带有 x-prerender-revalidate 头(值为 bypassToken)的 HEAD 请求,以触发缓存失效和重建,并验证响应头确认操作成功。
• 测试:通过 curl 命令调用该 API 端点,成功使首页缓存失效,再次访问首页时看到新的时间戳,证明按需 ISR 生效。
author Shawn
#优质博文 #CSS #前端
The Hidden Selectors of The HTML Element
[以下是方便搜索索引的大纲(AI 生成),请读原文]
author Temani Afif
The Hidden Selectors of The HTML Element
AI 摘要:本文来自 Temani Afif 的 CSS 小贴士系列,介绍了除 html {} 与 :root {} 外,还能选中 <html> 元素的几种“隐藏”选择器,如嵌套选择器 &、:scope、:has()、:not() 等,并通过组合操作符展示了多种有趣写法。虽然这些技巧在实际开发中不一定实用,但它们揭示了 CSS Selector 机制的底层逻辑与灵活性,是一次颇具趣味性的语法探索。
[以下是方便搜索索引的大纲(AI 生成),请读原文]
1. 根元素的经典选择方式
• 介绍了我们熟知的两种方式:html {} 与 :root {}
• 提出问题:是否存在其他隐藏选择器可用于选中 <html> 元素
2. 嵌套选择器(Nesting Selector &)
• 在非嵌套上下文中,& 等效于 :scope
• 可直接用作选择 <html> 元素
3. :scope 选择器
• 当没有定义作用域根节点时,:scope 默认代表整个文档根,即 <html>
• 示例代码展示了如何直接使用 :scope { ... } 来作用于全页面样式
4. :has() 选择器的新奇用法
• <html> 是唯一同时包含 head 与 body 的元素,可利用结构特征进行反向匹配
• 示例::has(head) 或 :has(body) 都能命中 <html>
5. :not() 与组合筛选
• <html> 是唯一没有父节点的元素,可利用 `:not(* *)`(排除有祖先的元素)进行匹配
• 加入子代组合符 > 可形成如 :not(* > *) 的结构,用“CSS 符号表情”形式趣味收尾
6. 组合选择器的实验与调侃
• 展示 :is() 、:where() 与多重 & 的奇怪组合写法(如 &&&&)
• 指出这些写法在逻辑上可行但缺乏实际用途,更多是对 CSS Selector 灵活性的探索
7. 结语与扩展阅读
• 作者认为这些“隐藏选择器”是有趣但不实用的实验
• 附带更多 CSS Tips,如 Direction-Aware CSS Shapes 与 Direction-Aware Arrow Shape using corner-shape,扩展了方向感知样式的应用视角
author Temani Afif
#优质博文 #React #SSR #ISR #前端 #工程化 #构建系统
Build your own web framework - Vercel
[以下是方便搜索索引的大纲 (AI 生成),请读原文]
author Lydia Hallie
via @hyoban 投稿
Build your own web framework - Vercel
AI 摘要:本文由 Vercel 的 Lydia Hallie 撰写,介绍如何利用 Vercel 的 Build Output API 构建一个基于 React 的简易 Web 框架,支持静态渲染(Static Rendering)、增量静态再生(Incremental Static Regeneration, ISR)、服务端渲染(Server-Side Rendering, SSR)、边缘函数(Edge Functions)和自动图片优化等功能。文章不仅讲解框架涉及的文件结构和构建流程,还展示如何将每种渲染模式映射为 Vercel 可识别的输出,从而部署到无服务器(Serverless)和 Edge 环境。虽然该示例为教学版,但完整演示了现代框架实现高性能与可扩展架构的关键思路。
[以下是方便搜索索引的大纲 (AI 生成),请读原文]
1. 框架目标与核心组件
• 通过 Vercel Build Output API 构建自定义 Web 框架
• 实现静态页面、增量渲染、服务端渲染、边缘渲染和图片优化等现代框架功能
• 所有页面位于 pages/ 目录,并根据配置选择不同渲染策略(static、ssr、prerender 或 edge)
2. 页面设计与优化策略
• Landing Page:通过图片优化与 Edge 缓存提升首页首字节时间(TTFB)
• Products Page:结合静态与动态渲染,利用 ISR 实现自动再生更新
• Popular Page:借助 Edge Functions 根据用户地理位置实现个性化推荐
3. 框架实现细节
• Static Rendering:
• 使用 ReactDOMServer.renderToString 将组件预渲染为 HTML
• 输出文件结构至 .vercel/output/static,生成可 Hydrate 的 JS 包
• Incremental Static Regeneration (ISR):
• 创建 .func 文件夹与 prerender-config.json 配置缓存过期与再生逻辑
• 增设 fallback HTML 提供渐进体验
• Serverless Functions:
• 每个动态页生成一个 Lambda(serverless)函数,用于按需(re)生成页面
• 利用 .vc-config.json 定义运行时、入口点与上下文
• Edge Server Rendering:
• 在 Edge Runtime 中使用 React 进行服务端渲染
• 动态注入 req 对象以生成个性化内容
4. 自动图片优化(Automatic Image Optimization)
• 自定义 Image 组件,将图片请求代理至 /_vercel/image
• 基于 vercel.config.js 生成 .vercel/output/config.json,统一图片格式(webp/avif)、域名和缓存策略
5. 构建与输出过程(Build Output)
• 遍历所有页面并执行对应的渲染方法
• 拷贝静态资源至 .vercel/output/static
• 自动创建 .vercel/output/config.json 配置文件
• 构建完成后可直接通过 Vercel 部署,享受边缘分发与函数服务
6. 结论
• 框架可作为理解现代渲染机制与 Vercel 部署架构的参考
• 虽非生产版本,但展示了现代框架(如 Next.js)背后的核心逻辑
• 适合框架作者或独立开发者应用 Vercel 的核心特性进行自研集成
author Lydia Hallie
via @hyoban 投稿
#优质博文 #前端 #CSS #3D
The Deep Card Conundrum
有点感慨
[以下是方便搜索索引的大纲(AI 生成),请读原文]
author Amit Sheen
The Deep Card Conundrum
我喜欢这个解决方案,不仅因为它有效(而且效果非常好),还因为它教会了我一个谦卑的教训。
我曾一度认为 perspective-origin 是个“坏”属性。我对它抱有抵触情绪,因为我只把它看作是造成图像失真的根源。我一心只想找到制作 3D 的“正确”方法,却忽略了真正能解决问题的工具。
Cubiq 并没有这种偏见。他看到的是一个数学问题:“我需要当旋转方向为 Y 时,投影看起来要像 X。”然后他找到了控制投影的属性。
有点感慨
AI 摘要:本文由 Amit Sheen 撰写,讲述他如何在纯 CSS 的限制下实现具有真实 3D 深度和裁剪效果的“Deep Card”。传统做法会因 overflow: clip 扁平化 3D 空间而失败。作者在尝试数年未果后,受到 Cubiq 的启发,用 perspective-origin 动态校正视角,实现了既可保持 3D 空间又可裁剪内容的完美效果。这一方案不仅重燃了纯 CSS 的创造力,也提醒开发者,不要过早排斥某些特性,真正的创新往往在规则之外。
[以下是方便搜索索引的大纲(AI 生成),请读原文]
1. 卡片与“深度卡片”的概念
• 普通卡片是二维的,最多用阴影暗示层次;“Deep Card”试图在卡片内构建真实的体积。
• 技术目标:让元素在旋转时表现出真实景深与透视变化。
2. CSS 陷阱与规范限制
• 核心难题是 overflow: clip 与 transform-style: preserve-3d 无法共存。
• 依据 CSS Transforms Module Level 2 规范:含有分组属性的元素(如 overflow、opacity、filter)会被“扁平化”,导致 3D 效果丢失。
3. 伪 3D 的尝试(Faking It)
• 通过 scale() 与 translate() 等方式模拟透视变化。
• 优点:高性能、跨浏览器兼容;缺点:角度一大透视破碎,难以保持自然立体感。
4. 数学解法的探索之路
• 尝试为每层使用 clip-path 来动态裁剪,但计算复杂度极高,需要实时三角与投影运算。
• 作者几乎放弃时,收到开发者 Cubiq 的信息,成为突破契机。
5. 关键突破:perspective-origin 的反向运用
• 以往被认为“畸变丑陋”的属性被重新发掘。
• Cubiq 的公式通过基于旋转角度动态计算 perspective 与 perspective-origin,实现投影映射式的深度对齐。
• 结果:在被扁平化的上下文中实现了视觉上的真实 3D 效果。
6. 实现细节与代码结构
• HTML 结构:.card-container > .card > .card-content + .card-back。
• JS 监听鼠标位置,计算 --mouse-x、--mouse-y。
• CSS 关键:
• 外层提供全局 perspective。
• 内层通过 calc(cos/sin) 动态校正视角。
• overflow: clip 限定边界,translateZ() 生成深度分层。
• 注意 .card-layers 容器避免直接扁平化问题。
7. 深化与扩展效果
• 利用亮度变化、半透明叠加强化视觉深度。
• 控制 z-index 实现不同的层次呈现。
• 可添加交互,如点击翻转 180°(前后双面内容)。
• 内层动画(如视差滚动与文字 3D 动效)进一步扩展场景。
8. 启示与总结
• 结论:纯 CSS 也能实现真实的 3D 深度与裁剪效果。
• 哲思:别轻易排除技术手段,创新常源自对“禁区”的重新理解。
• 鼓励读者“go build something deep”——继续挑战 CSS 的极限。
author Amit Sheen
#优质博文 #CSS #前端 #布局
The Downsides of scrollbar-gutter: stable; (and one weird trick)
[以下是方便搜索索引的大纲(AI 生成),请读原文]
author Chris Coyier
The Downsides of scrollbar-gutter: stable; (and one weird trick)
AI 摘要:本文阐述了 scrollbar-gutter: stable; 在解决页面布局因滚动条出现与否而引起的内容跳动(layout shift)问题上的便利,同时指出它在某些场景下(如 iframe 环境或元素居中对齐)会导致“空白滚动条占位”以及视觉不居中的副作用。作者进一步提出一种利用 CSS Scroll State 查询的替代方案,通过检测页面是否可滚动来动态调整内边距,为未来更灵活的滚动状态响应式设计提供了思路。
[以下是方便搜索索引的大纲(AI 生成),请读原文]
1. 引入与背景
• 提到 Zach 建议在样式表中默认使用 scrollbar-gutter: stable;。
• 该属性能为滚动条预留空间,避免内容在滚动条出现或消失时的跳动。
• 应用场景:在系统设置为“始终显示滚动条”时尤为明显。
2. scrollbar-gutter: stable; 的优点与原理
• 通过为滚动条占位,页面在加载更多内容时不会发生横向位移。
• 浏览器支持广泛,适合用于布局稳定性的优化。
• 视觉表现:用白色或暗色条带代替滚动条区域,从而避免内容的移动。
3. 使用中的缺陷与视觉问题
• 在 CodePen 等 iframe 环境中,会出现“纯白空隙”(白条)的问题。
• 在非 iframe 环境下虽无白条,但元素居中计算仍未考虑滚动条占位。
• 导致视觉上轻微偏移,尤其在内容需要精确居中时效果不佳。
4. 替代方案:基于 Scroll State 的新思路
• 介绍 CSS scroll-state 容器查询用法,通过判断页面是否可滚动来实现自定义布局调整。
• 示例代码展示了如何利用自定义 CSS 变量和 vendor prefix 控制滚动条宽度。
• 该方法灵活但依赖较新的浏览器支持,尚属实验性方案。
• 作者希望未来能有系统级变量(如 env())能动态获取滚动条宽度,提升可用性。
5. 总结与展望
• scrollbar-gutter: stable; 简单易用,但小缺陷让人犹豫是否应作为默认。
• CSS Scroll State 提供潜在方向,让开发者更精确地应对滚动相关的布局变化。
• 未来网页布局中可能会实现更智能的滚动状态适配机制。
author Chris Coyier
#优质博文 #前端 #CSS #排版 #设计 #layout #容器查询
Getting Creative With “The Measure”
[以下是方便搜索索引的大纲(AI 生成),请读原文]
author Andy Clarke
Getting Creative With “The Measure”
AI 摘要:本文从传统排版学出发,探讨了 “measure(行长)” 概念如何指导现代网页设计。作者建议以内容可读性为核心,用自定义 CSS 属性结合 ch 单位控制文本宽度,将 measure 延伸到多栏布局、网格系统 (Grid)、以及容器查询 (Container Query) 的设计逻辑中。通过以内容为依据而非设备尺寸来设定断点,设计者可以创造出更自然、更连贯、更具可读性的排版系统。
[以下是方便搜索索引的大纲(AI 生成),请读原文]
1. 传统排版中的 measure 概念
• “Measure” 起源于金属活字时代,指每行文本能容纳的宽度,是版面设计的核心要素。
• 好的 measure 提高阅读舒适度,差的 measure 会让读者疲劳。
• 从排版角度来看,measure 应成为布局决策的依据,而非被动的结果。
2. 使用 CSS 自定义属性定义 measure
• 使用 --measure 自定义属性并以 ch 单位(字符宽度)定义行长。
• 推荐 60–70 字符每行为理想可读长度。
• 不同字体的 x-height 与字宽会影响实际视觉行长,需通过视觉调整。
3. 保持文字可读性
• 通过 max-inline-size: var(--measure) 控制正文宽度取代 max-width。
• 运用 CSS 逻辑属性 (Logical Properties) 进行方向无关的布局。
• 有效防止“大屏长行综合症”,保持阅读舒适。
4. 设计多栏文本 (Multi-column Layout)
• 使用 column-width: var(--measure) 让浏览器自动计算可读列数。
• 单栏与多栏布局可自适应,不需媒体查询。
• measure 让版面转换更加平滑自然。
5. 用 measure 引导网格布局 (Grid System)
• 在网格定义中,将主文本区的列锁定在 measure 宽度,如 grid-template-columns: minmax(0, var(--measure)) 1fr;。
• 第一列保持理想阅读宽度,第二列灵活适配剩余空间。
• 强化内容与版面之间的连结感。
6. 以 measure 为条件的容器查询 (Container Queries)
• 打破以设备宽度设断点的思维,用内容本身触发布局变化。
• 当容器宽度小于 measure 时,布局可自动折叠至单栏。
• 创建 “内容驱动 (Content-driven)” 的响应设计,而非 “设备驱动 (Device-driven)” 布局。
7. 构建 measure 系统
• 定义多个 measure 变量(如 --measure-s, --measure-l)应对不同文本类型。
• 小 measure 用于说明文字,标准 measure 用于正文,大 measure 用于标题与引导。
• 统一的行长节奏让页面更具整体性与阅读流畅感。
8. 从 measure 出发重新理解设计
• 以 measure 为核心的设计能让排版从“试错”转变为“对话”。
• 内容与布局相互协调,带来更有意识和一致性的视觉节奏。
author Andy Clarke
#优质博文 #前端 #React #安全 #RCE #POC
CVE-2025-55182 React Server Components RCE POC
[以下是方便搜索索引的大纲 (AI 生成),请读原文]
Source
CVE-2025-55182 React Server Components RCE POC
AI 摘要:作者展示了 CVE-2025-55182 漏洞的具体利用方式,说明该漏洞出现在 React Server Components 的反序列化机制中。通过伪造 Chunk 对象以及操控 then 方法触发链式调用,攻击者可以利用 Next.js 的服务端组件解析逻辑实现远程代码执行 (RCE)。文章详细讲述了漏洞的产生原理、攻击向量和具体请求示例,说明此问题的严重性与利用条件。
[以下是方便搜索索引的大纲 (AI 生成),请读原文]
1. 漏洞背景与影响范围
• 漏洞编号为 CVE-2025-55182,影响 React Server Components 的反序列化过程
• 可在 Next.js 16.0.6 环境下触发
• 利用对象结构中的 $@ 标记机制篡改 Chunk 引用并控制反序列化流程
2. 核心利用思路 (Exploit 原理)
• 使用 $@ 引用构造伪造的 Chunk 实例
• 将 Chunk.prototype.then 作为根对象的 then 属性,使得在 Promise 处理时自动触发攻击逻辑
• 通过修改 status 为 RESOLVED_MODEL 调用 initializeModelChunk 以执行受控对象的代码路径
3. 攻击链实现与触发机制
• 攻击目标是触发 Blob 反序列化流程
• response._formData.get 被重写为 JavaScript Function 构造器,实现任意代码执行
• 构造的 multipart/form-data 请求载荷通过控制 _prefix 字段注入任意命令(例如 child_process.execSync('xcalc'))
4. 安全意义与防护思考
• 漏洞本质源于反序列化信任边界不明与模型解析机制的未过滤输入
• 需加强 React Server Components 的反序列化安全校验
• 建议暂时限制相关功能或升级框架版本
Source
#优质博文 #React #安全 #RSC #前端
这就是 R!S!C!(逃
叠甲:任何东西都会有漏洞的啦只是想吐槽一下再说我们也没用 RSC 连服务器组件都没用没影响的没影响的。
Critical Security Vulnerability in React Server Components – React
[以下是方便搜索索引的大纲(AI 生成),请读原文]
author The React Team
这就是 R!S!C!(逃
叠甲:任何东西都会有漏洞的啦只是想吐槽一下再说我们也没用 RSC 连服务器组件都没用没影响的没影响的。
Critical Security Vulnerability in React Server Components – React
AI 摘要:React 官方披露了一个在 React Server Components (RSC) 中的严重远程代码执行漏洞(CVE-2025-55182),影响多个版本的 react-server-dom 系列包。问题出在 RSC 的负载反序列化逻辑中,攻击者可通过构造恶意 HTTP 请求在服务器上执行任意代码。相关漏洞获评 CVSS 10.0(最高等级),已在 19.0.1、19.1.2、19.2.1 等版本修复。React 团队建议开发者立即升级,并说明了受影响的框架包括 Next.js、React Router、Waku 等。
[以下是方便搜索索引的大纲(AI 生成),请读原文]
1. 漏洞概述与影响范围
• 披露的漏洞是针对 React Server Components 的未授权远程代码执行 (Remote Code Execution, RCE) 问题。
• 漏洞编号为 CVE-2025-55182,CVSS 评分为 10.0(极高严重度)。
• 所有使用 RSC 的 React 应用,即使没有定义特定 Server Function 接口,也可能受影响。
2. 受影响版本与安全修复
• 受影响版本:19.0、19.1.0、19.1.1、19.2.0。
• 修复版本:19.0.1、19.1.2、19.2.1。
• 修复建议:立即升级至修复版本的 react-server-dom-webpack、react-server-dom-parcel、react-server-dom-turbopack。
3. 受影响的框架与构建工具
• 部分框架与构建工具依赖或内置受影响包,包含 Next.js、React Router、Waku、@parcel/rsc、@vitejs/plugin-rsc、rwsdk。
• React 团队后续将更新具体升级指令。
4. 技术细节与漏洞原理
• RSC 机制允许客户端通过 HTTP 请求触发服务器端函数。
• 漏洞源于 React 在反序列化客户端请求载荷 (payload) 时的处理缺陷,导致攻击者可执行任意代码。
• 目前细节暂未完全公开,以防在修复完成前遭滥用。
5. 漏洞披露时间线
• 11 月 29 日:由安全研究员 Lachlan Davidson 通过 Meta Bug Bounty 计划报告漏洞。
• 11 月 30 日:Meta 安全部门确认漏洞并与 React 团队协作修复。
• 12 月 1 日:完成修复并与受影响项目共同测试与部署缓解措施。
• 12 月 3 日:在 npm 发布修复版本并正式公开 CVE。
6. 致谢与归属
• 感谢安全研究员 Lachlan Davidson 的发现、报告及协助修复贡献。
author The React Team
#优质博文 #前端 #CSS #浏览器 #新动态
New in Chrome 143
[以下是方便搜索索引的大纲(AI 生成),请读原文]
author Rachel Andrew
New in Chrome 143
AI 摘要:Chrome 143 正式发布,本次更新带来了对锚点定位元素(anchor positioned elements)的新式容器查询(anchored fallback container queries),改进了背景图像定位语法(side-relative background-position),并新增对 font-language-override 的支持,使开发者可精确控制字体替代语言标签。在提高 CSS 表现力的同时,也强化了排版的一致性与多语言支持。
[以下是方便搜索索引的大纲(AI 生成),请读原文]
1. CSS 新特性
• Anchored fallback container queries:新增 @container anchored(fallback),可基于元素定位的备用状态(position-try-fallbacks)设置不同样式,用于调整锚点元素的连线或动画表现。
• Side-relative background positioning:现在可在 background-position-x/y 长属性中直接使用相对边位置语法(如 left 30px、bottom 20px),提高图像定位灵活性,该特性现已进入 Baseline 新可用级别。
• Font language override:新增 font-language-override 属性,允许为 OpenType 字形替换指定自定义四字语言代码,从而覆盖系统语言设置,便于实现多语言、特殊字体排版控制。
2. 版本信息与资源链接
• 详细更新内容见 Chrome 143 release notes。
• 开发者工具更新详情:What's new in Chrome DevTools (143)。
• 功能状态更新在 ChromeStatus.com。
• Chrome release calendar 提供未来版本发布时间表。
3. 社区与后续更新
• 推荐订阅 Chrome Developers YouTube channel 获取最新视频提示。
• 关注 Chrome 团队在 X 或 LinkedIn 的最新发布。
• 官方将于 Chrome 144 发布时继续更新新功能说明。
author Rachel Andrew
#优质博文 #CSS #前端 #新特性
Gallery of Skewed Images with Hover Effect
[以下是方便搜索索引的大纲(AI 生成),请读原文]
author Temani Afif
Gallery of Skewed Images with Hover Effect
AI 摘要:本文展示了如何利用现代 CSS 的新特性 corner-shape 创建一个具备悬停 (hover) 交互的倾斜图片库。通过使用逻辑属性和自定义变量,只需少量代码即可实现具有方向感知 (direction-aware) 的图像倾斜效果。当用户悬停图片时,相邻形态会流畅过渡,视觉上极具动感。文末还比较了使用 clip-path 的替代实现,强调虽然兼容性更好,但缺乏方向感知的智能特性。
[以下是方便搜索索引的大纲(AI 生成),请读原文]
1. 组件与功能简介
• 主题为一个倾斜 (skewed) 图片库,展示如何简单实现经典布局。
• 利用现代 CSS 新属性 corner-shape 让图片边角自动响应文字方向。
• 通过 flex 布局与 transition 结合,实现平滑扩展的悬停动画。
2. 核心实现原理
• 定义变量 --s 控制倾斜程度和形状曲率。
• 使用逻辑属性如 border-start-start-radius、border-end-end-radius 确保布局在不同书写方向中正常表现。
• 通过伪类 :hover、:has() 与相邻选择器的配合,让图片在交互时动态调整边形与间距。
3. 替代方案与兼容性
• 提供使用 clip-path 的另一种实现方法。
• 虽然 clip-path 方式浏览器支持度较高,但不具备方向感知能力。
• 建议根据实际兼容需求在项目中选择适合的实现。
4. 延伸与参考
• 推荐阅读作者的其他作品:Direction-Aware Arrow Shape using corner-shape 与 Dynamic Tooltip Position with Anchor Positioning IV。
• 这些示例共同展示了现代 CSS 如何简化复杂动效组件的实现。
author Temani Afif