tween.js怎么用

這篇文章將為大家詳細(xì)講解有關(guān)tween.js怎么用,小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。

創(chuàng)新互聯(lián)專注于企業(yè)營(yíng)銷型網(wǎng)站、網(wǎng)站重做改版、殷都網(wǎng)站定制設(shè)計(jì)、自適應(yīng)品牌網(wǎng)站建設(shè)、成都h5網(wǎng)站建設(shè)、商城系統(tǒng)網(wǎng)站開發(fā)、集團(tuán)公司官網(wǎng)建設(shè)、成都外貿(mào)網(wǎng)站建設(shè)、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁(yè)設(shè)計(jì)等建站業(yè)務(wù),價(jià)格優(yōu)惠性價(jià)比高,為殷都等各大城市提供網(wǎng)站開發(fā)制作服務(wù)。

補(bǔ)間(動(dòng)畫)是一個(gè)概念,允許你以平滑的方式更改對(duì)象的屬性。你只需告訴它哪些屬性要更改,當(dāng)補(bǔ)間結(jié)束運(yùn)行時(shí)它們應(yīng)該具有哪些最終值,以及這需要多長(zhǎng)時(shí)間,補(bǔ)間引擎將負(fù)責(zé)計(jì)算從起始點(diǎn)到結(jié)束點(diǎn)的值。

例如,position對(duì)象擁有x和y兩個(gè)坐標(biāo):

var position = { x: 100, y: 0 }

如果你想將x坐標(biāo)的值從100變成200,你應(yīng)該這么做:

// 首先為位置創(chuàng)建一個(gè)補(bǔ)間(tween)
var tween = new TWEEN.Tween(position);

// 然后告訴 tween 我們想要在1000毫秒內(nèi)以動(dòng)畫的形式移動(dòng) x 的位置
tween.to({ x: 200 }, 1000);

一般來(lái)說(shuō)這樣還不夠,tween 已經(jīng)被創(chuàng)建了,但是它還沒被激活(使用),你需要這樣啟動(dòng):

// 啟動(dòng)
tween.start();

最后,想要成功的完成這種效果,你需要在主函數(shù)中調(diào)用TWEEN.update,如下使用:

animate();

function animate() {
 requestAnimationFrame(animate);
 // [...]
 TWEEN.update();
 // [...]
}

這樣在更新每幀的時(shí)候都會(huì)運(yùn)行補(bǔ)間動(dòng)畫;經(jīng)過(guò) 1秒后 (1000 毫秒) position.x將會(huì)變成 200。

除非你在控制臺(tái)中打印出 x 的值,不然你看不到它的變化。你可能想要使用 onUpdate 回調(diào):

tween.onUpdate(function(object) {
 console.log(object.x);
});

tips:你可能在這里獲取不到 object.x ,具體的見我提的這個(gè) issue

這個(gè)函數(shù)將會(huì)在動(dòng)畫每次更新的時(shí)候被調(diào)用;這種情況發(fā)生的頻率取決于很多因素 - 例如,計(jì)算機(jī)或設(shè)備的速度有多快(以及如何繁忙)。

到目前為止,我們只使用補(bǔ)間動(dòng)畫向控制臺(tái)輸出值,但是您可以將它與 three.js 對(duì)象結(jié)合:

var tween = new TWEEN.Tween(cube.position)
 .to({ x: 100, y: 100, z: 100 }, 10000)
 .start();

animate();

function animate() {
 requestAnimationFrame(animate);
 TWEEN.update();
 threeRenderer.render(scene, camera);
}

在這種情況下,因?yàn)閠hree.js渲染器將在渲染之前查看對(duì)象的位置,所以不需要使用明確的onUpdate回調(diào)。

