在 Angular 中旋转伪 3D 轮播

2024-03-26

我正在尝试创建一个伪 3d 轮播,其中包含 5 个项目,如下所示(并让它们循环):

我发现这很棒堆栈闪电战 https://stackblitz.com/edit/angular-ivy-sqt1uq?file=src%2Fapp%2Fapp.component.ts作为一个起点,我已经玩了几个小时试图让它有 5 个项目而不是 3 个,但我很难理解它是如何工作的。

如果比我聪明的人可以帮助我了解如何制作这 5 件物品,那就太好了。特别是我不明白这是怎么回事movements应该配置变量,这可能就是这里的全部秘密。

movements = [
    { pos: 0, right: [1, 2], left: [8, 7] },
    { pos: 2, right: [3, 4, 5, 6, 7], left: [1, 0] },
    { pos: 7, right: [8, 0], left: [6, 5, 4, 3, 2] }
];

抱歉,我想我是作者。我对代码的解释非常糟糕。看到你在轮播中同时看到 5 个项目,所以画一个圆周并分成 8 部分。编号最底部为 0,左边为 1, 2,... 有些像

    4
 3     5
2       6
 1     7
    0

动画(你看到的面孔)是 0、1、2、6 和 7

animates = [0, 1,2,6,7];

并且位置是

movements = [
    { pos: 0, right: [1], left: [7] },
    { pos: 1, right: [2], left: [0] },
    { pos: 2, right: [3,4,5,6], left: [1] },
    { pos: 6, right: [7], left: [5,4,3,2] },
    { pos: 7, right: [0], left: [6] },
  ];

那个,例如 面位于位置 0,向右转到位置 1,向左转到位置 7 面位于位置 1,向右转到位置 1,向左转到位置 0 面位于位置 2,向右转到位置 3、4、5 和 6,向左转到位置 1。

嗯,你需要小心,当我们计算角度时,你除以 8(而不是除以 9)

