【问题标题】:The <template> tag doesn't work with x-transition in Alpine.js<template> 标签不适用于 Alpine.js 中的 x-transition
【发布时间】:2022-01-13 05:06:19
【问题描述】:

我有这段代码可以运行,动画也很好:

<script src="https://unpkg.com/alpinejs@3.7.0/dist/cdn.min.js"></script>

<div x-data="{ open: false }" x-on:click.outside="open = false" x-on:keydown.escape="open = false">
  <button x-on:click="open = !open">
    Click me
  </button>
  <div x-show="open" x-transition>
    <div>
      <ul>
        <li>Dogs</li>
        <li>Cats</li>
        <li>Snakes</li>
      </ul>
    </div>
  </div>
</div>

然后我尝试使用&lt;template&gt; 标签而不是&lt;div&gt; 标签并将x-show 更改为x-if(因为x-show 根本不适用于&lt;template&gt; 标签),如下所示:

<script src="https://unpkg.com/alpinejs@3.7.0/dist/cdn.min.js"></script>

<div x-data="{ open: false }" x-on:click.outside="open = false" x-on:keydown.escape="open = false">
  <button x-on:click="open = !open">
    Click me
  </button>
  <template x-if="open" x-transition>
    <div>
      <ul>
        <li>Dogs</li>
        <li>Cats</li>
        <li>Snakes</li>
      </ul>
    </div>
  </template>
</div>

它可以切换隐藏和显示状态,但根本没有过渡。

知道如何让&lt;template&gt; 标签支持平滑淡入/淡出过渡吗?

【问题讨论】:

  • 你试过这个吗:stackoverflow.com/a/32350477/5833816
  • 我正在使用 Alpine.js 。你认为它只能通过 Alpine.js 来完成吗? Alpine.js 的重点不是过多地或仅以非常简单的形式使用 JavaScript 调用和东西。没有查询和东西。但也许可以使用 setTimeout() 函数,但我不知道如何使用。你知道吗?

标签: javascript html css alpine.js


【解决方案1】:

我也遇到过这个问题,我找到的唯一解决方案是添加 x-data 和 x-init 属性,并在 $nextTick 调用中切换 x-show 指令的变量。这是一个例子:

<script src="https://unpkg.com/alpinejs@3.7.0/dist/cdn.min.js"></script>

<div x-data="{ open: false }" x-on:click.outside="open = false" x-on:keydown.escape="open = false">
  <button x-on:click="open = !open">
    Click me
  </button>
  <template x-if="open">
    <div x-data="{ show: false }"
         x-init="$nextTick(() => { show = true })"
         x-show="show"
         x-transition>
      <ul>
        <li>Dogs</li>
        <li>Cats</li>
        <li>Snakes</li>
      </ul>
    </div>
  </template>
</div>

【讨论】:

  • 很好,干得好。知道如何在单击或按 esc 键时淡出吗?现在只有淡入淡出的作品。淡出不会。
【解决方案2】:

这不会像您期望的那样工作。原因是如果您想使用&lt;template&gt; 标记以便在初始页面加载时使用display: none 隐藏该部分(这是默认行为),此处的转换将不起作用。 Alpinejs 不支持。

与 x-show 不同,x-if 不支持使用 x 过渡。

你可以在他们的官方page看到。

如果你想要过渡动画,你应该继续使用 div 并避免使用模板。它甚至不会像这样工作:

  <template x-if="open">
    <div x-show="open" x-transition.duration.1500ms>

但是,也许你可以尝试这样的事情:

<div x-data="{ open: false, animals: ['Animals'] }" x-on:click.outside="open = false" x-on:keydown.escape="open = false">
  <button x-on:click="open = !open">
    Click me
  </button>
  <template  x-for="animal in animals">
    <div x-show="open" x-transition.duration.1500ms>
      <ul>
        <li>Dogs</li>
        <li>Cats</li>
        <li>Snakes</li>
      </ul>
    </div>
  </template>
</div>

【讨论】:

  • 但是这样的东西适用于&lt;template&gt;并使用动画:&lt;div x-data="{ open: false, colors: ['Red', 'Orange', 'Yellow'] }"&gt; &lt;button @click="open = ! open"&gt;Toggle&lt;/button&gt; &lt;template x-for="color in colors"&gt; &lt;div&gt; &lt;span x-text="color" x-show="open" x-transition.duration.1000ms&gt; &lt;/span&gt; &lt;/div&gt; &lt;/template&gt; &lt;/div&gt;。试试吧。现在,我只是想知道如何在没有数组或其他东西的情况下工作。知道如何改进此代码以使其看起来类似于我在原始问题中想要的吗?
  • 我更新了答案
  • 知道为什么x-for 会触发带有&lt;template&gt; 的动画,尽管它不应该符合&lt;template&gt; 的HTML5 规范吗?
  • x-for 不会触发动画。我相信 x-if 的问题在于 alpine 如何在内部处理元素的显示和隐藏。另外,如果我的回答解决了您的问题,能否请您将其标记为正确的?
  • 我会等待其他解决方案。
猜你喜欢
  • 2013-04-15
  • 2017-11-13
  • 1970-01-01
  • 2018-11-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-02
  • 2020-09-10
  • 2017-07-15
相关资源
最近更新 更多