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

目錄
動(dòng)畫任何東西
去“元”
實(shí)現(xiàn)“完美”循環(huán)
將其連接到滾動(dòng)
無限滾動(dòng)時(shí)間旅行
滾動(dòng)折斷
就是這樣!
首頁 web前端 css教學(xué) 進(jìn)行' meta gsap”:尋求'完美”無限滾動(dòng)

進(jìn)行' meta gsap”:尋求'完美”無限滾動(dòng)

Mar 25, 2025 am 10:23 AM

進(jìn)行“ meta gsap”:尋求“完美”無限滾動(dòng)

我不確定這是怎麼回事。但是,這是一個(gè)故事。本文更多地是關(guān)於一個(gè)概念,該概念將幫助您以不同的方式思考動(dòng)畫。碰巧的是,這個(gè)特定的示例具有無限的滾動(dòng) - 特別是無需複制任何一個(gè)卡片的“完美”無限滾動(dòng)。

我為什麼在這裡?好吧,這一切都始於一條推文。一條推文讓我思考了佈局和側(cè)滾動(dòng)內(nèi)容。

我接受了這個(gè)概念,並在我的網(wǎng)站上使用了它。而且它在寫作時(shí)仍在行動(dòng)。

然後,我開始考慮畫廊的觀點(diǎn)和側(cè)滾動(dòng)概念。我們跳上了一個(gè)直播,決定嘗試製作類似舊的蘋果“覆蓋流”圖案之類的東西。還記得嗎?

我對(duì)此做出的第一個(gè)想法,假設(shè)我會(huì)做到這一點(diǎn),這樣就可以在沒有JavaScript的情況下使用,就像上面的演示中一樣,它使用“漸進(jìn)式增強(qiáng)”。我抓住了Greensock和Scrolltrigger,我們走了。我離開了這項(xiàng)工作,這讓我失望了。我有一些東西,但不能完全滾動(dòng)滾動(dòng)以操作我想要的方式。 “下一個(gè)”和“以前”按鈕不想打球。您可以在這裡看到它,並且需要水平滾動(dòng)。

因此,我在Greensock論壇上打開了一個(gè)新線程。我?guī)缀醪恢牢乙_放一些認(rèn)真的學(xué)習(xí)!我們用按鈕解決了問題。但是,成為我,我不得不問是否可能還有其他事情。有沒有一種“乾淨(jìng)”的方法來進(jìn)行無限的滾動(dòng)?我在溪流上嘗試了一些東西,但沒有運(yùn)氣。我很好奇。我嘗試了這支筆在Scrolltrigger版本中創(chuàng)建的類似技術(shù)。

最初的答案是,要做有點(diǎn)棘手:

關(guān)於滾動(dòng)上無限事物的困難部分是,滾動(dòng)條是有限的,而您想要的效果不是。因此,您必須像此演示(在Scrolltrigger演示部分中找到)一樣循環(huán)滾動(dòng)位置,或直接掛在與捲軸相關(guān)的導(dǎo)航事件(例如車輪事件)中,而不是實(shí)際使用實(shí)際的滾動(dòng)位置。

我認(rèn)為就是這種情況,很高興將其“原樣”。幾天過去了,當(dāng)我開始挖掘它時(shí),傑克(Jack)放棄了我的想法?,F(xiàn)在,經(jīng)過一大堆經(jīng)過,我在這裡與您分享該技術(shù)。

動(dòng)畫任何東西

GSAP通常會(huì)忽略的一件事是,您幾乎可以用它來動(dòng)畫。這通常是因?yàn)橐曈X事物在思考動(dòng)畫時(shí)會(huì)想到什麼 - 事物的實(shí)際身體運(yùn)動(dòng)。我們的第一個(gè)想法並不是要將該過程帶到元級(jí)別並從退後一步。

但是,考慮動(dòng)畫的工作,然後將其分解為層。例如,您玩動(dòng)畫片??ㄍㄊ且幌盗凶髌贰C總€(gè)構(gòu)圖都是場(chǎng)景。然後,您有能力擦洗與遙控器的構(gòu)圖集,無論是在YouTube上,使用電視遙控器還是其他任何內(nèi)容。正在發(fā)生的事情幾乎有三個(gè)層次。

