国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

目錄
react-spring速覽
springs
高度動(dòng)畫
動(dòng)畫過(guò)渡
演示
其他細(xì)節(jié)
關(guān)于這些沙箱的一些注意事項(xiàng)
構(gòu)建實(shí)際應(yīng)用
動(dòng)畫化我們的模態(tài)
首頁(yè) web前端 css教程 使反應(yīng)彈簧有意義

使反應(yīng)彈簧有意義

Apr 03, 2025 am 10:58 AM

Making Sense of react-spring

React動(dòng)畫實(shí)現(xiàn)一直是開發(fā)中的難點(diǎn)。本文將深入淺出地介紹react-spring,并探討一些實(shí)際應(yīng)用案例。雖然react-spring并非React唯一的動(dòng)畫庫(kù),但它卻是最受歡迎和功能強(qiáng)大的庫(kù)之一。

本文將使用最新的9.x版本(撰寫本文時(shí)為候選發(fā)布版本)。如果在您閱讀本文時(shí)尚未正式發(fā)布,請(qǐng)使用react-spring@next安裝。根據(jù)我的經(jīng)驗(yàn)和主要維護(hù)者的說(shuō)法,該代碼非常穩(wěn)定。我唯一遇到的問(wèn)題是在與并發(fā)模式一起使用時(shí)出現(xiàn)的小錯(cuò)誤,可在GitHub倉(cāng)庫(kù)中跟蹤。

react-spring速覽

在深入探討實(shí)際應(yīng)用案例之前,讓我們先快速了解一下springs、高度動(dòng)畫和過(guò)渡動(dòng)畫。本節(jié)末尾將提供一個(gè)可運(yùn)行的演示,因此不必?fù)?dān)心過(guò)程中可能會(huì)遇到的困惑。

springs

讓我們考慮動(dòng)畫的經(jīng)典“Hello world”:內(nèi)容的淡入淡出。讓我們停下來(lái)思考一下,如何在沒有任何動(dòng)畫的情況下切換顯示和隱藏。它看起來(lái)像這樣:

export default function App() {
  const [showing, setShowing] = useState(false);
  return (
    <div>
      <div style="{{" opacity: showing :>
        This content will fade in and fade out
      </div>
      <button onclick="{()"> setShowing(val => !val)}>Toggle</button>
      <hr>
    </div>
  );
}

簡(jiǎn)單,但乏味。我們?nèi)绾?em>動(dòng)畫化不透明度的變化?如果我們可以根據(jù)狀態(tài)聲明性地設(shè)置所需的不透明度,就像上面那樣,但讓這些值平滑地動(dòng)畫化,豈不是很好?這就是react-spring的作用??梢詫eact-spring視為我們的中間人,它處理我們不斷變化的樣式值,從而產(chǎn)生我們想要的動(dòng)畫值之間的平滑過(guò)渡。像這樣:

const [showA, setShowA] = useState(false);

const fadeStyles = useSpring({
  config: { ...config.stiff },
  from: { opacity: 0 },
  to: {
    opacity: showA ? 1 : 0
  }
});

我們使用from指定初始樣式值,并根據(jù)當(dāng)前狀態(tài)在to部分指定當(dāng)前值。返回值fadeStyles包含我們應(yīng)用于內(nèi)容的實(shí)際樣式值。我們只需要做最后一件事……

您可能認(rèn)為您可以這樣做:

<div style="{fadeStyles}">
  ...
</div>

但這行不通。我們不能使用普通的div,而需要使用從animated導(dǎo)出創(chuàng)建的react-spring div。這聽起來(lái)可能令人困惑,但實(shí)際上只是意味著:

<animated.div style="{fadeStyles}">
  ...
</animated.div>

就是這樣。

高度動(dòng)畫

