div 环形排列
javascript-按圆形排列DIV元素(一)---- 分析
效果图:

一、分析图:
绿色边框内:外层的DIV元素,相对定位;
白色圆形框:辅助分析的想象形状;
白点:为白色圆形的圆心点,中心点,点o;
圆心角:角NOG;
黄色:需要按圆形排列的,绝对定位的DIV元素;
红色点:为每个黄色DIV的坐标点;即绝对定位时的元素,left值 和 top值 ,设置的点;

二、涉及到的概念定义:
2.1、弧度:弧度是角的度量单位。

(红色部分为弧长,角A为弧长对应的圆心角)
弧长等于半径的弧,其所对的圆心角为1弧度。(即两条射线从圆心向圆周射出,形成一个夹角和夹角正对的一段弧。当这段弧长正好等于圆的半径时,两条射线的夹角的弧度为1)。
根据定义,一周的弧度数为2πr/r=2π,360°角=2π弧度,因此,1弧度约为57.3°,即57°17'44.806'',1°为π/180弧度,近似值为0.01745弧度,周角为2π弧度,平角(即180°角)为π弧度,直角为π/2弧度。
弧长=n2πr/360 (在这里n就是角度数,即圆心角n所对应的弧长。)
========================================================
2.2、正弦值:弦值是在直角三角形中,对边的长比上斜边的长的值。
Math.sin(x) : X 必需。一个以弧度表示的角。将角度乘以 0.017453293 (2PI/360)即可转换为弧度。
================================================
2.3、余弦值:是指直角三角形锐角邻边与斜边的比值。
Math.sin(x) : X 必需。一个以弧度表示的角。将角度乘以 0.017453293 (2PI/360)即可转换为弧度。
三、需求分析:
3.1 让这些黄色的DIV ,在同一个圆的圆周上排列
3.2 排列的方式是平均分布
四、原理分析:
要让DIV的排列,形成一个圆形,实质就是设置每个DIV的left值 和 TOP值 之间的关系,让它们之间值的关系,按照圆形的规律去设值;
4.1 圆形的规律是什么?
是PI(圆周率); 任何值乘以这个PI再乘2,就可以得到一个圆形。这个“任何值”就是得到的圆形的半径;值越大,当然这个圆形也就越大。
4.2 怎么找到每个DIV的Left 和 TOP值之关系?
上图中的每个黄色DIV左上角的红色点的坐标,就是left 和 TOP值 ,要让这个红色的点,正好分布在这个圆周上面,那么Left 和 top 必然要和这个PI关联起来。有PI才有圆。
五、实例分析
我要得到上图中,红点的坐标值,即DIV的left 和 TOP值,
LEFT = NG + o的横坐标值(left)
TOP = ON + or的纵坐标值(TOP)
所以先要求出每个一以圆心o为顶点,以圆形半径为斜边,的直角三角形的两个直角边的值。(上图中蓝色直角三角形的ON线段和NG线段的长度值)
以半边圆形来看,当圆心角变大,半径不变的情况下,这个底边的值,是会变大的;
正弦公式:sin(X) = 对边/斜边 X变大,斜边不变(半径),那么对边(上图中的NG线段)是会变大的;
余统公式 cos(X) = 邻边/斜边 X变大,斜边不变(半径),那么邻边(上图中ON线段) 是会变小的;
270度的正统值,是负1;
180的余弦值是,是负1;
5.1 先设定一个圆
半径:200px;
5.2 平均这个圆的圆周
假设我们有8个DIV 要平均分布在这个半径为200PX的圆周上面。那么这里我们通过角度去平均(弧线的划分也好,平均也好,冒似都应该通过角度去划分);
平均:圆形的圆心角的总角度为360度,平均成8份,就是360/8; 这样平分后的每一个圆心角,所对的弧长,弧度,就都是相等的。
5.3 求出NG的长度值,也就是DIV的left值,即红点的横坐标值;
求这个值,要用到正弦函数;
公式 Math.sin(X) = 对边/斜边;
我们需要知道X,需要知到斜边;就可以求出“对边”值,即NG的长度值;
5.3.1 这里的X是弧度,即角度数;上面定义中说过,弧度数是表示角度数的;
根据公式: 角度数乘以 PI/180,就是弧度数; 即 X = (360/8)* PI/180
这个求出的X就是把圆形平分之后,的弧度数;
5.3.2 斜边,就是这个圆形的半径,即 200;
5.3.3 “对边”值,即NG的长度值;
根据上面的公式变形:对边(NG ) = Math.sin(X)*斜边
即 :对边(NG )= Math.sin(X)* 200 = Math.sin( (360/8)* PI/180 )* 200;
好了,现在把对边(NG )的值求出来了;也就是红点的横坐标值,即DVI的LEFT值;
5.4 求出每一个圆心角对应的直角边,即对边的长度值
因为每一个圆心角,都是均分的,所以乘以一个倍数,就得到不周圆心角对应的弧度值,即角度值
这里用DIV的索引为倍数,值乘以X,就得到每个均分后,每个圆心角的弧度值;
对边 = Math.sin(X*索引)* 200;
用这个求出的【对边】值 做为DIV的left值;
5.5 DIV的TOP值,即ON线段的长度值
以上面四点的原理一样,只不过把正弦值,改为余弦值
邻边(ON) = Math.COS(X*索引)* 200;
把这个值设为 DIV的TOP值;
根据以上分析:代码如下,就可以按一个圆形,来排列DIV