這是我們創(chuàng)建不同類型的無限循環(huán)所需的技巧。這是這裡的主要概念。我們用時(shí)間軸為時(shí)間表的播放頭部位置動(dòng)畫。然後,我們可以用滾動(dòng)位置擦洗該時(shí)間表。

不用擔(dān)心這聽起來令人困惑。我們將分解它。

去“元”

讓我們從一個(gè)示例開始。我們將創(chuàng)建一個(gè)補(bǔ)間,將一些盒子從左到右移動(dòng)。這裡是。

十箱不斷向右到右。 Greensock非常簡單。在這裡,我們使用“從圖”和重複來保持動(dòng)畫的運(yùn)行。但是,我們?cè)诿看蔚拈_始時(shí)都有差距。我們還在使用同路大車來擺脫運(yùn)動(dòng),這將在我們繼續(xù)時(shí)發(fā)揮重要作用。

 gsap.fromto('。box',{
  XPercent:100
},{
  Xpercent:-200,
  交錯(cuò):0.5,
  持續(xù)時(shí)間:1,
  重複:-1,
  輕鬆:'無',
}))

現(xiàn)在是有趣的部分。讓我們暫停補(bǔ)間,並將其分配給變量。然後,讓我們創(chuàng)建一個(gè)播放它的補(bǔ)間。我們可以通過對(duì)補(bǔ)間的總時(shí)間進(jìn)行補(bǔ)充來做到這一點(diǎn),這使我們可以在考慮重複和重複延遲的同時(shí)獲得或設(shè)置Tween的播放頭。

 const shift = gsap.fromto('。box',{
  XPercent:100
},{
  暫停:是的,
  Xpercent:-200,
  交錯(cuò):0.5,
  持續(xù)時(shí)間:1,
  重複:-1,
  輕鬆:'無',
}))

固定持續(xù)時(shí)間= shift.duration()

gsap.to(shift,{
  總時(shí)間:持續(xù)時(shí)間,
  重複:-1,
  持續(xù)時(shí)間:持續(xù)時(shí)間,
  輕鬆:'無',
}))

這是我們的第一個(gè)“元”補(bǔ)間。它看起來完全相同,但我們正在添加另一個(gè)控制級(jí)別。我們可以在此層上更改內(nèi)容而不會(huì)影響原始層。例如,我們可以將補(bǔ)間更改為power4.in。這完全改變了動(dòng)畫,但不會(huì)影響基礎(chǔ)動(dòng)畫。我們有點(diǎn)以後備為保護(hù)自己。

不僅如此,我們可能會(huì)選擇僅重複時(shí)間表的某個(gè)部分。我們可以與另一個(gè)從這樣做的事情來做到這一點(diǎn):

代碼將是這樣的。

 gsap.fromto(shift,{
  總時(shí)間:2,
},{
  總時(shí)間:持續(xù)時(shí)間-1,
  重複:-1,
  持續(xù)時(shí)間:持續(xù)時(shí)間,
  輕鬆:'無'
}))

你看到這要去哪裡了嗎?看那個(gè)補(bǔ)間。儘管它一直在循環(huán),但每次重複的數(shù)字都會(huì)翻轉(zhuǎn)。但是,盒子處於正確的位置。

實(shí)現(xiàn)“完美”循環(huán)

如果我們回到原始示例,則每個(gè)重複之間存在明顯的差距。

這是訣竅。解鎖一切的部分。我們需要建立一個(gè)完美的循環(huán)。

讓我們從重複三次轉(zhuǎn)移開始。它等於使用重複:3。請(qǐng)注意,我們?nèi)绾蝿h除重複:-1。

 const getShift =()=> gsap.fromto('。box',{
  XPercent:100
},{
  Xpercent:-200,
  交錯(cuò):0.5,
  持續(xù)時(shí)間:1,
  輕鬆:'無',
}))

const loop = gsap.timeline()
  .add(getShift())
  .add(getShift())
  .add(getShift())

我們將最初的補(bǔ)間變成了返回補(bǔ)間的函數(shù),然後將其添加到新的時(shí)間軸中。這給了我們以下內(nèi)容。