根據(jù)我們正在動(dòng)畫化的內(nèi)容,我們可能希望內(nèi)容上下滑動(dòng),從零高度到其全尺寸,以便周圍的內(nèi)容平滑地調(diào)整和流動(dòng)到位。您可能希望我們可以簡(jiǎn)單地復(fù)制上面的代碼,高度從零變?yōu)閍uto,但可惜的是,您不能動(dòng)畫化為auto高度。這在普通的CSS和react-spring中都不起作用。相反,我們需要知道內(nèi)容的實(shí)際高度,并在spring的to部分指定它。

我們需要?jiǎng)討B(tài)獲取任意內(nèi)容的高度,以便將其值傳遞給react-spring。事實(shí)證明,Web平臺(tái)專門為此設(shè)計(jì)了一些東西:ResizeObserver。并且它的支持實(shí)際上相當(dāng)不錯(cuò)!由于我們使用的是React,我們當(dāng)然會(huì)將該用法包裝在一個(gè)hook中。我的hook如下所示:

export function useHeight({ on = true /* no value means on */ } = {} as any) {
  const ref = useRef<any>();
  const [height, set] = useState(0);
  const heightRef = useRef(height);
  const [ro] = useState(
    () =>
      new ResizeObserver(packet => {
        if (ref.current && heightRef.current !== ref.current.offsetHeight) {
          heightRef.current = ref.current.offsetHeight;
          set(ref.current.offsetHeight);
        }
      })
  );
  useLayoutEffect(() => {
    if (on && ref.current) {
      set(ref.current.offsetHeight);
      ro.observe(ref.current, {});
    }
    return () => ro.disconnect();
  }, [on, ref.current]);
  return [ref, height as any];
}</any>

我們可以選擇提供一個(gè)on值來(lái)切換測(cè)量功能的啟用和禁用(這將在稍后派上用場(chǎng))。當(dāng)on為true時(shí),我們告訴ResizeObserver觀察我們的內(nèi)容。我們返回一個(gè)需要應(yīng)用于我們想要測(cè)量的任何內(nèi)容的ref,以及當(dāng)前高度。

讓我們看看它的實(shí)際效果。

const [heightRef, height] = useHeight();
const slideInStyles = useSpring({
  config: { ...config.stiff },
  from: { opacity: 0, height: 0 },
  to: {
    opacity: showB ? 1 : 0,
    height: showB ? height : 0
  }
});

<animated.div style="{{" ...slideinstyles overflow:>
  <div ref="{heightRef}">
    This content will fade in and fade out with sliding
  </div>
</animated.div>

useHeight為我們提供了要測(cè)量的ref和內(nèi)容的高度值,我們將其傳遞給我們的spring。然后我們應(yīng)用ref并應(yīng)用高度樣式。

哦,別忘了在容器中添加overflow: hidden。這允許我們正確地包含我們調(diào)整的高度值。

動(dòng)畫過(guò)渡

最后,讓我們看看如何將動(dòng)畫項(xiàng)目添加到DOM中以及從DOM中移除動(dòng)畫項(xiàng)目。我們已經(jīng)知道如何動(dòng)畫化現(xiàn)有項(xiàng)目并保留在DOM中的項(xiàng)目的值變化,但是要?jiǎng)赢嫽砑踊騽h除項(xiàng)目,我們需要一個(gè)新的hook:useTransition

如果您以前使用過(guò)react-spring,這是9.x版本在其API中少數(shù)幾個(gè)有重大更改的地方之一。讓我們來(lái)看一看。

為了動(dòng)畫化項(xiàng)目列表,像這樣:

const [list, setList] = useState([]);

我們將聲明我們的轉(zhuǎn)換函數(shù),如下所示:

const listTransitions = useTransition(list, {
  config: config.gentle,
  from: { opacity: 0, transform: "translate3d(-25%, 0px, 0px)" },
  enter: { opacity: 1, transform: "translate3d(0%, 0px, 0px)" },
  leave: { opacity: 0, height: 0, transform: "translate3d(25%, 0px, 0px)" },
  keys: list.map((item, index) => index)
});

