Fabric.js介紹 第八部分

新的clipPath屬性

在2.4.0中,我們?yōu)樗袑ο笠肓薱lipPath屬性捆交。 ClipPath將替換clipTo: funcion() {}茧妒,試圖獲得相同的靈活性但更好的兼容性姿骏。

如何使用

創(chuàng)建自己的clipPath作為普通的Fabric對象身笤,并將其指定給要剪輯的對象的clipPath屬性豹悬。
根據(jù)SVG規(guī)范中的定義,clipPath沒有描邊液荸,而是充滿黑色瞻佛,與黑色像素重疊的對象的像素將是可見的,而與黑色像素重疊的對象的像素將是可見的娇钱。
讓我們從一些基本的例子開始伤柄,讓我們看看它是什么樣的。
在第一個示例中文搂,一個紅色的rectable被一個圓圈夾住适刀,只有圓圈內(nèi)的部分是可見的。雖然不是很有用煤蹭,但是基本的功能是這樣的笔喉。
請注意:clipPath位于從物體中心開始的位置,物體的originX和originY不起任何作用硝皂,而clipPath的originX和originY則起作用常挚,定位邏輯與fabric.Group相同。

查看demo

(function() {
  var canvas = new fabric.Canvas('ex1');
  var clipPath = new fabric.Circle({
    radius: 40,
    top: -40,
    left: -40
  });
  var rect = new fabric.Rect({
    width: 200,
    height: 100,
    fill: 'red'
  });
  rect.clipPath = clipPath;
  canvas.add(rect);
})()

我們可以剪下一個組合:
查看demo

(function() {
  var canvas = new fabric.Canvas('ex2');
  var clipPath = new fabric.Circle({
    radius: 100,
    top: -100,
    left: -100
  });
  var group = new fabric.Group([
    new fabric.Rect({ width: 100, height: 100, fill: 'red' }),
    new fabric.Rect({ width: 100, height: 100, fill: 'yellow', left: 100 }),
    new fabric.Rect({ width: 100, height: 100, fill: 'blue', top: 100 }),
    new fabric.Rect({ width: 100, height: 100, fill: 'green', left: 100, top: 100 })
  ]);
  group.clipPath = clipPath;
  canvas.add(group);
})()

或者我們可以用組合來剪輯吧彪。在組合的情況下待侵,記住組合中的每個對象在邏輯上都是,沒有非零偶數(shù)的剪裁規(guī)則:

查看demo

(function() {
  var canvas = new fabric.Canvas('ex3');
  var clipPath = new fabric.Group([
    new fabric.Circle({ radius: 70, top: -70, left: -70 }),
    new fabric.Circle({ radius: 40, left: -95, top: -95 }),
    new fabric.Circle({ radius: 40, left: 15, top: 15 }),
  ], { left: -95, top: -95 });
  var group = new fabric.Group([
    new fabric.Rect({ width: 100, height: 100, fill: 'red' }),
    new fabric.Rect({ width: 100, height: 100, fill: 'yellow', left: 100 }),
    new fabric.Rect({ width: 100, height: 100, fill: 'blue', top: 100 }),
    new fabric.Rect({ width: 100, height: 100, fill: 'green', left: 100, top: 100 })
  ]);
  group.clipPath = clipPath;
  canvas.add(group);
})()

更多高級用法

嵌套clipPaths

clipTo的一個問題和canvas.clip()的用法是你不能有多個clipPath姨裸。
通過這種實現(xiàn)秧倾,clippaths可以有自己的clippaths。雖然手動編程不太直觀傀缩,但它允許將clipPaths交叉到一起那先。

查看demo

(function() {
  var canvas = new fabric.Canvas('ex4');
  var clipPath = new fabric.Circle({ radius: 70, top: -50, left: -50 });
  var innerClipPath = new fabric.Circle({ radius: 70, top: -90, left: -90 });
  clipPath.clipPath = innerClipPath;
  var group = new fabric.Group([
    new fabric.Rect({ width: 100, height: 100, fill: 'red' }),
    new fabric.Rect({ width: 100, height: 100, fill: 'yellow', left: 100 }),
    new fabric.Rect({ width: 100, height: 100, fill: 'blue', top: 100 }),
    new fabric.Rect({ width: 100, height: 100, fill: 'green', left: 100, top: 100 })
  ]);
  group.clipPath = clipPath;
  canvas.add(group);
})()