好的。但是,仍然存在差距。現(xiàn)在,我們可以提出添加和定位這些二聚體的位置參數(shù)。我們希望它是無縫的。這意味著在前一個(gè)結(jié)束之前插入每組兩組。這是基於交錯(cuò)和元素?cái)?shù)量的價(jià)值。

常量性交錯(cuò)= 0.5 //在我們的轉(zhuǎn)移之間使用
const box = gsap.utils.toarray('。box')
const loop = gsap.timeline({{
  重複:-1
}))
  .add(getShift(),0)
  .add(getShift(),boxes.length * stagger)
  .add(getShift(),boxes.length * stagger * 2)

如果我們更新時(shí)間表以重複並觀看(同時(shí)調(diào)整交錯(cuò)以查看它如何影響事物)…

您會(huì)注意到中間有SA窗口會(huì)產(chǎn)生一個(gè)“無縫”循環(huán)?;叵肫鹞覀儾倏v時(shí)間的早期技能嗎?這就是我們?cè)谶@裡需要做的:循環(huán)循環(huán)“無縫”的時(shí)間窗口。

我們可以嘗試通過循環(huán)的那個(gè)窗口對(duì)總時(shí)間進(jìn)行補(bǔ)充。

 const loop = gsap.timeline({{
  暫停:是的,
  重複:-1,
}))
.add(getShift(),0)
.add(getShift(),boxes.length * stagger)
.add(getShift(),boxes.length * stagger * 2)

gsap.fromto(loop,{
  總時(shí)間:4.75,
},,
{
  總時(shí)間:'= 5',
  持續(xù)時(shí)間:10,
  輕鬆:'無',
  重複:-1,
}))

在這裡,我們說的是總時(shí)間為4.75,並將周期的長度添加到此。一個(gè)週期的長度為5。這是時(shí)間軸的中間窗口。我們可以使用GSAP的nifty =做到這一點(diǎn),這給了我們這一點(diǎn):

花點(diǎn)時(shí)間消化那裡發(fā)生的事情。這可能是將您的頭纏住的最棘手的部分。我們正在計(jì)算時(shí)間表的時(shí)間窗口。很難可視化,但我已經(jīng)走了。

這是一款手錶的演示,只有12秒鐘的手走一次。它是無限地循環(huán)的,重複:-1,然後我們使用從給定持續(xù)時(shí)間的特定時(shí)間窗口進(jìn)行動(dòng)畫。如果您減少說2和6??的時(shí)間窗口,然後將持續(xù)時(shí)間更改為1,雙手重複時(shí)將從2點(diǎn)鐘到6點(diǎn)。但是,我們從未改變過基本動(dòng)畫。

嘗試配置值以查看其如何影響事物。

在這一點(diǎn)上,最好為我們的窗戶位置建立一個(gè)公式。我們還可以在每個(gè)盒子過渡的持續(xù)時(shí)間內(nèi)使用變量。

固定持續(xù)時(shí)間= 1
const cycle_duration = boxes.length *交錯(cuò)
const start_time = cycle_duration(持續(xù)時(shí)間 * 0.5)
const end_time = start_time cycle_duration

我們可以在三倍的元素上循環(huán)循環(huán),而不是使用三個(gè)堆疊的時(shí)間表,在那裡我們獲得了不需要計(jì)算位置的好處。不過,將其視為三個(gè)堆疊的時(shí)間表是一種巧妙的方式,可以理解這一概念,這是一種很好的方法。

讓我們更改我們的實(shí)現(xiàn),從一開始就創(chuàng)建一個(gè)重要的時(shí)間表。

恆量交錯(cuò)= 0.5
const box = gsap.utils.toarray('。box')

const loop = gsap.timeline({{
  暫停:是的,
  重複:-1,
}))

const shifts = [...盒子,...盒子,...盒子]

shifts.foreach((框,索引)=> {
  loop.fromto(box,{
    XPercent:100
  },{
    Xpercent:-200,
    持續(xù)時(shí)間:1,
    輕鬆:'無',
  },索引 *交錯(cuò))
}))

這更容易組合在一起,並為我們提供相同的窗口。但是,我們不需要考慮數(shù)學(xué)。現(xiàn)在,我們循環(huán)瀏覽三組盒子,並根據(jù)交錯(cuò)定位每個(gè)動(dòng)畫。