你可能也注意到了一些不同的地方:tween.js 可以鏈?zhǔn)秸{(diào)用! 每個(gè)tween函數(shù)都會(huì)返回tween實(shí)例,所以你可以重寫下面的代碼:

var tween = new TWEEN.Tween(position);
tween.to({ x: 200 }, 1000);
tween.start();

改成這樣:

var tween = new TWEEN.Tween(position)
 .to({ x: 200 }, 1000)
 .start();

在將會(huì)看到很多例子,所以熟悉它是很好的!比如04-simplest 這個(gè)例子。

tween.js的動(dòng)畫

Tween.js 不會(huì)自行運(yùn)行。你需要顯式的調(diào)用 update 方法來(lái)告訴它何時(shí)運(yùn)行。推薦的方法是在主動(dòng)畫循環(huán)中執(zhí)行這個(gè)操作。使用 requestAnimationFrame 調(diào)用此循環(huán)以獲得最佳的圖形性能。

比如之前這個(gè)例子:

animate();

function animate() {
 requestAnimationFrame(animate);
 // [...]
 TWEEN.update();
 // [...]
}

如果調(diào)用的時(shí)候不傳入?yún)?shù),update 將會(huì)判斷當(dāng)前時(shí)間點(diǎn)以確定自上次運(yùn)行以來(lái)已經(jīng)有多久。

當(dāng)然你也可以傳遞一個(gè)明確的時(shí)間參數(shù)給 update

TWEEN.update(100);

意思是"更新時(shí)間 = 100 毫秒"。你可以使用它來(lái)確保代碼中的所有時(shí)間相關(guān)函數(shù)都使用相同的時(shí)間值。例如,假設(shè)你有一個(gè)播放器,并希望同步運(yùn)行補(bǔ)間。 你的 animate 函數(shù)可能看起來(lái)像這樣:

var currentTime = player.currentTime;
TWEEN.update(currentTime);

我們使用明確的時(shí)間值進(jìn)行單元測(cè)試。你可以看下tests.js 這個(gè)例子,看看我們?nèi)绾斡貌煌闹嫡{(diào)用TWEEN.update() 來(lái)模擬時(shí)間傳遞。

控制一個(gè)補(bǔ)間

start 和 stop

到目前為止,我們已經(jīng)了解了Tween.start方法,但是還有更多的方法來(lái)控制單個(gè)補(bǔ)間。 也許最重要的一個(gè)是 star 對(duì)應(yīng)的方法:停止 。 如果你想取消一個(gè)補(bǔ)間,只要調(diào)用這個(gè)方法通過(guò)一個(gè)單獨(dú)的補(bǔ)間:

tween.stop();

停止一個(gè)從未開始或已經(jīng)停止的補(bǔ)間沒有任何效果。 沒有錯(cuò)誤被拋出。

start 方法接受一個(gè)參數(shù) time。如果你使用它,那么補(bǔ)間不會(huì)立即開始,直到特定時(shí)刻,否則會(huì)盡快啟動(dòng)(i.e 即在下次調(diào)用 TWEEN.update)。

update

補(bǔ)間也有一個(gè)更新的方法---這實(shí)際上是由 TWEEN.update 調(diào)用的。 你通常不需要直接調(diào)用它,除非你是個(gè) 瘋狂的hacker。

chain

當(dāng)你順序排列不同的補(bǔ)間時(shí),事情會(huì)變得有趣,例如在上一個(gè)補(bǔ)間結(jié)束的時(shí)候立即啟動(dòng)另外一個(gè)補(bǔ)間。我們稱這為鏈?zhǔn)窖a(bǔ)間,這使用 chain 方法去做。因此,為了使 tweenB 在 tewwnA 啟動(dòng):

tweenA.chain(tweenB);

或者,對(duì)于一個(gè)無(wú)限的鏈?zhǔn)剑O(shè)置tweenA一旦tweenB完成就開始:

tweenA.chain(tweenB);
tweenB.chain(tweenA);

關(guān)于無(wú)限的鏈?zhǔn)讲榭碒ello world 。

在其他情況下,您可能需要將多個(gè)補(bǔ)間鏈接到另一個(gè)補(bǔ)間,以使它們(鏈接的補(bǔ)間)同時(shí)開始動(dòng)畫:

tweenA.chain(tweenB,tweenC);

警告:調(diào)用 tweenA.chain(tweenB) 實(shí)際上修改了tweenA,所以tweenA總是在tweenA完成時(shí)啟動(dòng)。 chain 的返回值只是tweenA,不是一個(gè)新的tween。

repeat

如果你想讓一個(gè)補(bǔ)間永遠(yuǎn)重復(fù),你可以鏈接到自己,但更好的方法是使用 repeat 方法。 它接受一個(gè)參數(shù),描述第一個(gè)補(bǔ)間完成后需要多少次重復(fù)

