canvas:绘制简单春联demo

HTML

页面上显示上联和下联输入框,绘制按钮和生成图片按钮

 <div class="container">
    <div class="container_up">
      <div class="container_up_label">上联</div>
      <div class="container_up_value"><input type="text" class="container_up_value_input"></div>
    </div>
    <div class="container_down">
       <div class="container_down_label">下联</div>
       <div class="container_down_value"><input type="text" class="container_down_value_input"></div>
    </div>
    <div class="container_controls">
        <button class="container_controls_btn">生成春联</button>
        <button class="container_controls_btn">导出为图片</button>
        <!-- <a class="container_controls_download" href="">点击下载图片</a> -->
    </div>
  </div>
  <div class="container">
    <canvas class="container_up_canvas" width="500" height="100" id="upCan"></canvas>
    <canvas class="container_down_canvas" width="500" height="100" id="downCan"></canvas>
  </div>

CSS

对页面上的元素进行布局设置样式

.container {
  width: 500px;
  height: 200px;
  margin: 0 auto;
}

.container_down,
.container_up {
  width: 100%;
  height: 50px;
  margin: 10px 0;
  display: flex;
  align-items: center;
}

.container_down_label,
.container_up_label {
  margin-right: 20px;
  width: 50px;
  height: 100%;
}

.container_down_value,
.container_up_value {
  flex: 1;
  height: 100%;
}

.container_controls {
  width: 100%;
  height: auto;
  display: flex;
  align-items: center;
  justify-content: space-around;
  margin-top: 20px;
}

.container_controls_btn {
  width: 100px;
  height: 50px;
  display: block;
  border: none;
  outline: none;
  margin: auto;
}

.container_controls_download {
  width: 100px;
  height: 50px;
  color: inherit;
  text-decoration: none;
}

.container_down_value_input,
.container_up_value_input {
  height: 100%;
  border: 1px solid #ebebeb;
  outline: none;
  width: 100%;
}

.container_down_canvas,
.container_up_canvas {
  margin: 0 auto;
  border: 1px solid #ebebeb;
  background-color: #ff0000;
}

JS

let upInput = document.getElementsByClassName('container_up_value_input')[0],
  downInput = document.getElementsByClassName('container_down_value_input')[0],
  upCtx = document.getElementById('upCan').getContext('2d'),
  downCtx = document.getElementById('downCan').getContext('2d'),
  btn = document.getElementsByClassName('container_controls_btn')[0],
  toImgBtn = document.getElementsByClassName('container_controls_btn')[1],
  downLoad = document.getElementsByClassName('container_controls_download')[0],
  controls = document.getElementsByClassName('container_controls')[0];

// 获取用户输入的文字
upInput.addEventListener('input', function (e) {
  localStorage.setItem('upText', e.target.value);
});
downInput.addEventListener('input', function (e) {
  localStorage.setItem('downText', e.target.value);
});
// 绘制图片操作
btn.addEventListener('click', function () {
  let upText = localStorage.getItem('upText');
  let downText = localStorage.getItem('downText');
  console.log(upText, downText)
  drawBg(upCtx);
  drawText(upCtx, upText);
  drawBg(downCtx);
  drawText(downCtx, downText);
});

// 执行生成图片操作
toImgBtn.addEventListener('click', function () {
  upCtx.canvas.toBlob(blob => {
    downLoadImg(window.URL.createObjectURL(blob), '点击下载上联');
  });
  downCtx.canvas.toBlob(blob => {
    downLoadImg(window.URL.createObjectURL(blob), '点击下载下联');
  });
});

/**
 * 绘制春联文字
 * @param {object} ctx CanvasContextObject
 * @param {string} text 春联的文字
 * @returns 
 */
function drawText(ctx, text) {
  if (!text.length) return;
  ctx.fillStyle = 'rgb(255,215,100)';
  ctx.font = "50px 楷体";
  ctx.textBaseline = 'middle';
  ctx.textAlign = 'start';
  let textLeft = 20;
  let textTop = ctx.canvas.height / 2;
  for (let i = 0, len = text.length; i < len; i++) {
    if (textLeft >= ctx.canvas.width) {
      ctx.canvas.width = text.length * 70 + 20;
    }
    ctx.fillText(text[i], textLeft, textTop);
    textLeft += 70;
  }
}
/**
 * 绘制背景
 * @param {object} ctx CanvasContextObject
 */
function drawBg(ctx) {
  ctx.save();
  ctx.fillStyle = '#ff0000';
  ctx.rect(0, 0, ctx.canvas.width, ctx.canvas.height);
  ctx.fill();
  ctx.restore();
}

/**
 * @function 生成下载图片链接
 * @param {string} url 图片链接地址
 * @param {string} text a标签的显示内容
 */
function downLoadImg(url, text) {
  console.log(url)
  let a = document.createElement('a');
  a.href = url;
  a.className = 'container_controls_download';
  a.innerHTML = text;
  a.target = '_blank';
  a.click();
}

效果

效果图

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

前端御书房

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值