組合內(nèi)對象中的ClipPath應與組本身的clipPath隔離:

查看demo

(function() {
  var canvas = new fabric.Canvas('ex5');
  var clipPath = new fabric.Circle({ radius: 100, top: -100, left: -100 });
  var small = new fabric.Circle({ radius: 50, top: -50, left: -50 });
  var group = new fabric.Group([
    new fabric.Rect({ width: 100, height: 100, fill: 'red', clipPath: small }),
    new fabric.Rect({ width: 100, height: 100, fill: 'yellow', left: 100 }),
    new fabric.Rect({ width: 100, height: 100, fill: 'blue', top: 100 }),
    new fabric.Rect({ width: 100, height: 100, fill: 'green', left: 100, top: 100 })
  ]);
  group.clipPath = clipPath;
  canvas.add(group);
})()

文字剪裁

用文本進行剪裁也是不可能的,開發(fā)人員通常不得不依靠模式來實現(xiàn)這一點:

查看demo

(function() {
  var canvas = new fabric.Canvas('ex6');
  var clipPath = new fabric.Text(
    'Hi I\'m the \nnew ClipPath!\nI hope we\'ll\nbe friends',
    { top: -100, left: -100 });
  var group = new fabric.Group([
    new fabric.Rect({ width: 100, height: 100, fill: 'red' }),
    new fabric.Rect({ width: 100, height: 100, fill: 'yellow', left: 100 }),
    new fabric.Rect({ width: 100, height: 100, fill: 'blue', top: 100 }),
    new fabric.Rect({ width: 100, height: 100, fill: 'green', left: 100, top: 100 })
  ]);
  group.clipPath = clipPath;
  canvas.add(group);
})()

剪裁canvas

我們可以對靜態(tài)畫布應用clipPath赡艰,就像對對象一樣售淡。在這種情況下,clipPath受到縮放和平移的影響慷垮,與物體相反揖闸。clipPath被放置在左上角。

查看demo

(function() {
  var canvas = new fabric.Canvas('ex7');
  var clipPath = new fabric.Circle({ radius: 100, top: 0, left: 50 });
  var group = new fabric.Group([
    new fabric.Rect({ width: 100, height: 100, fill: 'red' }),
    new fabric.Rect({ width: 100, height: 100, fill: 'yellow', left: 100 }),
    new fabric.Rect({ width: 100, height: 100, fill: 'blue', top: 100 }),
    new fabric.Rect({ width: 100, height: 100, fill: 'green', left: 100, top: 100 })
  ]);
  canvas.clipPath = clipPath;
  canvas.add(group);
})()

作為舊的clipTo函數(shù)料身,clipPath也是剪切控件汤纸,除非你使用canvas.controlsAboveOverlay設(shè)置為true

查看demo

(function() {
  var canvas = new fabric.Canvas('ex8');
  canvas.controlsAboveOverlay = true;
  var clipPath = new fabric.Circle({ radius: 100, top: 0, left: 50 });
  var group = new fabric.Group([
    new fabric.Rect({ width: 100, height: 100, fill: 'red' }),
    new fabric.Rect({ width: 100, height: 100, fill: 'yellow', left: 100 }),
    new fabric.Rect({ width: 100, height: 100, fill: 'blue', top: 100 }),
    new fabric.Rect({ width: 100, height: 100, fill: 'green', left: 100, top: 100 })
  ]);
  canvas.clipPath = clipPath;
  canvas.add(group);
})()

動畫clipPaths

剪貼簿可以像任何其他物體一樣進行動畫。Canvas clipPath動畫非常有效芹血,當動畫對象的動畫時贮泞,每次都會使對象緩存失效楞慈。

查看demo

