我想实现一个文本动画如下: https://stackblitz.com/edit/text-animation-demo-with-animejs?file=src%2Fapp%2Fapp.component.html,src%2Fapp%2Fapp.component.ts

我把代码复制到我的文件里:

export class HeroSectionMainTextComponent {
  ngAfterViewInit(): void {
    // Wrap every letter in a span
    const textWrapper = document.querySelector('.an-1');
    textWrapper.innerHTML = textWrapper.textContent.replace(
      /\S/g,
      "<span class='letter'>$&</span>",
    );

    anime
      .timeline({ loop: true })
      .add({
        targets: '.an-1 .letter',
        scale: [4, 1],
        opacity: [0, 1],
        translateZ: 0,
        easing: 'easeOutExpo',
        duration: 950,
        delay: (el, i) => 70 * i,
      })
      .add({
        targets: '.an-1',
        opacity: 0,
        duration: 1000,
        easing: 'easeOutExpo',
        delay: 1000,
      });
  }
}

但我有一个错误:

TS18047: 'textWrapper' is possibly 'null'.

所以我试着加?像这样:

 const textWrapper = document.querySelector('.an-1');
    textWrapper?.innerHTML = textWrapper?.textContent.replace(
      /\S/g,
      "<span class='letter'>$&</span>",
    );

但没有效果.如何让它工作,为什么在stackblitz上工作?

编辑:

import { Component, AfterViewInit } from '@angular/core';
declare var anime: any; // declare like this
import 'zone.js';

@Component({
  selector: 'app-hero-section-main-text',
  standalone: true,
  imports: [],
  templateUrl: './hero-section-main-text.component.html',
  styleUrl: './hero-section-main-text.component.css',
})
export class HeroSectionMainTextComponent {
  ngAfterViewInit(): void {
    // Wrap every letter in a span
    const textWrapper = document.querySelector('.an-1');
    if (textWrapper) {
      textWrapper.innerHTML =
        textWrapper?.textContent?.replace(
          /\S/g,
          "<span class='letter'>$&</span>",
        ) || '';
    }

    anime
      .timeline({ loop: true })
      .add({
        targets: '.an-1 .letter',
        scale: [4, 1],
        opacity: [0, 1],
        translateZ: 0,
        easing: 'easeOutExpo',
        duration: 950,
        delay: (el: any, i: any) => 70 * i,
      })
      .add({
        targets: '.an-1',
        opacity: 0,
        duration: 1000,
        easing: 'easeOutExpo',
        delay: 1000,
      });
  }
}

现在我没有得到任何错误,但动画根本没有开始.

推荐答案

我们只需要判断左手边的textWrapper属性是否为空,我们可以使用if条件来判断它!还添加了 || '',这样右手边就不会返回undefined,而是返回空字符串!

您在Typescript 中启用了strictNullChecks,也可能是由于在tsconfig.json中启用了严格

const textWrapper = document.querySelector('.an-1');
if (textWrapper) {
  textWrapper.innerHTML =
    textWrapper?.textContent?.replace(
      /\S/g,
      "<span class='letter'>$&</span>"
    ) || '';
}

完整代码

import { Component, AfterViewInit } from '@angular/core';
import { bootstrapApplication } from '@angular/platform-browser';
import { AppModule } from './app.module';
declare var anime: any; // declare like this
import 'zone.js';

@Component({
  selector: 'my-app',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css'],
  imports: [AppModule],
  standalone: true,
})
export class AppComponent implements AfterViewInit {
  ngAfterViewInit(): void {
    // Wrap every letter in a span
    const textWrapper = document.querySelector('.an-1');
    if (textWrapper) {
      textWrapper.innerHTML =
        textWrapper?.textContent?.replace(
          /\S/g,
          "<span class='letter'>$&</span>"
        ) || '';
    }

    anime
      .timeline({ loop: true })
      .add({
        targets: '.an-1 .letter',
        scale: [4, 1],
        opacity: [0, 1],
        translateZ: 0,
        easing: 'easeOutExpo',
        duration: 950,
        delay: (el, i) => 70 * i,
      })
      .add({
        targets: '.an-1',
        opacity: 0,
        duration: 1000,
        easing: 'easeOutExpo',
        delay: 1000,
      });
  }
}

bootstrapApplication(AppComponent);

Stackblitz Demo

Javascript相关问答推荐

如何按预期聚合SON数据?

序列查找器功能应用默认值而不是读取响应

如何在JavaScript中在文本内容中添加新行

将json数组项转换为js中的扁平

如何在使用fast-xml-parser构建ML时包括属性值?

当运行d3示例代码时,没有显示任何内容

cypress中e2e测试上的Click()事件在Switch Element Plus组件上使用时不起作用

S文本内容和值不必要的不同

覆盖TypeScrip中的Lit-Element子类的属性类型

WP Bootstrap NavWaker:下拉菜单一次打开所有下拉菜单

Use Location位置成员在HashRouter内为空

钛中的onClick事件需要在两次点击之间等待几秒钟

TinyMCE 6导致Data:Image对象通过提供的脚本过度上载

在JS中动态创建对象,并将其追加到HTML表中

更新Redux存储中的对象数组

未捕获语法错误:Hello World中的令牌无效或意外

用另一个带有类名的div包装元素

为什么我不能使用其同级元素调用和更新子元素?

在每次重新加载页面时更改指针光标

如何将值从后端传递到前端