如果我們調(diào)整交錯(cuò),那看起來會(huì)怎樣?它會(huì)將盒子擠在一起。

但是,它破了窗口,因?yàn)楝F(xiàn)在總時(shí)間已經(jīng)過去了。我們需要重新計(jì)算窗口?,F(xiàn)在是插入我們之前計(jì)算出的公式的好時(shí)機(jī)。

固定持續(xù)時(shí)間= 1
const cycle_duration =交錯(cuò) * boxes.length
const start_time = cycle_duration(持續(xù)時(shí)間 * 0.5)
const end_time = start_time cycle_duration

gsap.fromto(loop,{
  總時(shí)間:start_time,
},,
{
  總時(shí)間:end_time,
  持續(xù)時(shí)間:10,
  輕鬆:'無',
  重複:-1,
}))

固定的!

如果我們想更改起始位置,我們甚至可以引入“偏移”。

恆量交錯(cuò)= 0.5
const偏移= 5 *交錯(cuò)
const start_time =(Cycle_duration(差異 * 0.5))偏移

現(xiàn)在,我們的窗口從不同的位置開始。

但是,這並不是很棒,因?yàn)樗趦啥硕冀o了我們這些尷尬的堆棧。為了擺脫這種效果,我們需要考慮一個(gè)框的“物理”窗口?;蚩紤]他們?nèi)绾芜M(jìn)入和退出現(xiàn)場(chǎng)。

我們將使用Document.Body作為我們的示例的窗口。讓我們更新框,以作為單個(gè)時(shí)間表,盒子在Enter上和退出時(shí)向下擴(kuò)展。我們可以使用Yoyo並重複:1進(jìn)入進(jìn)入和退出。

 shifts.foreach((框,索引)=> {
  const box_tl = gsap
    .timeline()
    .fromto(
      盒子,
      {
        Xpercent:100,
      },,
      {
        Xpercent:-200,
        持續(xù)時(shí)間:1,
        輕鬆:'無',
      },0
    )
    .fromto(
      盒子,
      {
        比例:0,
      },,
      {
        比例:1,
        重複:1,
        Yoyo:是的,
        輕鬆:'無',
        持續(xù)時(shí)間:0.5,
      },,
      0
    )
  loop.Add(box_tl,索引 *交錯(cuò))
}))

為什麼我們使用時(shí)間軸持續(xù)時(shí)間為1?它使事情更容易遵循。我們知道盒子位於中點(diǎn)時(shí)的時(shí)間為0.5。值得注意的是,放鬆將沒有我們通常在這裡想到的效果。實(shí)際上,放鬆實(shí)際上將在盒子的定位方式中發(fā)揮作用。例如,一個(gè)輕鬆的插件會(huì)在右邊的盒子上束縛,然後再移動(dòng)。

上面的代碼為我們提供了。

幾乎。但是,我們的盒子在中間消失了一段時(shí)間。為了解決此問題,讓我們介紹即時(shí)屬性。它的作用類似於Animation-Fill模式:CSS中無。我們告訴GSAP,我們不想保留或預(yù)記錄任何盒子上的任何樣式。

 shifts.foreach((框,索引)=> {
  const box_tl = gsap
    .timeline()
    .fromto(
      盒子,
      {
        Xpercent:100,
      },,
      {
        Xpercent:-200,
        持續(xù)時(shí)間:1,
        輕鬆:'無',
        直系程序:false,
      },0
    )
    .fromto(
      盒子,
      {
        比例:0,
      },,
      {
        比例:1,
        重複:1,
        zindex:boxes.length 1,
        Yoyo:是的,
        輕鬆:'無',
        持續(xù)時(shí)間:0.5,
        直系程序:false,
      },,
      0
    )
  loop.Add(box_tl,索引 *交錯(cuò))
}))

那個(gè)小的變化為我們解決了!請(qǐng)注意我們還如何包括z index:boxes.length。這應(yīng)該保護(hù)我們免受任何z指數(shù)問題。

