如何实现一个充满科技感的官网(二)

news/2025/1/4 17:24:06/文章来源:https://www.cnblogs.com/infinilabs/p/18646540

背景

在上一篇文章 《如何实现一个充满科技感的官网(一)》 中,我们初步了解了该官网的整体设计,并与大家探讨了它的视觉呈现和用户体验。

我们前期的内部设计偏向简洁,所以开始思考如何提升网站的整体设计感。这些尝试便由此展开。

网站地址:https://infinilabs.com/

如果你对动态背景的实现感兴趣,这篇文章将带你深入探索,揭秘如何从零打造一个兼具美感与功能性的企业官网!

技术选型

  • 前端框架:Next.js
  • UI 框架:基于 Tailwind CSS
  • CSS 样式:Tailwind CSS(快速开发、内置响应式、丰富工具类)

为什么选择 Next.js?

  1. 兼容团队技术栈:基于 React,便于团队协作。
  2. SEO 和性能优化:支持服务端渲染(SSR)和静态站点生成(SSG)。
  3. 路由强大:支持动态路由和文件路由,灵活易用。
  4. 内置优化:图片优化、国际化、多种性能提升。
  5. 动态内容支持:博客、新闻等动态场景轻松应对。
  6. 加载体验佳:用户体验和页面加载速度表现优秀。

动态的背景方案

动态背景可以显著提升视觉吸引力,以下是常用实现方案:

  1. CSS 动画背景:使用纯 CSS 实现动态背景,通过 @keyframes 配合渐变色、位置移动等属性。
  2. 动态 Canvas 背景:使用 <canvas> 元素,结合 JavaScript 绘制动态效果,比如粒子系统、波浪效果等。
  3. 动态视频背景:使用 <video> 元素播放循环视频作为背景。
  4. WebGL 动态背景:使用 WebGL 库(如 Three.js)渲染 3D 动态背景。
  5. 动态粒子背景:使用现有的粒子背景库快速实现动态粒子效果。(particles.js 或 tsparticles)
  6. ......

如何选择?

  1. 简单需求: 纯 CSS 动画、动态视频背景。
  2. 复杂交互:Canvas 动画、WebGL 动画(Three.js)。
  3. 快速实现:使用粒子背景库(particles.js / tsparticles)。

动态背景代码实现

以下示例通过 WebGL 创建了一个动态背景组件,支持 React 和 Tailwind CSS。

  1. 创建 GlobalBackground.tsx 文件:
