歡迎加入QQ討論群258996829
麥子學(xué)院 頭像
蘋果6袋
6
麥子學(xué)院

html2canvas 學(xué)習(xí)之dashed虛線邊框?qū)崿F(xiàn)方法詳解

發(fā)布時(shí)間:2018-04-21 22:13  回復(fù):0  查看:2876   最后回復(fù):2018-04-21 22:13  
本文和大家分享的主要是前端中html2canvas相關(guān)內(nèi)容,希望通過本文的分享對大家 學(xué)習(xí)web前端 有所幫助。
  html2canvas是一個(gè)將html元素生成canvas的庫,繪制的canvas大部分樣式和CSS一致。比如截止1.0.0-alpha.12,虛線邊框依然繪制為實(shí)線,border-collapse依然有問題。
  這里根據(jù)github issues里的一個(gè)思路,模擬實(shí)現(xiàn)了dashed邊框效果。
  適用情況:單獨(dú)邊框較多,即不是完整邊框,同時(shí)不考慮border-radius
  1、首先,在html2canvas繪制前,找出需要繪制canvas的元素中的所有虛線邊框的 方向和位置
  findDashedBorders = (page) => {
  const tds = page.querySelectorAll("td");
  const borders = [];
  tds.forEach(td => {
  const computedStyle = window.getComputedStyle(td);
  const borderStyle = computedStyle.borderStyle ? computedStyle.borderStyle.split(' ') : [];
  const dashedIndex = findAll(borderStyle, 'dashed');
  if (dashedIndex.length) {
  const rect = td.getBoundingClientRect();
  dashedIndex.map(index => {
  const border = {
  rect,
  border: dashedBorder[index]
  }
  borders.push(border);
  td.style[`border${dashedBorder[index]}Color`] = 'transparent';
  });
  }
  });
  return borders;
  }
  page是需要繪制canvas的元素,我這里有dashed邊框的都是td元素,所以查找所有td元素,使用getComputedStyle()方法查找它的borderStyle,如果它有dashed邊框,那么這個(gè)屬性的值的形式為"dashed dashed none none",所以根據(jù)findAll()這個(gè)自定義方法找到所有的dashed的方向(比如"dashed dashed none none"將返回[0, 1]),其中dashedBorder數(shù)組如下:
  const dashedBorder = ["Top", "Right", "Bottom", "Left"];
  找到方位后同時(shí)獲取它的位置,將方向和位置信息存入borders數(shù)組,同時(shí)將這條邊框設(shè)為透明,使html2canvas不繪制這條框,我們之后會(huì)單獨(dú)處理。 (注意:這個(gè)頁面的虛線邊框都會(huì)透明掉,這里并沒有考慮繪制完成后將透明邊框變回原來的顏色)
  2、使用html2canvas得到繪制后的canvas
  pages.forEach((page, idx) => {
  const borders = this.findDashedBorders(page);
  const parentRect = page.getBoundingClientRect();
  html2canvas(page, {scale: 2, logging: false, useCORS: true}).then((canvas) => {
  this.drawDashedBorder(canvas, borders, parentRect);
  ......
  })
  })
  pages是需要繪制canvas的所有元素,我們在獲取每個(gè)page的虛線邊框時(shí),同時(shí)獲取這個(gè)page的位置,以便我們繪制dashed邊框時(shí)得到邊框相對于這個(gè)頁面的位置。待html2canvas繪制canvas后,我們通過drawDashedBorder()方法進(jìn)一步繪制出dashed邊框,下面實(shí)現(xiàn)這個(gè)方法。
  3、drawDashedBorder()在得到canvas后進(jìn)一步繪制虛線。
  drawDashedBorder = (canvas, borders, parentRect) => {
  var ctx = canvas.getContext("2d");
  ctx.setLineDash([6, 3]);
  ctx.strokeStyle = '#3089c7';
  ctx.lineWidth = 1;
  ctx.globalAlpha = 1;
  borders.forEach(border => {
  var left = (border.rect.left + 0.5 - parentRect.left)*2;
  var right = (border.rect.right - 0.5 - parentRect.left)*2;
  var top = (border.rect.top + 0.5 - parentRect.top)*2;
  var bottom = (border.rect.bottom - 0.5 - parentRect.top)*2;
  switch (border.border) {
  case 'Top':
  ctx.beginPath();
  ctx.moveTo(left, top);
  ctx.lineTo(right, top);
  ctx.stroke();
  break;
  case 'Right':
  ctx.beginPath();
  ctx.moveTo(right, top);
  ctx.lineTo(right, bottom);
  ctx.stroke();
  break;
  case 'Bottom':
  ctx.beginPath();
  ctx.moveTo(left, bottom);
  ctx.lineTo(right, bottom);
  ctx.stroke();
  break;
  case 'Left':
  ctx.beginPath();
  ctx.moveTo(left, top);
  ctx.lineTo(left, bottom);
  ctx.stroke();
  break;
  default:
  break;
  }
  })
  }
  意思就是根據(jù)borders里dashed邊框的方向和位置信息,在canvas里獲取2d上下文后使用setLineDash方法把虛線繪制出來。位置都*2是因?yàn)槲覀冎癱anvas使用了2倍大小。
  4、這個(gè)方法目前只在chrome測試可用,firefox無效,因?yàn)閒irefox下getComputedStyle返回的信息和chrome不同。


來源:網(wǎng)絡(luò)
您還未登錄,請先登錄

熱門帖子

最新帖子

?