我們有它!我們的第一個(gè)無縫無縫循環(huán)。沒有重複的元素和完美的延續(xù)。我們正在彎曲時(shí)間!如果您走了這麼遠(yuǎn),請(qǐng)輕拍自己的後背! ?

如果我們想一次看到更多的盒子,我們可以修補(bǔ)時(shí)機(jī),交錯(cuò)和輕鬆。在這裡,我們的交錯(cuò)為0.2,我們還將不透明度引入了混合。

這裡的關(guān)鍵部分是我們可以利用retoperdelay,以便不透明度過渡比刻度更快。在0.25秒內(nèi)褪色。等待0.5秒。淡出0.25秒以上。

 .fromto(
  盒子, {
    不透明度:0,
  },{
    不透明度:1,
    持續(xù)時(shí)間:0.25,
    重複:1,
    repoydelay:0.5,
    直系程序:false,
    輕鬆:'無',
    Yoyo:是的,
  },0)

涼爽的!我們可以對(duì)那些進(jìn)出過渡的人做任何想做的事情。這裡的主要內(nèi)容是,我們有時(shí)間窗口為我們提供無限的循環(huán)。

將其連接到滾動(dòng)

現(xiàn)在我們有了一個(gè)無縫的循環(huán),讓我們將其連接到滾動(dòng)中。為此,我們可以使用GSAP的Scrolltrigger。這需要額外的補(bǔ)間來擦洗我們的循環(huán)窗口。請(qǐng)注意,我們現(xiàn)在也設(shè)置了現(xiàn)在要暫停的循環(huán)。

 const loop_head = gsap.fromto(loop,{
  總時(shí)間:start_time,
},,
{
  總時(shí)間:end_time,
  持續(xù)時(shí)間:10,
  輕鬆:'無',
  重複:-1,
  暫停:是的,
}))

const scrub = gsap.to(loop_head,{
  總時(shí)間:0,
  暫停:是的,
  持續(xù)時(shí)間:1,
  輕鬆:'無',
}))

這裡的訣竅是使用Scrolltrigger通過更新擦洗的總時(shí)間來擦洗循環(huán)的播放頭。我們可以通過多種方式來設(shè)置此滾動(dòng)。我們可以水平或綁定到容器。但是,我們要做的就是將盒子包裹在.boxes元素中,然後將其固定在視口上。 (這可以修復(fù)其在視口上的位置。)我們還將堅(jiān)持垂直滾動(dòng)。檢查演示以查看.box的樣式,以將事物設(shè)置為視口的大小。

從'https://cdn.skypack.dev/gsap/scrolltrigger'導(dǎo)入scrolltrigger'
gsap.registerplugin(scrolltrigger)

scrolltrigger.create({{
  開始:0,
  結(jié)束:'= 2000',
  水平:錯(cuò)誤,
  PIN:'.boxes',
  onupdate:self => {
    scrub.vars.totaltime = loop_head.duration() * self.progress
    scrub.invalidate()。 restart()
  }
}))

重要的部分是在update內(nèi)部。那就是我們根據(jù)滾動(dòng)進(jìn)度設(shè)置補(bǔ)間的總時(shí)間。無效的呼叫將沖洗磨砂膏的任何內(nèi)部記錄的位置。然後,重新啟動(dòng)將位置設(shè)置為我們?cè)O(shè)置的新總時(shí)間。

嘗試一下!我們可以在時(shí)間軸中來回來回更新位置。

那有多酷?我們可以滾動(dòng)以擦洗一個(gè)時(shí)間表,該時(shí)間表擦洗時(shí)間線,該時(shí)間表是時(shí)間表的窗口。消化一秒鐘,因?yàn)槟鞘沁@裡發(fā)生的事情。

無限滾動(dòng)時(shí)間旅行

到目前為止,我們一直在操縱時(shí)間?,F(xiàn)在我們要去旅行!

為此,我們將使用其他一些GSAP實(shí)用程序,並且我們將不再擦洗LOOP_HEAD的總時(shí)間。相反,我們將通過代理進(jìn)行更新。這是進(jìn)行“ meta” GSAP的另一個(gè)很好的例子。

讓我們從標(biāo)記播放頭位置的代理對(duì)像開始。

 const playhead = {位置:0}