const animations = mov[direction].map(m => {
    const angle = (m * 2 * Math.PI) / 8; //<--see the "8"   
    ....
}

您可以选择除以 8,而不是除以 16,以使运动更加真实。在这种情况下,您会看到面孔

          8
       7     9
    6          10
  5              11 
 4                12
  3              13
    2          14
      1      15
          0

请注意,在本例中可见的面为 0,2,4,12 y 14

animates=[0,2,4,12,14]

职位是

movements = [
    { pos: 0, right: [1,2], left: [15,14] },
    { pos: 2, right: [3,4], left: [1,0] },
    { pos: 4, right: [5,6,7,8,9,10,11,12], left: [3,2] },
    { pos: 12, right: [13,14], left: [11,10,9,8,7,6,5,4] },
    { pos: 14, right: [15,0], left: [13,12] },
  ];

你需要除以 16

const animations = mov[direction].map(m => {
    const angle = (m * 2 * Math.PI) / 16; //<--see the "16"   
    ....
}

我分叉了 stackblitzhere https://stackblitz.com/edit/angular-ivy-wmkcyd?file=src%2Fapp%2Fapp.component.ts

Update旋转木马只向左、向右移动一步。如果我们定义其他运动以允许向左和向右移动两步,我们可以改进它

movementsTwo=[
    { pos: 0, right: [1,2,3,4], left: [15,14,13,12] },
    { pos: 2, right: [3,4,5,6,7,8,9,10,11,12], left: [1,0,15,14] },
    { pos: 4, right: [5,6,7,8,9,10,11,12,13,14], left: [3,2,1,0] },
    { pos: 12, right: [13,14,15,0], left: [11,10,9,8,7,6,5,4,3,2] },
    { pos: 14, right: [15,0,1,2], left: [13,12,11,10,9,8,7,6,5,4] },

  ]

并更改函数 animateViews 以允许移动一到两步

  animateViews(direction: string,steps:number=1) {
    this.animates.forEach((x: number, index: number) => {
      //here use one or another array
      const movements=steps==1?this.movements:this.movementsTwo;
      const mov = movements.find(m => m.pos == x);
      ...
  }

这允许我们编写一个函数来“移动到前面”一个元素

  indexToFront(index: any) {
    index = +index;
    const pos = this.animates[+index];
    if (pos) {
      const mov = this.movements.find((x) => x.pos == pos);
      const mov2 = this.movementsTwo.find((x) => x.pos == pos);
      const anim = { direction: 'right', steps: 1 };
      if (
        mov.left[mov.left.length - 1] == 0 ||
        mov2.left[mov2.left.length - 1] == 0
      )
        anim.direction = 'left';
      if (
        mov2.left[mov2.left.length - 1] == 0 ||
        mov2.right[mov2.right.length - 1] == 0
      )
        anim.steps = 2;

      this.animateViews(anim.direction, anim.steps);
    }
  }

好吧,唯一的就是写一个选择

<select #select (change)="indexToFront(select.value)">
  <option *ngFor="let i of [0,1,2,3,4]">{{i}}</option>
</select>

或者添加一个(click)事件到我们的“轮播”

<div style="position:relative;margin-top:150px">
  <div class="carousel" >
    <div #element *ngFor="let i of [0,2,4,12,14];let index=index" 
       (click)="animates[index]!=0 && indexToFront(index)" 
       class="carousel__cell">{{index}}
      </div>
</div>

我创造另一个堆栈闪电战 https://stackblitz.com/edit/angular-ivy-qpbewq?file=src%2Fapp%2Fapp.component.ts

注意:真正“硬编码”的运动不太喜欢。如果我有一点时间,我会尝试创建一个组件,但我不能保证什么时候:(

Update 2我为 5 个图像制作了一个伪轮播组件。主要的变化是,在这个中,我使用变换来移动“卡片”。所以函数 animateView 变得像

animateViews(direction: string, steps: number = 1) {
    this.animates.forEach((x: number, index: number) => {
      const movements = steps == 1 ? this.movements : this.movementsTwo;
      const mov = movements.find((m) => m.pos == x);
      const item = this.itemsView.find((_x, i) => i == index);
      const animations = mov[direction].map((m) => {
        const angle = (m * 2 * Math.PI) / 16;
        const scale =
          (1 + this.minScale) / 2 + ((1 - this.minScale) / 2) * Math.cos(angle);
        const applystyle = {
          transform:'translate('+
               (this.radius * Math.sin(angle)) + 'px,'+
               (Math.floor(this.top * scale)-this.top)+'px) 
               scale('+scale+')',
          'z-index': Math.floor(100 * scale),
        };
        return animate(
          this.timer / mov[direction].length + 'ms',
          style(applystyle)
        );
      });
      ....
    });
  }

这使得 .css 更容易

.carousel{
  display:flex;
  margin-left:auto;
  margin-right:auto;
  margin-top:20px;

}
.carousel::after{
  content:' ';
  display: block;
  clear: both;
}

.carousel>div{
  float:left;
  margin-right:-100%;
  cursor:pointer;
  transform-origin: top left;
}

.carousel>div img {
  border-radius: 1rem;
  box-shadow: 0 .5rem 1rem rgba(0,0,0,.35);
}

因此该组件不太依赖于图像的大小。另请参阅我添加了一个 transformY 来给人一种“从上面查看”的感觉

的变化新堆栈闪电战 https://stackblitz.com/edit/angular-ivy-8asrxn?file=src%2Fapp%2Fpseudo-3d-carousel%2Fpseudo-3d-carousel.component.ts

注意:目前,如果我们想更改 .css,我们可以使用 styles.css 并编写,例如

.custom .carousel>div img {
  border-radius: 50%!important;
  border:2px solid white;

}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Angular 中旋转伪 3D 轮播 的相关文章

随机推荐

  • Eclipse 插件开发 - Gradle 无法从 Eclipse 启动器运行:java.io.IOException:访问被拒绝

    我正在开发用于运行 Gradle 的 Eclipse 插件 https github com Nodeclipse nodeclipse 1 tree master org nodeclipse enide gradle从 Eclipse
  • 如何获取Windows的主题颜色?

    I would like to have a way to get the theme colour of the users Windows theme with WPF or C code behind And with this co
  • Haskell 多重上下文 - 柯里化?

    在类型签名上编写上下文时 通常我会做类似的事情 f Enum a Ord a gt a gt a 但纯粹是运气不好 我发现它的编译结果似乎是相同的 至少在 GHC 7 8 上是这样 f Enum a gt Ord a gt a gt a 两
  • 如何在 C# 中使用为 VB.Net 编写的 dll

    我有问题要问 我有一个为在 USB 上读取和写入数据而编写的 dll 文件 要在 VB Net 中使用 dll 需要集成一个 vb 文件 该文件的接口为 该 dll 文件使用其函数 属性等 我需要的是在 C 项目中使用这个 dll 这可能吗
  • 泛型 C# 的重载运算符[重复]

    这个问题在这里已经有答案了 我想创建一个支持连接到另一个过程的过程类 如下所示 a b c d 这应该导致过程采用 a 的输入类型 并给出 d 的输出类型 class Procedure
  • 如何在 MS Graph 中检索 DriveItems 的自定义列

    我正在尝试使用 Graph API 检索 Sharepoint 文档库中的文件层次结构 由于文档库存储在 驱动器 中 将其称为 OneDrive 在技术上是否正确 我使用的是 drives端点来获取文件列表 如下所示 https graph
  • 多核ARM cpu上的中断如何工作

    这个问题已经针对 x86 得到了解答 但是 我找不到太多关于 ARM MP cpu 如 Cortex A9 Cortex A15 等 的信息 更重要的是我想知道是否可以在非主CPU上引发中断而无需任何配置等 我正在开发一款仅处理主 cpu
  • 确定 gcry_cipher_decrypt 解密数据的大小?

    我使用的是 AES GCM 但以下是其他模式 如 AES CBC 的一般问题 我有以下电话libgcrypt define COUNTOF x sizeof x sizeof x 0 define ROUNDUP x b x x b 1 b
  • Android - 创建自定义 SearchView

    我有一个列表活动 其中包括 SearchView 和 ListView 我希望 SearchView 类似于谷歌地图 Android 应用程序中的内容 目前我在activity main xml中的SearchView代码是
  • 具有 +1 逻辑的 4 位计数器 D 触发器

    我正在尝试通过 Verilog 实现带有 1 逻辑的 D 触发器计数器 但是我收到了很多有关网络多个常量驱动程序的错误代码 有人可以帮我吗 这是到目前为止的代码 module LAB clk clear Enable Q input clk
  • 将 margin-bottom 添加到页脚之前的图像

    我想看看是否有办法添加margin bottom to an img仅当元素后跟一个footer元素 目前我正在使用一个特殊的类 image before footer 在我最后一次img元素来实现这一点 但想知道是否有办法在 CSS 中动
  • 有没有人能够成功使用 albahari.com 的 PredicateBuilder 来对抗 MongoDB?

    我使用 albahari com 中流行的 PredicateBuilder 编写了以下代码 var predicate PredicateBuilder False
  • 增加tomcat 7中的并发连接数

    想知道如何增加tomcat 7中的并发连接数 我做了一些研究 从apache文档中发现 设置acceptCount maxConnections的值并增加maxThreads可以做到这一点 但是当尝试时 我只能提交500个请求1000 下面
  • 多字段匹配查询

    我对弹性搜索相当陌生 想编写一个涉及两个字段的查询 我的意思是字段的内容包含指定的子字符串 我有一个包含字段的文档 如下所示 name n tag t 我试过这个 search d query match name n tag t 但查询结
  • androidx.legacy:legacy-support-v4: 依赖有什么用

    我正在实现 Android Room 数据库 在其中一篇教程中我发现了使用androidx legacy legacy support v4 1 0 0依赖性 谁能告诉我这种依赖关系的用途 androidx legacy legacy su
  • Linux 上的 PHP 和 RAW Sockets

    做一个就足够了 sudo setcap cap net raw eip usr bin php5 能够在 Linux 中的 PHP 而不是 CLI 中使用 RAW SOCKETS 吗 如果是 那么它不起作用 但开始在 CLI 中工作但不使用
  • 如何在 C# 中解析 HTTP url?

    我的要求是解析 Http URL 并相应地调用函数 在我当前的实现中 我使用嵌套的 if else 语句 我认为这不是一种优化的方式 您能建议其他一些有效的方法吗 网址是这样的 server func1 server func1 SubFu
  • 使用服务主体对 GetReportInGroupAsync PowerBI Embedded API 调用进行未经授权的响应

    我正在尝试将 Power BI 报告嵌入到我的 Net Core 应用程序中 但是我无法从请求中获得有效的响应 我正在使用 Microsoft PowerBI API 包和通过服务主体注册的 azure 应用程序 据我所知 我已按照此处的说
  • 在没有包装器的情况下在 QT 上使用 OpenGL [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一个与 OpenGL 结合使用的 GUI 工具包 QT 看起来很有前途 但不幸的是它将大多数
  • 在 Angular 中旋转伪 3D 轮播

    我正在尝试创建一个伪 3d 轮播 其中包含 5 个项目 如下所示 并让它们循环 我发现这很棒堆栈闪电战 https stackblitz com edit angular ivy sqt1uq file src 2Fapp 2Fapp co