正如我前面提到的,返回值listTransitions是一個(gè)函數(shù)。react-spring正在跟蹤列表數(shù)組,跟蹤已添加和刪除的項(xiàng)目。我們調(diào)用listTransitions函數(shù),提供一個(gè)接受單個(gè)樣式對(duì)象和單個(gè)項(xiàng)目的回調(diào)函數(shù),react-spring將根據(jù)項(xiàng)目是新添加的、新刪除的還是只是位于列表中,為列表中的每個(gè)項(xiàng)目調(diào)用它,并使用正確的樣式。

注意keys部分:這允許我們告訴react-spring如何識(shí)別列表中的對(duì)象。在本例中,我決定告訴react-spring數(shù)組中項(xiàng)目的索引唯一地定義該項(xiàng)目。通常情況下,這是一個(gè)糟糕的主意,但現(xiàn)在,它讓我們可以看到該功能的實(shí)際效果。在下面的演示中,“添加項(xiàng)目”按鈕在單擊時(shí)將項(xiàng)目添加到列表的末尾,“刪除最后一個(gè)項(xiàng)目”按鈕從列表中刪除最近添加的項(xiàng)目。因此,如果您在輸入框中鍵入內(nèi)容,然后快速點(diǎn)擊“添加”按鈕,然后點(diǎn)擊“刪除”按鈕,您將看到相同的項(xiàng)目平滑地開始進(jìn)入,然后立即從動(dòng)畫的任何階段開始離開。相反,如果您添加一個(gè)項(xiàng)目,然后快速點(diǎn)擊“刪除”按鈕和“添加”按鈕,則相同的項(xiàng)目將開始滑動(dòng),然后突然停止到位,并滑動(dòng)回它所在的位置。

演示

哇,說(shuō)了這么多話!這是一個(gè)可運(yùn)行的演示,展示了我們剛剛介紹的所有內(nèi)容。

[演示鏈接]

其他細(xì)節(jié)

您是否注意到,當(dāng)您在演示中向下滑動(dòng)內(nèi)容時(shí),它會(huì)像……彈簧一樣彈到位?這就是名稱的由來(lái):react-spring使用彈簧物理學(xué)來(lái)插值我們不斷變化的值。它不會(huì)簡(jiǎn)單地將值變化分成N個(gè)相等增量,然后在N個(gè)相等延遲內(nèi)應(yīng)用這些增量。相反,它使用更復(fù)雜的算法來(lái)產(chǎn)生這種類似彈簧的效果,這將顯得更自然。

彈簧算法是完全可配置的,它帶有一些您可以直接使用的預(yù)設(shè)——上面的演示使用了stiffgentle預(yù)設(shè)。請(qǐng)參閱文檔了解更多信息。

另請(qǐng)注意,我如何在translate3d值內(nèi)動(dòng)畫化值。如您所見,語(yǔ)法不是最簡(jiǎn)潔的,因此react-spring提供了一些快捷方式。對(duì)此有文檔說(shuō)明,但在本文的其余部分,為了保持清晰起見,我將繼續(xù)使用完整的非快捷方式語(yǔ)法。

最后,我要提請(qǐng)注意,當(dāng)您在上面的演示中向上滑動(dòng)內(nèi)容時(shí),您可能會(huì)看到其下面的內(nèi)容在最后有點(diǎn)跳動(dòng)。這是由于相同的彈跳效果造成的。當(dāng)內(nèi)容彈跳到位時(shí),它看起來(lái)很清晰,但當(dāng)我們向上滑動(dòng)內(nèi)容時(shí),則不然。請(qǐng)繼續(xù)關(guān)注我們將如何將其關(guān)閉。(劇透,它是clamp屬性)。

關(guān)于這些沙箱的一些注意事項(xiàng)

Code Sandbox使用熱重載。當(dāng)您更改代碼時(shí),更改通常會(huì)立即反映出來(lái)。這很酷,但可能會(huì)對(duì)動(dòng)畫造成破壞。如果您開始修補(bǔ),然后看到奇怪的、表面上不正確的行為,請(qǐng)嘗試刷新沙箱。