(function() {
  var canvas = new fabric.Canvas('ex9');
  canvas.controlsAboveOverlay = true;
  var clipPath = new fabric.Rect({ width: 100, height: 100, top: 0, left: 0 });
  function animateLeft() {
    clipPath.animate({
      left: 200,
    }, {
      duration: 900,
      onChange: canvas.requestRenderAll.bind(canvas),
      onComplete: animateRight,
    });
  }
  function animateRight() {
    clipPath.animate({
      left: 0,
    }, {
      duration: 1200,
      onChange: canvas.requestRenderAll.bind(canvas),
      onComplete: animateLeft,
    });
  }
  function animateDown() {
    clipPath.animate({
      top: 100,
    }, {
      duration: 500,
      onChange: canvas.requestRenderAll.bind(canvas),
      onComplete: animateUp,
    });
  }
  function animateUp() {
    clipPath.animate({
      top: 0,
    }, {
      duration: 400,
      onChange: canvas.requestRenderAll.bind(canvas),
      onComplete: animateDown,
    });
  }
  var group = new fabric.Group([
    new fabric.Rect({ width: 100, height: 100, fill: 'red' }),
    new fabric.Rect({ width: 100, height: 100, fill: 'yellow', left: 100 }),
    new fabric.Rect({ width: 100, height: 100, fill: 'blue', top: 100 }),
    new fabric.Rect({ width: 100, height: 100, fill: 'green', left: 100, top: 100 })
  ], {
    scaleX: 1.5
  });
  animateLeft();
  animateDown();
  canvas.clipPath = clipPath;
  canvas.add(group);
})()
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市啃擦,隨后出現(xiàn)的幾起案子囊蓝,更是在濱河造成了極大的恐慌,老刑警劉巖令蛉,帶你破解...
    沈念sama閱讀 219,490評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件聚霜,死亡現(xiàn)場離奇詭異,居然都是意外死亡言询,警方通過查閱死者的電腦和手機俯萎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來运杭,“玉大人夫啊,你說我怎么就攤上這事×俱荆” “怎么了撇眯?”我有些...
    開封第一講書人閱讀 165,830評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長虱咧。 經(jīng)常有香客問我熊榛,道長,這世上最難降的妖魔是什么腕巡? 我笑而不...
    開封第一講書人閱讀 58,957評論 1 295
  • 正文 為了忘掉前任玄坦,我火速辦了婚禮,結(jié)果婚禮上绘沉,老公的妹妹穿的比我還像新娘煎楣。我一直安慰自己,他們只是感情好车伞,可當我...
    茶點故事閱讀 67,974評論 6 393
  • 文/花漫 我一把揭開白布择懂。 她就那樣靜靜地躺著,像睡著了一般另玖。 火紅的嫁衣襯著肌膚如雪困曙。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,754評論 1 307
  • 那天谦去,我揣著相機與錄音慷丽,去河邊找鬼。 笑死鳄哭,一個胖子當著我的面吹牛盈魁,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播窃诉,決...
    沈念sama閱讀 40,464評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼杨耙,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了飘痛?” 一聲冷哼從身側(cè)響起珊膜,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎宣脉,沒想到半個月后车柠,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,847評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡塑猖,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,995評論 3 338
  • 正文 我和宋清朗相戀三年竹祷,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片羊苟。...
    茶點故事閱讀 40,137評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡塑陵,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蜡励,到底是詐尸還是另有隱情令花,我是刑警寧澤,帶...
    沈念sama閱讀 35,819評論 5 346
  • 正文 年R本政府宣布凉倚,位于F島的核電站兼都,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏稽寒。R本人自食惡果不足惜扮碧,卻給世界環(huán)境...
    茶點故事閱讀 41,482評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望杏糙。 院中可真熱鬧慎王,春花似錦、人聲如沸搔啊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽负芋。三九已至漫蛔,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間旧蛾,已是汗流浹背莽龟。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留锨天,地道東北人毯盈。 一個月前我還...
    沈念sama閱讀 48,409評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像病袄,于是被迫代替她去往敵國和親搂赋。 傳聞我的和親對象是個殘疾皇子赘阀,可洞房花燭夜當晚...
    茶點故事閱讀 45,086評論 2 355