現(xiàn)在,我們可以更新磨砂膏以更新位置。同時(shí),我們可以使用GSAP的包裝實(shí)用程序,該實(shí)用程序?qū)⑽恢弥蛋贚oop_head持續(xù)時(shí)間周圍。例如,如果持續(xù)時(shí)間為10,並且我們提供值11,我們將返回1。

 const position_wrap = gsap.utils.wrap(0,loop_head.duration())

const scrub = gsap.to(playhead,{
  位置:0,
  onupdate :()=> {
    loop_head.totaltime(position_wrap(playhead.position))
  },,
  暫停:是的,
  持續(xù)時(shí)間:1,
  輕鬆:'無',
}))

最後但並非最不重要的一點(diǎn)是,我們需要修改Scrolltrigger,以便更新磨砂膏上的正確變量。那是位置,而不是總時(shí)間。

 scrolltrigger.create({{
  開始:0,
  結(jié)束:'= 2000',
  水平:錯(cuò)誤,
  PIN:'.boxes',
  onupdate:self => {
    scrub.vars.position = loop_head.duration() * self.progress
    scrub.invalidate()。 restart()
  }
}))

在這一點(diǎn)上,我們已經(jīng)轉(zhuǎn)到了代理,我們看不到任何更改。

滾動(dòng)時(shí),我們想要無限的循環(huán)。我們的第一個(gè)想法可能是當(dāng)我們完成滾動(dòng)進(jìn)度時(shí)滾動(dòng)開始。這將做到這一點(diǎn),向後滾動(dòng)。儘管這就是我們想做的,但我們不希望播放頭向後擦洗。這是總時(shí)間到來的地方。還記得嗎?它根據(jù)總體策略獲得或設(shè)置播放頭的位置,其中包括任何重複和重複延遲。

例如,假設(shè)循環(huán)頭的持續(xù)時(shí)間為5,我們到達(dá)那裡,我們不會(huì)擦洗0。相反,我們將繼續(xù)將循環(huán)頭擦洗至10。如果我們繼續(xù)前進(jìn),它將達(dá)到15,等等。同時(shí),我們將跟蹤迭代變量,因?yàn)檫@告訴我們我們?cè)谀ド案嘀械奈恢谩N覀冞€將確保只有在達(dá)到進(jìn)度閾值時(shí)才更新迭代。

讓我們從迭代變量開始:

讓迭代= 0

現(xiàn)在,讓我們更新我們的Scrolltrigger實(shí)現(xiàn):

 const trigger = scrolltrigger.create({{
  開始:0,
  結(jié)束:'= 2000',
  水平:錯(cuò)誤,
  PIN:'.boxes',
  onupdate:self => {
    const scroll = self.scroll()
    如果(滾動(dòng)> self.end -end -1){
      //及時(shí)前進(jìn)
      包裹(1,1)
    } else if(scroll <p>請(qǐng)注意,我們現(xiàn)在如何將迭代考慮到位置計(jì)算中。請(qǐng)記住,這與洗滌器包裹在一起。我們還檢測(cè)到何時(shí)達(dá)到滾動(dòng)的極限,這就是我們包裝的重點(diǎn)。此功能設(shè)置適當(dāng)?shù)牡祦K設(shè)置新的滾動(dòng)位置。</p><pre rel="JavaScript" data-line=""> const wrap =(iterationdelta,scrollto)=> {
  迭代= iterationdelta
  trigger.scroll(scrollto)
  trigger.update()
}

我們有無限的滾動(dòng)!如果您有一隻帶有滾動(dòng)輪的花哨的老鼠,您可以放鬆一下,那就去吧!很有趣!

這是一個(gè)顯示當(dāng)前迭代和進(jìn)度的演示:

滾動(dòng)折斷

我們?cè)谀茄e。但是,在使用這樣的功能時(shí),總會(huì)有“很高興的人”。讓我們從滾動(dòng)釦子開始。 GSAP使它變得容易,因?yàn)槲覀兛梢允褂胓sap.utils.snap而無需任何其他依賴。這樣可以處理捕捉到我們提供點(diǎn)的時(shí)間。我們聲明了0和1之間的步驟,並且在示例中有10個(gè)盒子。這意味著快照為0.1對(duì)我們有用。

 const snap = gsap.utils.snap(1 / boxes.length)

這返回了我們可以使用的函數(shù)來捕捉我們的位置值。

捲軸結(jié)束後,我們只想捕捉。為此,我們可以在Scrolltrigger上使用事件偵聽器。滾動(dòng)結(jié)束時(shí),我們將滾動(dòng)到某個(gè)位置。

 scrolltrigger.addeventlistener('scrollend',()=> {
  捲軸(scrub.vars.position)
}))

這是捲軸的:

 const scrollToposition = posity => {
  const snap_pos = snap(位置)
  const進(jìn)度=
    (snap_pos -loop_head.duration() *迭代) / loop_head.duration()
  const scroll = progressToscroll(progress)
  觸發(fā)器(滾動(dòng))
}

我們?cè)谶@裡做什麼?

  1. 計(jì)算時(shí)間點(diǎn)以下點(diǎn)
  2. 計(jì)算當(dāng)前進(jìn)度。假設(shè)loop_head.duration()為1,我們已捕獲到2.5。這使我們的進(jìn)度為0.5,導(dǎo)致迭代為2,其中2.5-1 * 2/1 ==== 0.5。我們計(jì)算進(jìn)度,以便始終在1到0之間。
  3. 計(jì)算滾動(dòng)目的地。這是我們的Scrolltrigger可以覆蓋的距離的一小部分。在我們的示例中,我們?cè)O(shè)定了2000年的距離,我們想要其中的一小部分。我們創(chuàng)建一個(gè)新的函數(shù)progressToscroll來計(jì)算它。
 const progressTosCroll = progress =>
  gsap.utils.clamp(1,trigger.end -1,gsap.utils.wrap(0,1,progress) * trigger.end)