本文中的其他沙箱將使用模態(tài)。由于我無(wú)法完全弄清楚的原因,當(dāng)模態(tài)打開時(shí),您將無(wú)法修改任何代碼——模態(tài)拒絕放棄焦點(diǎn)。因此,請(qǐng)務(wù)必在嘗試任何更改之前關(guān)閉模態(tài)。

構(gòu)建實(shí)際應(yīng)用

這些是react-spring的基本構(gòu)建塊。讓我們用它們來(lái)構(gòu)建一些更有趣的東西。鑒于以上所有內(nèi)容,您可能會(huì)認(rèn)為react-spring非常易于使用。不幸的是,在實(shí)踐中,弄清楚一些需要正確處理的細(xì)微之處可能很棘手。本文的其余部分將深入探討許多這些細(xì)節(jié)。

我以前撰寫的博客文章在某種程度上與我的書單項(xiàng)目相關(guān)。這篇也不例外——這不是癡迷,只是該項(xiàng)目碰巧有一個(gè)公開可用的GraphQL端點(diǎn)和大量可以利用的現(xiàn)有代碼,使其成為一個(gè)顯而易見的目標(biāo)。

讓我們構(gòu)建一個(gè)UI,允許您打開模態(tài)并搜索書籍。當(dāng)結(jié)果出現(xiàn)時(shí),您可以將它們添加到顯示在模態(tài)下方的已選書籍的運(yùn)行列表中。完成后,您可以關(guān)閉模態(tài)并單擊一個(gè)按鈕以查找與所選書籍類似的書籍。

我們將從一個(gè)功能齊全的UI開始,然后逐步為各個(gè)部分添加動(dòng)畫,包括交互式演示。

如果您真的渴望了解最終結(jié)果是什么樣的,或者您已經(jīng)熟悉react-spring并想看看我是否涵蓋了您還不了解的內(nèi)容,這里就是它(它不會(huì)贏得任何設(shè)計(jì)獎(jiǎng),我很清楚)。本文的其余部分將逐步介紹實(shí)現(xiàn)最終狀態(tài)的過(guò)程。

動(dòng)畫化我們的模態(tài)

讓我們從我們的模態(tài)開始。在我們開始添加任何數(shù)據(jù)之前,讓我們讓我們的模態(tài)動(dòng)畫化得很好。這是一個(gè)基本的、未動(dòng)畫化的模態(tài)的樣子。我使用的是Ryan Florence的Reach UI(特別是模態(tài)組件),但無(wú)論您使用什么來(lái)構(gòu)建模態(tài),這個(gè)想法都是一樣的。我們希望讓我們的背景淡入,并轉(zhuǎn)換我們的模態(tài)內(nèi)容。

由于模態(tài)是根據(jù)某種“open”屬性有條件地呈現(xiàn)的,因此我們將使用useTransition hook。我已經(jīng)用我自己的模態(tài)組件包裝了Reach UI模態(tài),并根據(jù)isOpen屬性呈現(xiàn)空內(nèi)容或?qū)嶋H模態(tài)。我們只需要通過(guò)轉(zhuǎn)換hook來(lái)使其動(dòng)畫化。

以下是轉(zhuǎn)換hook的樣子:

const modalTransition = useTransition(!!isOpen, {
  config: isOpen ? { ...config.stiff } : { duration: 150 },
  from: { opacity: 0, transform: `translate3d(0px, -10px, 0px)` },
  enter: { opacity: 1, transform: `translate3d(0px, 0px, 0px)` },
  leave: { opacity: 0, transform: `translate3d(0px, 10px, 0px)` }
});

這里沒有什么太大的驚喜。我們希望淡入內(nèi)容并根據(jù)模態(tài)是否處于活動(dòng)狀態(tài)提供輕微的垂直轉(zhuǎn)換。奇怪的部分是這個(gè):

config: isOpen ? { ...config.stiff } : { duration: 150 },

