typer.js,可能是最小但功能也不多的模拟打字效果插件

打字机效果文字插件typer.js


typer.js介绍

typer.js是模拟打字机效果的轻型js插件(1.6 Kb),有打字、删除、重复和停顿几种简单的效果。

起因

由于这几天写个在线简历,我想使用打字的特效,在github上搜到一个叫TheaterJS的插件,效果很好,但是应用时发现,TheaterJS开发版的体积近80kb,而且我只需要它的打字机效果,不需其他复杂的功能,于是又萌生了自己造轮子的想法。

构思

之前写的listen2me用过类似的文字单播的效果,加上见过许多其他打字机效果,心里觉得还是有底的。

想了想自己的需求,效果上分为两块:

  1. 文字逐个显示
  2. 闪烁的光标

在使用上需要:

  1. 输出内容控制简便,模仿TheaterJs输出时的链式调用方法。
  2. 控制速度、停顿等

研究过程

一些错误的想法

打字效果很简单,简单的JS代码配合CSS就很好的还原了TheaterJS的效果,当然这仅是一行文字的输出。

然后研究输出控制。刚开始单纯的以为借用JQUERY可以直接链式调用与事件的顺序执行,具体写代码才发现,jquery的链式调用是操作节点的,而且它的内置函数应该都设定好了对链式操作的支持,我在网上查阅了一些资料,js可以通过对函数return this来支持链式调用。

又研究了事件的顺序,同样,本以为jquery的链式调用可以按顺序执行,比如$('DOM').fadeIn().fadeOut().animate(....)这个操作就是按照淡入、淡出再动画的顺序进行的,后面的操作会等待前面的完成。写代码时又发现,我写的js无法以这个思路实现按序执行,因为打字效果要使用setTimeout这个函数,使得整个过程成为异步,JS执行时自然无法有序。看了一些JQUERY代码,发现除了链式调用外,可以按序执行代码的方法还有使用callback,比如``$('DOM').animate({'width':'100%'},1000,function(){........})

然后自己陷入了混乱,再乱试了各种方法之后,选择了睡觉。