"use client";import dynamic from "next/dynamic";
import { Suspense, useEffect, useState } from "react";
import { Layout } from "./Layout";const ShaderGradient = dynamic(() => import("shadergradient").then((mod) => mod.ShaderGradient),{ ssr: false }
);
const View = dynamic(() => import("./View").then((mod) => mod.View), {ssr: false,loading: () => (<divclassName="w-full h-full bg-cover bg-center"style={{ backgroundImage: "url(/images/loading-bg.png)" }}></div>),
});export default function GlobalBackground() {const defaultProps: any = {control: "props",animate: "on",brightness: 1.2,cDistance: 3.6,cameraZoom: 1,color1: "#0600B8",color2: "#9000E3",color3: "#0B004F",// embedMode: "off",envPreset: "city",// gizmoHelper: "hide",grain: "off",lightType: "3d",reflection: 0.1,shader: "defaults",type: "waterPlane",uSpeed: 0.2,uTime: 0,wireframe: false,zoomOut: false,toggleAxis: false,};const [suspenseWebgl, setSuspenseWebgl] = useState(false);useEffect(() => {const canvas = document.createElement("canvas");const gl =canvas.getContext("webgl") || canvas.getContext("experimental-webgl");if (gl) {// 浏览器支持 WebGLconsole.log("The browser does support WebGL");setSuspenseWebgl(true);} else {console.log("The browser does not support WebGL");// 浏览器不支持 WebGL}}, []);return (<>{suspenseWebgl ? (<Layout><View className="w-full h-full"><Suspense fallback={null}><ShaderGradient {...defaultProps} /></Suspense></View></Layout>) : null}</>);
}
  1. 创建 Layout.tsx 文件:
"use client";import { useRef } from "react";
import dynamic from "next/dynamic";
const Scene = dynamic(() => import("./Scene"), { ssr: false });const Layout = ({ children }: any) => {const ref = useRef<any>();return (<divref={ref}className="fade-in"style={{position: "fixed",top: 0,left: 0,width: "100%",height: "100%",zIndex: -1,overflow: "auto",touchAction: "auto",}}>{children}<Scenestyle={{position: "fixed",top: 0,left: 0,width: "100%",height: "100%",pointerEvents: "none",}}eventSource={ref}eventPrefix="client"pixelDensity={1}pointerEvents="none"/></div>);
};export { Layout };
  1. 创建 Scene.tsx 文件:
"use client";import { ShaderGradientCanvas } from "shadergradient";
import { Canvas } from "@react-three/fiber";
import { Preload } from "@react-three/drei";
import tunnel from "tunnel-rat";const r3f = tunnel();export default function Scene({ ...props }) {// Everything defined in here will persist between route changes, only children are swappedreturn (<ShaderGradientCanvas {...props}>{/* @ts-ignore */}<r3f.Out /><Preload all /></ShaderGradientCanvas>);
}
  1. 创建 View.tsx 文件:
"use client";import { forwardRef, Suspense, useImperativeHandle, useRef } from "react";
import {OrbitControls,PerspectiveCamera,View as ViewImpl,
} from "@react-three/drei";
import tunnel from "tunnel-rat";const r3f = tunnel();const Three = ({ children }: any) => {return <r3f.In>{children}</r3f.In>;
};export const Common = ({ color }: any) => (<Suspense fallback={null}>{color && <color attach="background" args={[color]} />}<ambientLight intensity={0.5} /><pointLight position={[20, 30, 10]} intensity={1} /><pointLight position={[-10, -10, -10]} color="blue" /><PerspectiveCamera makeDefault fov={40} position={[0, 0, 6]} /></Suspense>
);const View = forwardRef(({ children, orbit, ...props }: any, ref) => {const localRef = useRef<any>(null);useImperativeHandle(ref, () => localRef.current);return (<><div ref={localRef} {...props} /><Three><ViewImpl track={localRef}>{children}{orbit && <OrbitControls />}</ViewImpl></Three></>);
});
View.displayName = "View";export { View };
  1. 直接在 app/page.tsx 使用背景组件:
import GlobalBackground from "@/components/GlobalBackground";export default function Home() {return (<><GlobalBackground></GlobalBackground><divclassName="min-h-screen bg-cover bg-center"style={{ backgroundImage: "url(/svg/bg_n.svg)" }}>....</div></>);
}
  1. 当然,代码弄好了,要想让代码运行起来,还需要安装一下依赖:
pnpm add @react-three/drei @react-three/fiber shadergradient tunnel-rat

通过这些步骤,你将能够为网站实现高性能、响应式的动态背景效果。根据具体需求调整背景类型和交互复杂度,让你的官网更具吸引力!

效果

具体效果,可以直接在网站上浏览,效果更真实。网站地址:https://infinilabs.com/

分享

如果你也想配置自己的动态效果图,可以前往 shadergradient.co 网站进行自定义设置。完成后,将生成的配置参数复制到 GlobalBackground.tsx 文件的 defaultProps 中,即可实现属于你自己的动态背景效果。

参考

  • https://github.com/ruucm/shadergradient
  • https://www.shadergradient.co/
  • https://infinilabs.com/

福利

INFINI Labs 一直致力于为开发者和企业提供优质的开源工具,提升整个技术生态的活力。除了维护国内最流行的分词器 analysis-ikanalysis-pinyin,也在不断推动更多高质量开源产品的诞生。

最近新开源的产品和工具:

  • INFINI Framework https://github.com/infinilabs/framework
  • INFINI Gateway https://github.com/infinilabs/gateway
  • INFINI Console https://github.com/infinilabs/console
  • INFINI Agent https://github.com/infinilabs/agent
  • INFINI Loadgen https://github.com/infinilabs/loadgen
  • INFINI Coco AI https://github.com/infinilabs/coco-app

以上开源软件都可以在 Github 上面找到: https://github.com/infinilabs

希望大家都能给个免费的 Star🌟 支持一下!!!

作者:Rain9,极限科技(INFINI Labs) 高级前端开发工程师。

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

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

相关文章

架构师启示录:知识模型、落地方法与思维模式PDF、EPUB免费下载

本书由资深架构师撰写,从架构知识模型、架构落地方法和架构思维模式三大维度剖析架构师的能力模型。具体而言,本书融合TOGAF、DDD、RUP等主流架构方法论,抽象出一个具有高度普适性的架构认知框架,帮助读者轻松入门,成为合格架构师。适读人群 :资深程序员、初级架构师 从架…

Chrome Updater(Chrome更新器) v2.1

Chrome Updater 是一个便携Chrome、Chrome++版本检查和更新的工具。将程序放置于App目录内或手动指定App文件夹,未检测到Chrome将初始化安装。部分API依赖于GitHub服务,如果遇到网络问题可以设置GitHub代理。Chrome及Chrome++均可单独更新,互不影响。 配置存储路径:C:Users…

PowerISO(映像文件处理) v8.9 中文版

PowerISO作为一款专业的映像文件处理软件,凭借其出色的功能收到了众多用户的喜爱。PowerISO软件小巧,下载包仅为3.6M,支持大部分的CD/DVD–ROM映像文件格式,而且PowerISO同时支持Windows的32位与64位操作系统,功能实用,操作简便。获取地址:https://www.dmjf.top/2273.htm…

Android 万能格式转换器 v1.2.1 专业版

万能格式转换器 是一个一键操作的格式转换工具,可以轻松实现多种视频格式、音频格式、文档格式、图片格式转换。同时支持日常生活中的各种文件转换,比如视频转换音频、视频压缩、视频音频提取、图片转pdf、视频md5转码等。获取地址:https://www.dmjf.top/2592.html

PDF-XChange Editor Plus(PDF编辑器) v10.4.4.392 便携版

PDF-XChange PRO-使用PDF的通用解决方案。包含了Tracker软件的三个最佳应用程序的软件包:PDF-XChange Editor Plus,PDF-Tools和PDF-XChange Standard。 使用PDF-XChange Editor Plus,您可以创建,查看和编辑图像和PDF文件。 PDF-Tools在创建和处理PDF文件方面处于世界领先地…

《docker基础篇:5.本地镜像发布到阿里云》

《docker基础篇:5.本地镜像发布到阿里云》@目录5.本地镜像发布到阿里云本人其他相关文章链接 5.本地镜像发布到阿里云案例使用步骤: 1)本地镜像素材原型 2)阿里云开发者平台 3)创建仓库镜像 4)将镜像推送到阿里云 5)将阿里云上的镜像下载到本地 6)运行 注意点1: 本地镜…

