3D标签云的实现

  最近在做一些小Demo,看到了3D标签云觉得很酷炫,就学着做了一下。虽然看起来有点难,但是分解了看其实还是很普通的js运动的实现。
  效果预览https://chestnut647.github.io/Demo/cloudTag/


分解

  1. 球体的实现

    • 通过设置角度(α, β)确定标签的坐标位置
    • 球体的实现是通过字体大小和透明度来实现的,远处的标签更小、透明度更低
  2. 球体的旋转
    • 开启定时器,定时通过鼠标的位置来改变球体各个标签位置来达到旋转动画的效果


球体的相关公式

标签分布


  在 球体坐标系中, x y z是通过三个值来确定,即以下三个公式

       x = r * sinθ * cosφ y = r * sinθ * sinφz= r * cos θ

  因此我们可以通过对θ φ取随机值,从而把标签分布在球体的表面上,在标签分布的时候,不能随意分布,要均匀分布。引入以下两个公式:

      θ = arccos((2 * i - 1)/ len - 1); φ = θ * sqrt(len * PI)

  其中,(2 * i - 1)/len - 1 是-1 到 1 中均匀分布的数列, 然后用arccos值得到均匀分布的θ值,第二个式子是θ的等差数列

球体旋转

  旋转公式:

      x1 = cosθ * x - sinθ * y; y1 = cosθ * y + sinθ * x; 

  其中x y 是旋转前坐标, θ是逆时针旋转角度, x1 y1是旋转后的坐标,参考来源 http://www.cnblogs.com/ywxgod/archive/2010/08/06/1793609.html


代码实现

html部分

使用一个wrap来包裹住所有的标签
- wrap是一个相对定位,用来代表圆心
- a标签是绝对定位, 在圆上的坐标x y 即为a的left 和top 值

<div id="wrap">
<a href="#" class="tag">前端学习</a>
</div>
#wrap {position: relative;left: 50%;top:  50%;}#wrap .tag {display: inline-block;position:absolute;height: 50px;line-height: 50px;text-decoration: none;}

js部分

  js部分总共有两个对象
- 初始化对像: 用来对整个标签云初始化,创建所有标签对象, 同时还有控制整个标签云运动的函数
- 标签对象: 每个标签对应一个标签对象,通过初始化对象得到的x, y, 值 把自己放入标签云中适当的位置,同时通过z值设置自己的字体大小和透明度

初始化对象
function Initialization(options) {this.options = options;this.container = options.container;this.dataArr = options.data;this.init();
}Initialization.prototype.init = function() {let len = this.dataArr.length;let newTags = [];for(let i = 0; i < len; i++) {var angleA =  Math.acos((2*(i+1) -1)/len - 1); var angleB = angleA * Math.sqrt(len *Math.PI);var z = R * Math.cos(angleA);var y = R * Math.sin(angleA)*Math.sin(angleB);var x = R * Math.sin(angleA) *Math.cos(angleB);var color = '#' +Math.floor(Math.random()*0xffffff).toString(16);this.dataArr[i].style.color = color;var newtag = new Tag(this.dataArr[i], x,y, z, this.options);newtag.move();newTags.push(newtag);this.animate();}this.newTags = newTags;
}Initialization.prototype.rotateX =  function() {let cos = Math.cos(angleX),sin = Math.sin(angleX);this.newTags.forEach((tag) => {let y = tag.y * cos - tag.z * sin,z = tag.z*cos + tag.y * sin;tag.y = y;tag.z = z;});}Initialization.prototype.rotateY = function() {let cos = Math.cos(angleY),sin = Math.sin(angleY);this.newTags.forEach((tag) => {let x = tag.x * cos - tag.z * sin,z = tag.z*cos + tag.x * sin;tag.x = x;tag.z = z;});
}
Initialization.prototype.animate = function() {var that = this;setInterval(function() {that.rotateX();that.rotateY();that.newTags.forEach((tag)=> {tag.move();})}, 20);
}
标签对象
function Tag(data, x, y, z, options) {this.options = options;this.dataArr = options.data;this.data = data;this.x = x;this.y = y;this.z = z;
}
Tag.prototype.move = function() {var len = this.dataArr.length;var scale = _focalLength /(_focalLength  - this.z);var alpha = (this.z +  R)/(2 * R);this.data.style.left =  this.x + 'px';this.data.style.top =  this.y + 'px';this.data.style.fontSize = 14 * scale + 'px';this.data.style.opacity = alpha + 0.5;
}
主程序
const  _baseAngle = Math.PI /  360,R = 200;
let speed = 1,angleX = speed * _baseAngle,angleY = -speed * _baseAngle,_focalLength = R * 1.5;
window.onload = function() {let tags = document.getElementsByTagName('a');let wrap = document.getElementById('wrap');let options = {data: tags,container: wrap}let tagCloud = new Initialization(options);document.addEventListener('mousemove', function(e) {angleY = 2 * (e.clientX/ document.body.getBoundingClientRect().width- 0.5) * speed  * _baseAngle;angleX = 2 * (e.clientY/ document.body.getBoundingClientRect().height - 0.5) * speed  * _baseAngle;})
}