此功能採用進(jìn)度值並將其映射到最大的滾動(dòng)距離。但是我們使用夾具來確保該值永遠(yuǎn)不會(huì)為0或2000。這很重要。我們正在維護(hù)對(duì)這些價(jià)值觀的捕捉,因?yàn)檫@將使我們陷入無限的循環(huán)。

那裡有一點(diǎn)要接。查看此演示,該演示顯示了每個(gè)快照上的更新值。

為什麼事情變得更加挑剔?擦洗持續(xù)時(shí)間和輕鬆已改變。較小的持續(xù)時(shí)間和強(qiáng)力輕鬆使我們的快照。

 const scrub = gsap.to(playhead,{
  位置:0,
  onupdate :()=> {
    loop_head.totaltime(position_wrap(playhead.position))
  },,
  暫停:是的,
  持續(xù)時(shí)間:0.25,
  輕鬆:'power3',
}))

但是,如果您玩了該演示,您會(huì)注意到存在問題。有時(shí),當(dāng)我們?cè)诳煺罩邪鼤r(shí),播放頭會(huì)跳動(dòng)。我們需要通過確保在捕捉時(shí)包裝來解決這個(gè)問題 - 但是,只有在必要時(shí)才。

 const scrollToposition = posity => {
  const snap_pos = snap(位置)
  const進(jìn)度=
    (snap_pos -loop_head.duration() *迭代) / loop_head.duration()
  const scroll = progressToscroll(progress)
  if(progress> = 1 ||進(jìn)度<p>現(xiàn)在,我們有無限滾動(dòng)的滾動(dòng)!</p><h3>接下來是什麼?</h3><p>我們已經(jīng)完成了實(shí)心無限滾動(dòng)器的基礎(chǔ)。我們可以利用它來添加內(nèi)容,例如控件或鍵盤功能。例如,這可能是一種連接“下一個(gè)”和“以前”按鈕和鍵盤控件的方法。我們要做的就是操縱時(shí)間,對(duì)嗎?</p><pre rel="JavaScript" data-line=""> const next =()=> scrollToposition(scrub.vars.position-(1 / boxes.length))
const prev =()=> scrollToposition(scrub.vars.position(1 / boxes.length))

//左右箭頭加A和D
document.addeventlistener('keydown',event => {
  if(event.keycode === 37 || event.keycode === 65)next()
  if(event.keycode === 39 || event.keycode === 68)prev()
}))

document.queryselector('。next')。 addeventListener('click'sext)
document.queryselector('。prev')。 addeventListener('click'prev)

那可以給我們這樣的東西。

我們可以利用我們的捲軸函數(shù)並根據(jù)需要顛簸價(jià)值。

就是這樣!

看到嗎? GSAP比元素更具動(dòng)畫作用!在這裡,我們彎腰並操縱時(shí)間來創(chuàng)建一個(gè)幾乎完美的無限滑塊。沒有重複的元素,沒有混亂和良好的靈活性。

讓我們回顧一下我們涵蓋的內(nèi)容:

  • 我們可以動(dòng)畫動(dòng)畫。 ?
  • 當(dāng)我們操縱時(shí)間時(shí),我們可以將時(shí)機(jī)作為定位工具。
  • 如何使用Scrolltrigger通過代理擦洗動(dòng)畫。
  • 如何使用GSAP的一些很棒的實(shí)用程序來處理我們的邏輯。

您現(xiàn)在可以操縱時(shí)間! ?

進(jìn)行“ meta” GSAP的概念開闢了各種可能性。你還能動(dòng)畫嗎?聲音的?影片?至於“封面流”演示,這是去的地方!

以上是進(jìn)行' meta gsap”:尋求'完美”無限滾動(dòng)的詳細(xì)內(nèi)容。更多資訊請(qǐng)關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本網(wǎng)站聲明
本文內(nèi)容由網(wǎng)友自願(yuàn)投稿,版權(quán)歸原作者所有。本站不承擔(dān)相應(yīng)的法律責(zé)任。如發(fā)現(xiàn)涉嫌抄襲或侵權(quán)的內(nèi)容,請(qǐng)聯(lián)絡(luò)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脫衣器

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)頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級(jí)程式碼編輯軟體(SublimeText3)

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

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