【Linux运维】网络及网卡收发数据过程和Linux服务器排查丢包方法

服务器丢包是网络通信中常见的问题之一,它会导致网络不稳定和数据丢失,进而影响业务的正常运行。面对这种情况,我们需要采取一系列措施来诊断和解决问题。以下是一些有效的解决方法和建议,帮助你应对服务器丢包问题。 首先,我们要知道网络数据是如何封装及流向的,涉及哪些…

教育资源库:AI知识库在教学资源共享中的作用

一、引言 在当今教育领域,教学资源共享已成为提升教学质量和促进教育公平的重要手段。然而,传统的教学资源共享方式面临着诸多挑战,如资源检索效率低下、资源质量参差不齐、难以实现个性化学习等。随着人工智能技术的快速发展,AI知识库作为一种新兴的智能工具,正逐步改变教…

风险管理新视角:AI知识库在金融风险评估中的应用

一、引言 金融风险评估是金融机构运营中的关键环节,它直接关系到金融机构的稳健运营和客户的资金安全。然而,传统的金融风险评估方法往往依赖于人工经验和历史数据,存在评估周期长、准确性不足等问题。随着人工智能技术的兴起,AI知识库作为一种智能风险评估工具,正逐渐在金…

cMT-SVR服务器使用笔记

1,特点 (1) cMT-SVR100和cMT-SVR102的区别: cMT-SVR102内建EasyAccess2.0授权; (2) cMT-SVR200和cMT-SVR202的区别: cMT-SVR202内建EasyAccess2.0授权; (3) cMT-SVR200和cMT-SVR202支持10.5VDC~28VDC宽电压输入, cMT-SVR100和cMT-SVR102不支持宽电压输入; (4) USB口作…

案件分析助手:AI知识库在法律研究中的应用

在法律研究领域,案件分析是一项复杂而繁琐的工作。传统的案件分析方法往往依赖于律师和法学家的经验和直觉,以及大量的文献查阅和案例对比。然而,随着人工智能(AI)技术的不断发展,AI知识库正逐渐成为法律研究的智能案件分析助手。本文将探讨AI知识库在法律研究中的应用,…

建筑设计优化:AI知识库在建筑设计中的创新应用

随着科技的飞速发展,人工智能(AI)已经渗透到各行各业,建筑设计领域也不例外。AI知识库作为一种高效的信息管理和应用工具,正在逐步改变建筑设计的传统模式,引领建筑设计进入一个新的优化时代。本文将探讨AI知识库在建筑设计中的创新应用,并分析其对设计效率、设计质量和…