tween.repeat(10); // 循環(huán)10次
tween.repeat(Infinity); // 無(wú)限循環(huán)

補(bǔ)間的總次數(shù)將是重復(fù)參數(shù)加上一個(gè)初始補(bǔ)間。查看 Repeat。

yoyo

這個(gè)功能只有在獨(dú)自使用 repeat 時(shí)才有效果。 活躍時(shí),補(bǔ)間的行為將像 yoyo 一樣,i.e 它會(huì)從起始值和結(jié)束值之間跳出,而不是從頭開始重復(fù)相同的順序。

delay

更復(fù)雜的安排可能需要在實(shí)際開始運(yùn)行之前延遲補(bǔ)間。 你可以使用 delay 方法來(lái)做到這一點(diǎn)

tween.delay(1000);
tween.start();

將在調(diào)用啟動(dòng)方法后的1秒鐘后開始執(zhí)行。

控制所有補(bǔ)間

在 TWEEN 全局對(duì)象中可以找到以下方法,除了 update 之外,通常不需要使用其中的大部分對(duì)象。

TWEEN.update(time)

我們已經(jīng)討論過(guò)這種方法。 它用于更新所有活動(dòng)的補(bǔ)間。

如果 time 不指定,它將使用當(dāng)前時(shí)間。

TWEEN.getAll and TWEEN.removeAll

用于獲取對(duì)活動(dòng) tweens 數(shù)組的引用,并分別僅從一個(gè)調(diào)用中將它們?nèi)繌臄?shù)組中刪除

TWEEN.add(tween) and TWEEN.remove(tween)

用于將補(bǔ)間添加到活動(dòng)補(bǔ)間的列表,或者分別從列表中刪除特定的補(bǔ)間。

這些方法通常只在內(nèi)部使用,但是如果您想要做一些有趣的事情,則會(huì)被暴露。

控制補(bǔ)間組

使用 TWEEN 單例來(lái)管理補(bǔ)間可能會(huì)導(dǎo)致包含許多組件的大型應(yīng)用程序出現(xiàn)問(wèn)題。 在這些情況下,您可能希望創(chuàng)建自己的更小的補(bǔ)間組。

示例:交叉組件沖突

如果使用 TWEEN 有多個(gè)組件,并且每個(gè)組件都想管理自己的一組補(bǔ)間,則可能發(fā)生沖突。 如果一個(gè)組件調(diào)用 TWEEN.update() 或 TWEEN.removeAll(),則其他組件的補(bǔ)間也將被更新或刪除。

創(chuàng)建你自己的補(bǔ)間組

為了解決這個(gè)問(wèn)題,每個(gè)組件都可以創(chuàng)建自己的 TWEEN.Group 實(shí)例(這是全局的 TWEEN 對(duì)象在內(nèi)部使用的)。 實(shí)例化新的補(bǔ)間時(shí),可以將這些組作為第二個(gè)可選參數(shù)傳入:

var groupA = new TWEEN.Group();
var groupB = new TWEEN.Group();

var tweenA = new TWEEN.Tween({ x: 1 }, groupA)
 .to({ x: 10 }, 100)
 .start();

var tweenB = new TWEEN.Tween({ x: 1 }, groupB)
 .to({ x: 10 }, 100)
 .start();

var tweenC = new TWEEN.Tween({ x: 1 })
 .to({ x: 10 }, 100)
 .start();

groupA.update(); // 只更新tweenA
groupB.update(); // 只更新tweenB
TWEEN.update(); // 只更新tweenC

groupA.removeAll(); // 只移除tweenA
groupB.removeAll(); // 只移除tweenB
TWEEN.removeAll(); // 只移除tweenC

通過(guò)這種方式,每個(gè)組件都可以處理創(chuàng)建,更新和銷毀自己的一組補(bǔ)間。

改變緩動(dòng)功能

Tween.js 將以線性方式執(zhí)行值之間的插值(即緩動(dòng)),所以變化將與流逝的時(shí)間成正比。 這是可以預(yù)見的,但在視覺上也是相當(dāng)無(wú)趣的。 不要擔(dān)心 - 使用緩動(dòng)方法可以輕松更改此行為。 例如:

