一、引言

在学习Canvas绘图技术时,做的是随机验证码的例子,在学习SVG绘图技术时,同样也有一个随机绘制的例子——动态随机绘制圆形。这个练习,即综合了多种SVG技术的知识点,又很具有艺术感,随机生成的任意一张图片都具有艺术之美。

二、要求

在SVG画布上随机的绘制30个实心圆形,大小随机、位置随机、填充颜色随机、透明度随机;点击某个圆形后,它慢慢变大/淡,直至从DOM树上删除。

三、实现

<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title></title>
<style>
body{
text-align: center;
}
svg{
background:#ddd;
}
</style>
</head>
<body>
<h1>动态随机绘制SVG圆形</h1>
<svg id="s9" width="500" height="400"></svg>
<script>
for(var i=0;i<30;i++){
var c = document.createElementNS
('http://www.w3.org/2000/svg','circle');
c.setAttribute('r',rn(10, 80));
c.setAttribute('cx',rn(0, 500));
c.setAttribute('cy',rn(0, 400));
c.setAttribute('fill',rc(0, 255));
c.setAttribute('fill-opacity',Math.random(0, 1));
//坑:在定时器启动时,所有圆形都已经绘制好,所以此处c会指向最后一个创建好的圆
c.onclick = function(){
var that = this;//留存this,解决闭包形成的问题 //为防止当前圆形再次被点击,应取消其事件监听
that.onclick = null; //启用定时器,让圆形慢慢变大变淡
var t = setInterval(function(){
var r = that.getAttribute('r');
r *= 1.05;//注意:*=已经自动把字符串变成浮点数
that.setAttribute('r',r);
var p = that.getAttribute('fill-opacity');
p *= 0.9;
that.setAttribute('fill-opacity',p);
if(p<0.0001){//当前圆形几乎已经看不见,停掉定时器
clearInterval(t);
that.parentNode.removeChild(that);
}
},30);
}
s9.appendChild(c); } //random number:返回指定范围内的随机整数
function rn(min,max){
var n = Math.floor(Math.random()*(max-min)+min);
return n;
}
//random color:返回指定范围内的随机颜色
//形如:rgb(x,x,x)
function rc(min, max){
var r = rn(min, max);
var g = rn(min, max);
var b = rn(min, max);
return `rgb(${r},${g},${b})`;
}
</script>
</body>
</html>

效果:


注:转载请注明出处

最新文章

  1. ASP.NET Core 中文文档 第四章 MVC(3.2)Razor 语法参考
  2. nrm NPM源管理工具
  3. 第三讲. COTS包交换介绍
  4. 关于配置Spring框架的多个propertyConfigurer的问题
  5. PHP 下的SSL加密设置
  6. windows服务器。linux服务器的集成包推荐
  7. JavaWeb基础: 学习大纲
  8. C++封装、继承、多态
  9. 使用Visual Studio Code开发Asp.Net Core WebApi学习笔记(九)-- 单元测试
  10. Beforeunload打点丢失原因分析及解决方案
  11. Js,alert出现乱码问题,赶紧记下来,额~~~
  12. winow.open打开窗口被拦截的解决方法
  13. Flink Program Guide (4) -- 时间戳和Watermark生成(DataStream API编程指导 -- For Java)
  14. UOJ Round #1 [数论 | DP 排列]
  15. linux &amp; mac环境python多版本切换与选择
  16. 开源项目——小Q聊天机器人V1.3
  17. 3. Linux系统磁盘分区介绍
  18. TableML-GUI篇(C# 编译/解析 Excel/CSV工具)
  19. java.lang.Enum
  20. 基于ETL技术的数字化校园共享数据中心设计

热门文章

  1. python 浮点数问题
  2. [python][django学习篇][12]继续设计博客首页,点击博客标题能显示文章的详情
  3. linux配置Hadoop伪分布安装模式
  4. OgnlValueStack 源码
  5. poj2002 hash+邻接表优化Squares
  6. 一小时学会用Python Socket 开发可并发的FTP服务器!!
  7. 洛谷P3045 [USACO12FEB]牛券Cow Coupons
  8. java运行时间计算
  9. [暑假集训--数论]poj2115 C Looooops
  10. nodeJS(2)深了解: nodeJS 项目架构详解(app.js + Express + Http)