//半径
var radius = 200;
//每一个BOX对应的角度;
var avd = 360/$(".box").length;
//每一个BOX对应的弧度;
var ahd = avd*Math.PI/180; $(".box").each(function(index, element){
$(this).css({"left":Math.sin((ahd*index))*radius,"top":Math.cos((ahd*index))*radius});
});

5.6 设置这个圆形的位置
圆形的位置,是根据这个圆形的圆心坐标来定的,所以我们就是要设置,圆心的坐标值,left top
圆心的坐标坐变化了,那么对应DIV的left top也应该改变;
比如圆心的left :100PX ; TOP:100px;
那么每个DIV的LEFT和TOP也应该加上这个值:
代码如下

$(function(){
//中心点横坐标
var dotLeft = ($(".container").width()-$(".dot").width())/2;
//中心点纵坐标
var dotTop = ($(".container").height()-$(".dot").height())/2;
//起始角度
var stard = 0;
//半径
var radius = 200;
//每一个BOX对应的角度;
var avd = 360/$(".box").length;
//每一个BOX对应的弧度;
var ahd = avd*Math.PI/180;
//设置圆的中心点的位置
$(".dot").css({"left":dotLeft,"top":dotTop});
$(".box").each(function(index, element){
$(this).css({"left":Math.sin((ahd*index))*radius+dotLeft,"top":Math.cos((ahd*index))*radius+dotTop});
});
})