tween.easing(TWEEN.Easing.Quadratic.In);

這將導(dǎo)致緩慢地開始向最終值變化,向中間加速,然后迅速達(dá)到其最終值,相反,TWEEN.Easing.Quadratic.Out 一開始會(huì)加速,但隨著值的接近最終放緩。

可用的緩動(dòng)函數(shù):TWEEN.Easing

tween.js提供了一些現(xiàn)有的緩動(dòng)功能。它們按照它們表示的方程式進(jìn)行分組:線性,二次,三次,四次,五次,正弦,指數(shù),圓形,彈性,背部和彈跳,然后是緩動(dòng)型:In,Out和InOut。

除非您已經(jīng)熟悉這些概念,否則這些名稱可能不會(huì)對(duì)您說(shuō)什么,所以您可能需要查看 Graphs 示例,該示例將一個(gè)頁(yè)面中的所有曲線進(jìn)行圖形化,以便比較它們?nèi)绾慰创黄场?/p>

這些功能是從 Robert Penner 慷慨地提供幾年前作為自由軟件提供的原始方程派生而來(lái)的,但是已經(jīng)被優(yōu)化以便與JavaScript很好地發(fā)揮作用。

使用自定義緩動(dòng)功能

您不僅可以使用任何現(xiàn)有的功能,還可以提供您自己的功能,只要遵循一些約定即可:

它必須接受一個(gè)參數(shù):

k: 緩動(dòng)過(guò)程,或我們的補(bǔ)間所處的時(shí)間有多長(zhǎng)。允許的值在[0,1]的范圍內(nèi)。

它必須根據(jù)輸入?yún)?shù)返回一個(gè)值。

不管要修改多少個(gè)屬性,easing函數(shù)在每次更新時(shí)只調(diào)用一次。 然后將結(jié)果與初始值以及這個(gè)值和最終值之間的差值(delta)一起使用,就像這個(gè)偽代碼一樣:

easedElapsed = easing(k);
for each property:
 newPropertyValue = initialPropertyValue + propertyDelta * easedElapsed;

對(duì)于更注重性能表現(xiàn)的人來(lái)說(shuō):只有在補(bǔ)間上調(diào)用 start() 時(shí)才會(huì)計(jì)算增量值。

因此,讓我們假設(shè)您想使用一個(gè)緩解值的自定義緩動(dòng)函數(shù),但是將 Math.floor 應(yīng)用于輸出,所以只返回整數(shù)部分,從而產(chǎn)生一種梯級(jí)輸出:

function tenStepEasing(k) {
 return Math.floor(k * 10) / 10;
}

你可以通過(guò)簡(jiǎn)單地調(diào)用它的緩動(dòng)方法來(lái)使用它,就像我們之前看到的那樣:

tween.easing(tenStepEasing);

查看 graphs for custom easing functions 示例,以查看這個(gè)動(dòng)作(還有一些用于生成步進(jìn)函數(shù)的元編程)。

回調(diào)函數(shù)

另一個(gè)強(qiáng)大的特性是能夠在每個(gè)補(bǔ)間的生命周期的特定時(shí)間運(yùn)行自己的功能。 當(dāng)更改屬性不夠時(shí),通常需要這樣做。

例如,假設(shè)你正在試圖給一些不能直接訪問(wèn)屬性的對(duì)象設(shè)置動(dòng)畫,但是需要你調(diào)用setter。 您可以使用 update 回調(diào)來(lái)讀取新的更新值,然后手動(dòng)調(diào)用setters。 所有的回調(diào)函數(shù)都將補(bǔ)間對(duì)象作為唯一的參數(shù)。

var trickyObjTween = new TWEEN.Tween({
 propertyA: trickyObj.getPropertyA(),
 propertyB: trickyObj.getPropertyB()
})
 .to({ propertyA: 100, propertyB: 200 })
 .onUpdate(function(object) {
 object.setA( object.propertyA );
 object.setB( object.propertyB );
 });

或者想象一下,當(dāng)一個(gè)補(bǔ)間開始時(shí),你想播放聲音。你可以使用 start 回調(diào):

var tween = new TWEEN.Tween(obj)
 .to({ x: 100 })
 .onStart(function() {
 sound.play();
 });

