各位码友们,大家好!今天给大家介绍一个非常棒的学习设计模式的网站 - Patterns.dev
。
Patterns.dev
设计模式对于开发者来说是非常重要的!但相信很多人和我一样,对于设计模式这个知识点都有一种"爱恨交加"的情绪。它虽然非常重要,但传统很多设计模式的讲解过于学院化和理论化,缺乏生动有趣的实例和案例,让人难以产生共鸣,容易在学习中失去兴趣。
而 Patterns.dev
就很好地解决了这个难题。这个网站通过生动有趣的动画演示、可以直接运行的代码示例,以及贴近实战需求的亲和叙述方式,让设计模式的学习变得轻松易懂、趣味盎然。
❝这里举例网站中 Rendering Pattern 中讲解关于动画视图转换章节
为了讲解动画视图,作者先以目前流行的转场效果作为目标,如下视频:
然后由易到难分步去实现,以达到最终效果:
Toggle示例
实现中拆解了 html,js 和 css 代码,并且代码中有详细的注释,去讲解动画的实现:
if (document.startViewTransition) {
// (check for browser support)
document.addEventListener("click", function (event) {
if (event.target.matches("summary")) {
event.preventDefault(); // (we'll toggle the element ourselves)
const details = event.target.closest("details");
document.startViewTransition(() => details.toggleAttribute("open"));
}
});
}
::view-transition-old(root),
::view-transition-new(root) {
animation-duration: 2s;
}
这就需要通过更高级的动画来实现多个变化的动画效果,这些动画效果超出了上面的 Toggle 。
视图转换需要通过为特定元素提供 CSS view-transition-name
和 containment
的 layout
或 paint
,这些 API 为开发者提供了对元素过渡的精细控制,包括它们的宽度、高度和位置。其实转场动画就是基于这些 API 实现的,这些高级过渡 API 对元素进行精细控制,才让流畅的动画效果从一个页面传达到下一个页面的。
在 photo gallery[1] 示例中,每个页面上的 <img>
元素被赋予相同的唯一 view-transition-name
,以及一个 CSS containment
值 layout
。动态地添加它们(例如,在一个 onclick
处理程序中),只要它们是页面特有的,并且在过渡开始之前添加即可。
页面导航的过渡效果中分为两种情况:客户端渲染和服务端渲染。
3.1 SAP 中的实现如下:
import { Component } from "react";
export default class ViewTransition extends Component {
shouldComponentUpdate() {
if (!document.startViewTransition) return true; // skip when not supported
document.startViewTransition(() => this.#updateDOM());
return false; // don't update the component, we'll do this manually
}
#updateDOM() {
// now we know the screenshot has been taken, we can force render
// (which skips `shouldComponentUpdate`)
this.forceUpdate();
// set up a promise that will resolve when the component renders
return new Promise((resolve) => {
this.#rendered = resolve;
});
}
render() {
return this.props.children;
}
#rendered = () => {};
componentDidUpdate() {
// resolve the `updateDOM` promise to notify the View Transition API
// that the DOM has been updated
this.#rendered();
}
}
3.2 在流行的 Next.js 中使用 SSR,对于无需视图转换的也讲解了实现方法 这种方法与 View Transitions API 的主要区别在于,它无法在动画播放时将元素从一个状态过渡到下一个状态,因为当它播放动画时,它没有新的 HTML 来实现这一点。
文中给出:使用 Turbo 和 Turn 为服务器端渲染的多页面应用添加动画效果;
Turbo,作为 Hotwire 库套件的一部分,提供了一种渐进式增强多页面应用(MPAs)的渲染方法。它可以将服务端渲染的应用程序,优化到单页面应用(SPAs)的速度。它通过捕获链接点击和表单提交,使用 JavaScript 执行请求,并用响应中的新 <body>
替换 原来的<body>
来实现这一点。因此,这是一种混合方法:HTML 在服务器上生成,但 DOM 通过 JavaScript 更新。
Turn 是一个用于使用 Turbo 进行页面导航动画的库。它支持两种动画方法;Turn 会在适当的时候为 <html>
元素添加 turn-before-exit
、 turn-exit
和 turn-enter
类,为开发者提供了一种自定义动画的方式。
更多信息参阅网站介绍, Animating View Transitions[2]
正是这种创新的学习方式和与时俱进的内容,让 Patterns.dev
赢得了很多开发者的青睐。在这里,你可以:
不仅如此,Patterns.dev
还紧跟 Web 开发的最新发展趋势,涵盖了 JavaScript、React、Vue.js、Next.js 等前沿技术框架中的设计模式实践,完美地拥抱了交互式 Web 体验。
总之,Patterns.dev
让设计模式"活"了起来,是程序员们提升代码质量、夯实面向对象编程基础的绝佳学习平台。有了它,相信大家都能写出更优雅、高内聚、低耦合的代码。
虽然设计模式不是一种新鲜概念,但Patterns.dev
将它们引入现代 Web 开发实践的尝试是成功的,这个项目很好地展示了设计模式在当下场景下的重要性和适用性,避免了过于纯理论和学院化的窠臼。
同时,Patterns.dev
对 React、Vue.js 等框架的深度解读,反映出了它与现有技术生态的紧密融合。这使得开发者无需叠加学习成本就可以获益。
总的来说,Patterns.dev
是一个内容丰富、交互创新、理念先进的项目。它对于提高现代 Web 开发的质量和效率,都有积极影响。希望在开源地带这个平台获得更多关注和支持。
Reference
[1]
photo gallery: https://charming-crumble-af45ba.netlify.app/
[2]
Animating View Transitions: https://www.Patterns.dev/vanilla/view-transitions
[3]
下载地址: https://leanpub.com/learningpatterns/