今天早起,突然就想清楚昨天尝试的方法问题在哪里,比如这段事件等待:


                
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 要实现波纹效果,可以使用 Three.js 中的 ShaderMaterial 来自定义着色器。下面是一个简单的实现步骤: 1. 创建一个平面几何体,设置顶点数和面数,以及 UV 坐标。 ``` var geometry = new THREE.PlaneGeometry(200, 200, 128, 128); ``` 2. 创建一个 ShaderMaterial,使用自定义的顶点着色器和片元着色器。 ``` var material = new THREE.ShaderMaterial({ uniforms: { time: { value: 0.0 }, amplitude: { value: 0.5 }, frequency: { value: 1.0 }, speed: { value: 1.0 } }, vertexShader: document.getElementById('vertexShader').textContent, fragmentShader: document.getElementById('fragmentShader').textContent }); ``` 3. 在顶点着色器中,根据时间和频率计算每个顶点的偏移量,并将其传递给片元着色器。 ``` void main() { vec4 mvPosition = modelViewMatrix * vec4(position, 1.0); gl_Position = projectionMatrix * mvPosition; float offset = amplitude * sin(time * speed + position.x * frequency); vUv = uv; vOffset = vec3(position.x, position.y, offset); } ``` 4. 在片元着色器中,根据偏移量计算每个像素的颜色值。 ``` void main() { vec3 offset = vOffset.xyz; float r = sqrt(offset.x * offset.x + offset.y * offset.y + offset.z * offset.z); vec3 color = vec3(0.5) + 0.5 * cos(r * 10.0 - time * 2.0); gl_FragColor = vec4(color, 1.0); } ``` 5. 在渲染循环中,更新时间值,并将其传递给着色器。 ``` function render() { requestAnimationFrame(render); var time = performance.now() * 0.001; material.uniforms.time.value = time; renderer.render(scene, camera); } ``` 完整的代码可以参考以下示例: ``` <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Wave Shader</title> <style> body { margin: 0; padding: 0; overflow: hidden; } </style> </head> <body> <script src="https://cdn.rawgit.com/mrdoob/three.js/dev/build/three.min.js"></script> <script> var scene = new THREE.Scene(); var camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000); camera.position.z = 300; var renderer = new THREE.WebGLRenderer(); renderer.setSize(window.innerWidth, window.innerHeight); document.body.appendChild(renderer.domElement); var geometry = new THREE.PlaneGeometry(200, 200, 128, 128); var material = new THREE.ShaderMaterial({ uniforms: { time: { value: 0.0 }, amplitude: { value: 0.5 }, frequency: { value: 1.0 }, speed: { value: 1.0 } }, vertexShader: document.getElementById('vertexShader').textContent, fragmentShader: document.getElementById('fragmentShader').textContent }); var mesh = new THREE.Mesh(geometry, material); scene.add(mesh); function render() { requestAnimationFrame(render); var time = performance.now() * 0.001; material.uniforms.time.value = time; renderer.render(scene, camera); } render(); </script> <script id="vertexShader" type="x-shader/x-vertex"> uniform float time; uniform float amplitude; uniform float frequency; uniform float speed; varying vec2 vUv; varying vec3 vOffset; void main() { vec4 mvPosition = modelViewMatrix * vec4(position, 1.0); gl_Position = projectionMatrix * mvPosition; float offset = amplitude * sin(time * speed + position.x * frequency); vUv = uv; vOffset = vec3(position.x, position.y, offset); } </script> <script id="fragmentShader" type="x-shader/x-fragment"> varying vec2 vUv; varying vec3 vOffset; void main() { vec3 offset = vOffset.xyz; float r = sqrt(offset.x * offset.x + offset.y * offset.y + offset.z * offset.z); vec3 color = vec3(0.5) + 0.5 * cos(r * 10.0 - time * 2.0); gl_FragColor = vec4(color, 1.0); } </script> </body> </html> ``` ### 回答2: three.js 是一个用于创建和渲染 3D 图形的 JavaScript 库。虽然 three.js 并没有直接提供实现波纹效果功能,但我们可以使用 three.js 中的几何体和材质以及一些特殊效果来实现波纹效果。 首先,我们可以使用 three.js 的 PlaneGeometry 创建一个平面几何体。然后,我们可以使用 ShaderMaterial 来创建一个自定义的着色器材质,并在其中编写顶点和片元着色器代码来实现波纹效果。 在顶点着色器中,我们可以通过简单的数学计算来实现波纹效果。可以使用时间作为参数,根据顶点的坐标计算出新的顶点位置,并将其传递给片元着色器。 在片元着色器中,可以使用类似的方式计算出波纹的强度,并将其应用于颜色或纹理。可以根据需要调整颜色的渐变以及波纹的形状和大小。 最后,我们需要将创建的几何体和材质添加到场景中,并使用相机进行渲染。可以通过更新顶点位置、时间和其他参数来实时调整波纹效果。 通过这种方式,结合 three.js 的强大功能,我们可以实现一个带有波纹效果的动态且生动的场景。三维物体上的波纹效果会随着时间的流逝而变化,给用户带来更加视觉上的感官享受。 ### 回答3: three.js是一种用于创建3D图形的JavaScript库。要实现波纹效果,可以按照以下步骤进行操作: 1. 创建一个three.js场景和相机。 2. 添加一个平面几何体,用于显示波纹效果。 3. 创建一个ShaderMaterial材质,并将波纹的纹理图像绑定到该材质上。 4. 使用着色器程序实现波纹效果。这可以通过在片元着色器中使用时间和位置变量来实现。 5. 将ShaderMaterial应用到平面几何体上,并将几何体添加到场景中。 6. 在动画循环中,更新着色器程序中的时间变量,以让波纹效果动起来。 7. 最后,通过使用渲染器将场景渲染到页面上,就可以看到波纹效果了。 实现波纹效果需要一些基本的three.js和着色器知识。可以在three.js的官方文档和示例中找到更详细的教程和代码示例来帮助你实现波纹效果

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值