每個(gè)回調(diào)的范圍是補(bǔ)間對(duì)象--在這種情況下,是 obj。

onStart

在補(bǔ)間開始之前執(zhí)行--i.e. 在計(jì)算之前。每個(gè)補(bǔ)間只能執(zhí)行一次,i.e. 當(dāng)通過(guò) repeat() 重復(fù)補(bǔ)間時(shí),它將不會(huì)運(yùn)行。

同步到其他事件或觸發(fā)您要在補(bǔ)間啟動(dòng)時(shí)發(fā)生的操作是非常好的。

補(bǔ)間對(duì)象作為第一個(gè)參數(shù)傳入。

onStop

當(dāng)通過(guò) stop() 顯式停止補(bǔ)間時(shí)執(zhí)行,但在正常完成時(shí)并且在停止任何可能的鏈補(bǔ)間之前執(zhí)行補(bǔ)間。

補(bǔ)間對(duì)象作為第一個(gè)參數(shù)傳入。

onUpdate

每次補(bǔ)間更新時(shí)執(zhí)行,實(shí)際更新后的值。

補(bǔ)間對(duì)象作為第一個(gè)參數(shù)傳入。

onComplete

當(dāng)補(bǔ)間正常完成(即不停止)時(shí)執(zhí)行。

補(bǔ)間對(duì)象作為第一個(gè)參數(shù)傳入。

高級(jí)補(bǔ)間

相對(duì)值

使用 to 方法時(shí),也可以使用相對(duì)值。 當(dāng)tween啟動(dòng)時(shí),Tween.js將讀取當(dāng)前屬性值并應(yīng)用相對(duì)值來(lái)找出新的最終值。

但是你需要使用引號(hào),否則這些值將被視為絕對(duì)的。 我們來(lái)看一個(gè)例子:

// This will make the `x` property be 100, always
var absoluteTween = new TWEEN.Tween(absoluteObj).to({ x: 100 });

// Suppose absoluteObj.x is 0 now
absoluteTween.start(); // Makes x go to 100

// Suppose absoluteObj.x is -100 now
absoluteTween.start(); // Makes x go to 100

// In contrast...

// This will make the `x` property be 100 units more,
// relative to the actual value when it starts
var relativeTween = new TWEEN.Tween(relativeObj).to({ x: "+100" });

// Suppose relativeObj.x is 0 now
relativeTween.start(); // Makes x go to 0 +100 = 100

// Suppose relativeObj.x is -100 now
relativeTween.start(); // Makes x go to -100 +100 = 0

查看09_relative_values 示例。

補(bǔ)間值的數(shù)組

除了補(bǔ)間為絕對(duì)值或相對(duì)值之外,還可以讓Tween.js跨一系列值更改屬性。 要做到這一點(diǎn),你只需要指定一個(gè)數(shù)組的值,而不是一個(gè)屬性的單個(gè)值。 例如:

var tween = new TWEEN.Tween(relativeObj).to({ x: [0, -100, 100] });

將使 x 從初始值變?yōu)?,-100和100。

這些值的計(jì)算方法如下:

  1. 首先,補(bǔ)間進(jìn)度如常計(jì)算

  2. 進(jìn)度(從0到1)用作插值函數(shù)的輸入

  3. 基于進(jìn)度和值的數(shù)組,生成內(nèi)插值

例如,當(dāng)補(bǔ)間剛剛啟動(dòng)(進(jìn)度為0)時(shí),插值函數(shù)將返回?cái)?shù)組中的第一個(gè)值。 當(dāng)補(bǔ)間到一半時(shí),插值函數(shù)將返回一個(gè)大約在數(shù)組中間的值,當(dāng)補(bǔ)間結(jié)束時(shí),插值函數(shù)將返回最后一個(gè)值。

您可以使用插值方法更改插值函數(shù)。 例如:

tween.interpolation( TWEEN.Interpolation.Bezier );

以下值可用:

  1. TWEEN.Interpolation.Linear

  2. TWEEN.Interpolation.Bezier

  3. TWEEN.Interpolation.CatmullRom

默認(rèn)是 Linear。