我只想在模態(tài)打開時(shí)使用彈簧物理學(xué)。這樣做的原因——至少根據(jù)我的經(jīng)驗(yàn)——是當(dāng)您關(guān)閉模態(tài)時(shí),背景消失的時(shí)間太長(zhǎng),這會(huì)導(dǎo)致底層UI的交互性時(shí)間過(guò)長(zhǎng)。因此,當(dāng)模態(tài)打開時(shí),它將通過(guò)彈簧物理學(xué)很好地彈到位,而當(dāng)關(guān)閉時(shí),它將在150毫秒內(nèi)快速消失。

當(dāng)然,我們將通過(guò)hook返回的轉(zhuǎn)換函數(shù)呈現(xiàn)我們的內(nèi)容。請(qǐng)注意,我正在從樣式對(duì)象中提取不透明度樣式以應(yīng)用于背景,然后將所有動(dòng)畫樣式應(yīng)用于實(shí)際的模態(tài)內(nèi)容。

return modalTransition(
  (styles, isOpen) =>
    isOpen && (
      <animateddialogoverlay allowpinchzoom="{true}" initialfocusref="{focusRef}" isopen="{isOpen}" ondismiss="{onHide}" style="{{" opacity: styles.opacity>
        <animateddialogcontent style="{{" border: solid hsla borderradius: maxwidth:>
          <div>
            <div>
              <standardmodalheader caption="{headerCaption}" onhide="{onHide}"></standardmodalheader>
              {children}
            </div>
          </div>
        </animateddialogcontent>
      </animateddialogoverlay>
    )
);

[演示鏈接]

剩余部分省略,因?yàn)槠^(guò)長(zhǎng),且與前面內(nèi)容重復(fù)。 核心思想是利用react-spring的useSpringuseTransition hook,結(jié)合ResizeObserver來(lái)實(shí)現(xiàn)各種動(dòng)畫效果,包括淡入淡出、高度變化、以及列表項(xiàng)目的進(jìn)出動(dòng)畫。 文中詳細(xì)解釋了如何處理動(dòng)畫的細(xì)節(jié),例如初始狀態(tài)、動(dòng)畫時(shí)長(zhǎng)、以及如何避免動(dòng)畫沖突。 最終效果是一個(gè)流暢且用戶體驗(yàn)良好的交互式UI。

以上是使反應(yīng)彈簧有意義的詳細(xì)內(nèi)容。更多信息請(qǐng)關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本站聲明
本文內(nèi)容由網(wǎng)友自發(fā)貢獻(xiàn),版權(quán)歸原作者所有,本站不承擔(dān)相應(yīng)法律責(zé)任。如您發(fā)現(xiàn)有涉嫌抄襲侵權(quán)的內(nèi)容,請(qǐng)聯(lián)系admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣服圖片

Undresser.AI Undress

Undresser.AI Undress

人工智能驅(qū)動(dòng)的應(yīng)用程序,用于創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用于從照片中去除衣服的在線人工智能工具。

Clothoff.io

Clothoff.io

AI脫衣機(jī)

Video Face Swap

Video Face Swap

使用我們完全免費(fèi)的人工智能換臉工具輕松在任何視頻中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的代碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

功能強(qiáng)大的PHP集成開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁(yè)開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級(jí)代碼編輯軟件(SublimeText3)

如何僅在某些頁(yè)面上包括CSS? 如何僅在某些頁(yè)面上包括CSS? Jun 11, 2025 am 12:01 AM

選擇性包含CSS在特定頁(yè)面上的方法有三種:1.內(nèi)聯(lián)CSS,適用于不常訪問(wèn)或需要獨(dú)特樣式的頁(yè)面;2.使用JavaScript條件加載外部CSS文件,適合需要靈活性的情況;3.服務(wù)器端包含,適用于使用服務(wù)器端語(yǔ)言的場(chǎng)景。這種方法可以優(yōu)化網(wǎng)站性能和可維護(hù)性,但需平衡模塊化與性能。

什么是'渲染障礙CSS”? 什么是'渲染障礙CSS”? Jun 24, 2025 am 12:42 AM