六 总结:
6.1 在涉及到曲线或弧线的时候,应该用角度或弧度去分析,找关联;
6.2 找关系或比例,让值和值之间是一个关系式,会用到乘以或除以一个倍数;( 例如以前写过的放大镜,就是用比例关系);
七 先前的理解有误,现在更新了分析的图片和分析;感谢 “ 弦”!的提示~
div 环形排列的更多相关文章
- 如何定义让两个div横向排列
方法一: 一般情况,默认的div是写一个换一行,那么如何定义两个div横向排列而不换行呢? div默认的display属性是block.所以每一个div都是新的一行,现在把display换成inlin ...
- 如何让div横向排列
方法一: 一般情况,默认的div是写一个换一行,那么如何定义两个div横向排列而不换行呢? div默认的display属性是block.所以每一个div都是新的一行,现在把display换成inlin ...
- HTML+CSS-如何定义让两个div横向排列
方法一: 一般情况,默认的div是写一个换一行,那么如何定义两个div横向排列而不换行呢? div默认的display属性是block.所以每一个div都是新的一行,现在把display换成inlin ...
- div横向排列
在网页布局中,常常有几个div横向排列的需求,此时,可以采用浮动的方式: 1.左右浮动: <div class="main"> <div class=" ...
- DIV横向排列_CSS如何让多个div盒子并排同行显示
如何让多个div盒子并排同行div横向排列显示呢? 我们先设置3个div盒子对象,什么css样式都不设置看看效果.代码如下: 三个div盒子均独占一行显示 div盒子本身默认样式属性是独占一行,而解决 ...
- 两个div横向排列,顶端对齐的方式。
1.左右两个div都设置为float:left,如果右边div没有设置宽度,右边div的宽度会根据div里的内容自动调整. <!DOCTYPE html PUBLIC "-//W3C/ ...
- SSH中后台传到前台一个信息集合,tr td中怎么进行排列,类似在一个div里排列书籍
总觉得描述问题不对,这里详细说一下,就是把下面图片变成排列整齐,一行四个,多出来的两个排到下一行. 我问过群里的,给的答案都有些简介:1:后台排好了,前台循环出来: 2:前台直接循环,多出来的加< ...
- 【html】【9】div布局[div层叠]
让DIV重叠并按想要顺序重叠需要CSS来实现,即CSS绝对定位进行实现. 重叠样式需要主要CSS样式解释1.z-index 重叠顺序属性2.position:relative和position:abs ...
- div样式调整小结 转载
1.多个div使用会自动换行,应该使用float属性 left : 对象浮在左边 right : 对象浮在右边 例如: float: left 和 float: right 是两个div左右排 ...
随机推荐
- Codeforces Round #565 (Div. 3) A
A. Divide it! 题目链接:http://codeforces.com/contest/1176/problem/A 题目 You are given an integer n You ca ...
- C++ 洛谷 P1731 [NOI1999]生日蛋糕
P1731 [NOI1999]生日蛋糕 一本通上也有. 这TM是一道极其简单的深搜剪枝(DP当然可以的了,这里我只讲深搜). 首先圆柱公式:(有点数学基础都知道) V=πR2H S侧=π2RH S底= ...
- 浅说——树形DP
啊!DP! 顾名思义,树形DP就是在树上所做的动态规划.我们一般所做的动态规划多是线性的,线性DP我们可以从前向后或从后向前两种方法,不妨类比一下,在树上我们同样可以有两种方法,从根向树叶或者从树叶向 ...
- Codeforces 777D:Cloud of Hashtags(水题)
http://codeforces.com/problemset/problem/777/D 题意:给出n道字符串,删除最少的字符使得s[i] <= s[i+1]. 思路:感觉比C水好多啊,大概 ...
- JDK源码阅读(三):ArraryList源码解析
今天来看一下ArrayList的源码 目录 介绍 继承结构 属性 构造方法 add方法 remove方法 修改方法 获取元素 size()方法 isEmpty方法 clear方法 循环数组 1.介绍 ...
- 解决 Prometheus 不能获取 Kubernetes 集群上 Windows 节点的 Metrics
背景 接上一篇 快速搭建 Windows Kubernetes , 我们发现原来在 Windows Kubernetes 会有一些与在 Linux 上使用不一样的体验,俗称坑,例如 hostAlias ...
- abview查找范例时说 NI服务器未定位 这是怎么回事?
NI服务定位器未运行在使用labview查找范例时,出现“NI服务定位器未运行”的对话框,而后不能够打开范例.有以下方法.方法一:是防火墙服务禁用造成的,在防火墙规则里面找,把和NI相关的都允许. 方 ...
- springboot自动装配(2)---实现一个自定义自动装配组件
对于springboot个人认为它就是整合了各种组件,然后提供对应的自动装配和启动器(starter),基于这个流程去实现一个定义的装配组件 还是这张图 一.创建自己的自动配置工程, spring.f ...
- windows切换mac遇到的问题
1. 前端代码需要安装npm包 所以需要对整个文件夹都赋予管理员权限 2. 在npm i的时候如果权限不足 查看是哪一行调用了哪个文件夹,赋予权限 3. Dsp-fe 本地环境 除了需要配置host ...
- MyBatis从入门到精通(十二):使用collection标签实现嵌套查询
最近在读刘增辉老师所著的<MyBatis从入门到精通>一书,很有收获,于是将自己学习的过程以博客形式输出,如有错误,欢迎指正,如帮助到你,不胜荣幸! 本篇博客主要讲解使用collectio ...