代码地址

详细代码地址见我的github
https://github.com/chestnut647/Demo/tree/master/cloudTag

3D标签云的简单实现相关推荐

  1. 3D标签云效果的实现

    一.关于3D标签云 TagCloudView是一个完全基于Android ViewGroup编写的控件,支持将一组View展示为一个3D标签云,并支持全方向滚动. GitHub中的链接地址:https ...

  2. [HTML5]3D标签云

    index.html <html> <head> <meta http-equiv="Content-Type" content="text ...

  3. 基于HTML5 SVG可互动的3D标签云jQuery插件

    svg3dtagcloud.js是一款基于HTML5 SVG的3D标签云jQuery插件.该3D标签云插件不需要额外的CSS样式,可使用鼠标与标签进行互动,并提供很多参数来控制标签云的外观. 效果演示 ...

  4. css标签3d,超酷的js+css3实现的3D标签云特效

    此作品是一款超酷的3D标签云 核心功能代码如下: function doPosition(){ var l = oDiv.offsetWidth / 2; var t = oDiv.offsetHei ...

  5. 3D标签云/滚动词条

    vue: <!DOCTYPE html> <html> <head><title>svg3D标签云</title><script sr ...

  6. js实现3d标签云tag动画效果js特效代码

    下载地址JS制作TAG标签云文字动画特效是一款当鼠标悬停某个标签时,当前标签静止,移出恢复滚动效果.tagcloud({ selector: ".tagcloud", //元素选择 ...

  7. 标签云 tagCloud 简单实现原理(还算好看)

    实现原理很简单,可做优化. 原理就是在一个区域内放第一个字(矩形),然后记录他的4个点(左上左下右上右下),入队列,,然后放下一个的时候,在队列取出一个点,然后第二个矩形根据这个点就有4种摆法,有些摆 ...

  8. 祝福版的3D标签云动画特效

    文章目录 实现效果 源码 实现效果 实现效果: 源码 <!DOCTYPE html> <html lang="en"> <head><me ...

  9. html 3D球状旋转标签云文字云效果

    想想一个球状的结构上面挂满了很多的标签,然后把我们要学习的内容或者是名字等3D的形式展现出来,还是非常炫酷的,这种形式的展示可能有一个名字叫做3D标签云,出于兴趣去找了一个这样的代码效果还是很可以的, ...

最新文章

  1. OpenCV畸变校正原理以及损失有效像素原理分析
  2. .Net 中字符串性能
  3. 已知某班学生的英语成绩按学号(从1开始)从小到大的顺序排列在tab表中,要查的学生学号放在变量no中,查表结果放在变量english中。
  4. 从农场女孩到首位图灵奖女性获得者,回顾法兰西斯·艾伦的辉煌一生
  5. fedora网络配置
  6. Java Calendar 类的时间操作
  7. JAVA之二叉查找树
  8. VS+VA 开发NDK
  9. kubectl bash补全
  10. html5数组查找第二大数,2021-06-29:在两个都有序的数组中找整体第K小的数。
  11. android 倒计时封装,react native中的聊天气泡及timer封装成的发送验证码倒计时
  12. VGGNet原理及tensorflow实现
  13. MySQL 数据库 alter 和 update 的区别
  14. C语言实现控制台窗口隐藏
  15. 《沉思录卷一》闪耀在私人生活圈的品质
  16. b站评论功能(一级评论到n级)
  17. table中填写数据并批量增加
  18. app inventor调用图像识别_项目实战-图像识别项目-通过QT制作图形界面并调用百度AI进行图像识别(一)...
  19. 2021-12-25 《聪明的投资者》学习笔记-18.对八组公司的比较
  20. oracle触发器如何调试

热门文章

  1. 微软2007日语输入法
  2. MPC多旋翼控制 - mav_control_rw项目
  3. Devops成功的八大炫酷工具
  4. 蘑菇街2021财年Q1财报:直播GMV连续18个季度保持增长
  5. 你只要上传两张毫无关联的照片「这个网站就会自动帮你合成了!」
  6. 提高企业WiFi速度的快速简便的方法—Vecloud微云
  7. USACO 1.2.1 你的旅途由此开始
  8. 结合Elementplus源码讲解BEM的使用
  9. 有赞微商城打通对接知乎教程
  10. 网校系统是怎样搭建的?