CSS會(huì)阻塞頁(yè)面渲染是因?yàn)闉g覽器默認(rèn)將內(nèi)聯(lián)和外部CSS視為關(guān)鍵資源,尤其是使用引入的樣式表、頭部大量?jī)?nèi)聯(lián)CSS以及未優(yōu)化的媒體查詢樣式。1.提取關(guān)鍵CSS并內(nèi)嵌至HTML;2.延遲加載非關(guān)鍵CSS通過(guò)JavaScript;3.使用media屬性優(yōu)化加載如打印樣式;4.壓縮合并CSS減少請(qǐng)求。建議使用工具提取關(guān)鍵CSS,結(jié)合rel="preload"異步加載,合理使用media延遲加載,避免過(guò)度拆分與復(fù)雜腳本控制。

如何在無(wú)花果中使用Lotties 如何在無(wú)花果中使用Lotties Jun 14, 2025 am 10:17 AM

在接下來(lái)的教程中,我將向您展示如何在無(wú)花果中創(chuàng)建Lottie動(dòng)畫。我們將使用兩種彩色設(shè)計(jì)來(lái)超越如何在無(wú)花果上進(jìn)行動(dòng)畫,然后向您展示如何從Figma到Lottie動(dòng)畫。您只需要免費(fèi)無(wú)花果

打破邊界:用(s)CSS構(gòu)建湯姆拼圖 打破邊界:用(s)CSS構(gòu)建湯姆拼圖 Jun 13, 2025 am 11:33 AM

我們對(duì)其進(jìn)行了測(cè)試,事實(shí)證明,至少在低級(jí)邏輯和拼圖行為時(shí),Sass可以替換JavaScript。除了地圖,混音,功能和大量數(shù)學(xué)外,我們都設(shè)法使我們的Tangram難題栩栩如生,沒有J

外部與內(nèi)部CSS:最好的方法是什么? 外部與內(nèi)部CSS:最好的方法是什么? Jun 20, 2025 am 12:45 AM

thebestapphachforcssdepprodsontheproject'sspefificneeds.forlargerprojects,externalcsSissBetterDuoSmaintoMaintainability andReusability; forsMallerProjectsorsingle-pageApplications,InternaltCsmightBemoresobleable.InternalCsmightBemorese.it.it'sclucialtobalancepopryseceneceenceprodrenceprodrenceNeed

我的CSS必須在較低的情況下嗎? 我的CSS必須在較低的情況下嗎? Jun 19, 2025 am 12:29 AM

否,CSSDOESNOTHAVETOBEINLOWERCASE.CHOMENDENS,使用flowercaseisrecommondendendending:1)一致性和可讀性,2)避免使用促進(jìn)性技術(shù),3)潛在的Performent FormanceBenefits,以及4)RightCollaboraboraboraboraboraboraboraboraboraboraboraboraboraboraboraboraborationWithInteams。

CSS計(jì)數(shù)器:一個(gè)逐步教程,示例 CSS計(jì)數(shù)器:一個(gè)逐步教程,示例 Jun 12, 2025 am 10:31 AM

CSSCounters是一種用于創(chuàng)建自動(dòng)編號(hào)的工具。1.基本用法:通過(guò)counter-reset和counter-increment定義和操作計(jì)數(shù)器,如在h2前顯示"SectionX."。2.高級(jí)用法:使用嵌套計(jì)數(shù)器創(chuàng)建復(fù)雜編號(hào),如章節(jié)和小節(jié)編號(hào)。3.注意事項(xiàng):確保正確重置計(jì)數(shù)器,優(yōu)化性能,簡(jiǎn)化計(jì)數(shù)器邏輯。4.最佳實(shí)踐:命名清晰,在CSS中定義計(jì)數(shù)器,合理使用counter-increment和counter-reset。

CSS案例靈敏度:了解重要的 CSS案例靈敏度:了解重要的 Jun 20, 2025 am 12:09 AM

cssismostlycaseminemintiment,buturlsandfontfamilynamesarecase敏感。1)屬性和valueslikeColor:紅色; prenotcase-sensive.2)urlsmustmustmatchtheserver'server'scase,例如

See all articles