外部與內(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案例靈敏度:了解重要的 CSS案例靈敏度:了解重要的 Jun 20, 2025 am 12:09 AM

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

什麼是AutoPrefixer,它如何工作? 什麼是AutoPrefixer,它如何工作? Jul 02, 2025 am 01:15 AM

Autoprefixer是一個(gè)根據(jù)目標(biāo)瀏覽器範(fàn)圍自動(dòng)為CSS屬性添加廠商前綴的工具。 1.它解決了手動(dòng)維護(hù)前綴易出錯(cuò)的問題;2.通過PostCSS插件形式工作,解析CSS、分析需加前綴的屬性、依配置生成代碼;3.使用步驟包括安裝插件、設(shè)置browserslist、在構(gòu)建流程中啟用;4.注意事項(xiàng)有不手動(dòng)加前綴、保持配置更新、非所有屬性都加前綴、建議配合預(yù)處理器使用。

什麼是CSS計(jì)數(shù)器? 什麼是CSS計(jì)數(shù)器? Jun 19, 2025 am 12:34 AM

csscounterscanautomationallymentermentermentections和lists.1)usecounter-ensettoInitializize,反插入式發(fā)芽,andcounter()orcounters()

CSS:何時(shí)重要(何時(shí)不)? CSS:何時(shí)重要(何時(shí)不)? Jun 19, 2025 am 12:27 AM

在CSS中,選擇器和屬性名不區(qū)分大小寫,而值、命名顏色、URL和自定義屬性則區(qū)分大小寫。 1.選擇器和屬性名不區(qū)分大小寫,例如background-color和Background-Color相同。 2.值中的十六進(jìn)制顏色不區(qū)分大小寫,但命名顏色區(qū)分大小寫,如red有效而Red無效。 3.URL區(qū)分大小寫,可能導(dǎo)致文件加載問題。 4.自定義屬性(變量)區(qū)分大小寫,使用時(shí)需注意大小寫一致。

什麼是圓錐級(jí)函數(shù)? 什麼是圓錐級(jí)函數(shù)? Jul 01, 2025 am 01:16 AM

theconic-Gradient()functionIncsscreatesCircularGradientsThatRotateColorStopSaroundAcentralPoint.1.IsidealForPieCharts,ProgressIndicators,colordichers,colorwheels和decorativeBackgrounds.2.itworksbysbysbysbydefindefingincolordefingincolorstopsatspecificains off.

See all articles