請(qǐng)注意,插值函數(shù)對(duì)于與同一補(bǔ)間中的數(shù)組進(jìn)行補(bǔ)間的所有屬性是全局的。
您不能使用數(shù)組和線性函數(shù)進(jìn)行屬性A的更改,也不能使用相同的補(bǔ)間進(jìn)行數(shù)組B的屬性B和Bezier函數(shù)的更改; 您應(yīng)該使用運(yùn)行在同一對(duì)象上的兩個(gè)補(bǔ)間對(duì)象,但修改不同的屬性并使用不同的插值函數(shù)。

查看 06_array_interpolation 示例。

獲得最佳性能

雖然Tween.js試圖自己執(zhí)行,但是沒有什么能夠阻止你以一種反作用的方式使用它。 這里有一些方法可以避免在使用Tween.js時(shí)(或者在網(wǎng)頁(yè)中進(jìn)行動(dòng)畫制作時(shí))減慢項(xiàng)目速度。

使用高性能的CSS

當(dāng)您嘗試在頁(yè)面中設(shè)置元素的位置時(shí),最簡(jiǎn)單的解決方案是為 top 和 left 屬性設(shè)置動(dòng)畫,如下所示:

var element = document.getElementById('myElement');
var tween = new TWEEN.Tween({ top: 0, left: 0 })
 .to({ top: 100, left: 100 }, 1000)
 .onUpdate(function(object) {
 element.style.top = object.top + 'px';
 element.style.left = object.left + 'px';
 });

但這實(shí)際上是效率低下的,因?yàn)楦淖冞@些屬性會(huì)迫使瀏覽器在每次更新時(shí)重新計(jì)算布局,這是非常昂貴的操作。 相反的,您應(yīng)該使用 transform,這不會(huì)使布局無(wú)效,并且在可能的情況下也將被硬件加速,比如:

var element = document.getElementById('myElement');
var tween = new TWEEN.Tween({ top: 0, left: 0 })
 .to({ top: 100, left: 100 }, 1000)
 .onUpdate(function(object) {
 element.style.transform = 'translate(' + object.left + 'px, ' + object.top + 'px);';
 });

如果你想了解更多關(guān)于這個(gè),看看這篇文章。

但是,如果您的動(dòng)畫需求非常簡(jiǎn)單,那么在適用的情況下使用CSS動(dòng)畫或轉(zhuǎn)換可能會(huì)更好,以便瀏覽器盡可能優(yōu)化。
當(dāng)您的動(dòng)畫需要涉及復(fù)雜的布局時(shí),Tween.js是非常有用的,也就是說(shuō),您需要將多個(gè)補(bǔ)間同步到一起,在完成一些動(dòng)作之后,循環(huán)多次等等。

對(duì)垃圾收集器(別名GC)

如果你使用onUpdate回調(diào)函數(shù),你需要非常小心的使用它。 因?yàn)檫@個(gè)函數(shù)每秒鐘會(huì)被調(diào)用很多次,所以如果每次更新都要花費(fèi)很多的代價(jià),那么你可能會(huì)阻塞主線程并導(dǎo)致可怕的結(jié)果,或者如果你的操作涉及到內(nèi)存分配的話, 垃圾收集器運(yùn)行太頻繁,也導(dǎo)致結(jié)果。 所以只是不要做些事情中的其中一個(gè)。 保持你的onUpdate回調(diào)非常輕量級(jí),并確保在開發(fā)時(shí)也使用內(nèi)存分析器。

瘋狂的補(bǔ)間

這是你可能不經(jīng)常使用的東西,但是你可以在Tween.js之外使用補(bǔ)間公式。 畢竟,它們只是功能。 所以你可以使用它們來(lái)計(jì)算平滑曲線作為輸入數(shù)據(jù)。

例如,他們用于在 這個(gè)實(shí)驗(yàn) 中生成音頻數(shù)據(jù)。

關(guān)于“tween.js怎么用”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺得文章不錯(cuò),請(qǐng)把它分享出去讓更多的人看到。

本文標(biāo)題:tween.js怎么用
網(wǎng)站地址:http://muchs.cn/article48/ighgep.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站營(yíng)銷、定制開發(fā)搜索引擎優(yōu)化、響應(yīng)式網(wǎng)站、手機(jī)網(wǎng)站建設(shè)、網(wǎng)站策劃

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

手機(jī)網(wǎng)站建設(shè)