设为首页
优惠IDC
收藏本站
六狼博客
六狼论坛
开启辅助访问
切换到窄版
用户名
Email
自动登录
找回密码
密码
登录
立即注册
只需一步,快速开始
只需一步,快速开始
快捷导航
门户
首页
BBS
云计算
大数据
手机
移动开发android,ios,windows phone,windows mobile
编程
编程技术java,php,python,delphi,ruby,c,c++
前端
WEB前端htmlcss,javascript,jquery,html5
数据库
数据库开发Access,mysql,oracle,sql server,MongoDB
系统
操作系统windows,linux,unix,os,RedHat,tomcat
架构
项目管理
软件设计,架构设计,面向对象,设计模式,项目管理
企业
服务
运维实战
神马
搜索
搜索
热搜:
php
java
python
ruby
hadoop
sphinx
solr
ios
android
windows
centos
本版
帖子
用户
六狼论坛
»
首页
›
WEB前端
›
JavaScript
›
javascript-按圆形排列DIV元素(一)---
返回列表
查看:
27
|
回复:
0
javascript-按圆形排列DIV元素(一)---
[复制链接]
船长op
船长op
当前离线
积分
352
窥视卡
雷达卡
升级
50.67%
当前用户组为
举人
当前积分为
352
, 升到下一级还需要 148 点。
114
主题
114
主题
114
主题
举人
举人, 积分 352, 距离下一级还需 148 积分
举人, 积分 352, 距离下一级还需 148 积分
积分
352
发消息
楼主
|
发表于 2012-12-10 15:36:01
|
显示全部楼层
|
阅读模式
<div id="cnblogs_post_body">效果图:
一、分析图:
绿色边框内:外层的DIV元素,相对定位;
白色圆形框:辅助分析的想象形状;
白点:为白色圆形的圆心点,中心点,点o;
圆心角:角NOG;
黄色:需要按圆形排列的,绝对定位的DIV元素;
红色点:为每个黄色DIV的坐标点;即绝对定位时的元素,left值 和 top值 ,设置的点;
二、涉及到的概念定义:
2.1、弧度:
弧度是角的度量单位。
(
红色部分为弧长,角A为弧长对应的圆心角
)
弧长等于半径的弧,其所对的圆心角为1弧度
。(即两条
射线
从圆心向圆周射出,形成一个夹角和夹角正对的一段弧。当这段弧长正好等于圆的半径时,两条射线的夹角的弧度为1)。
根据定义,一周的弧度数为2&pi;r/r=2&pi;,360&deg;角=2&pi;弧度,因此,
1弧度约为57.3&deg;
,即57&deg;17'44.806'',1&deg;为&pi;/180弧度,近似值为0.01745弧度,周角为2&pi;弧度,平角(即180&deg;角)为&pi;弧度,直角为&pi;/2弧度。
弧长=n2&pi;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,就可以得到一个圆形。这个&ldquo;任何值&rdquo;就是得到的圆形的半径;值越大,当然这个圆形也就越大。
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,需要知到斜边;就可以求出&ldquo;对边&rdquo;值,即NG的长度值;
5.3.1 这里的X是弧度,即角度数;上面定义中说过,弧度数是表示角度数的;
根据公式: 角度数乘以 PI/180,就是弧度数; 即 X = (360/8)* PI/180
这个求出的X就是把圆形平分之后,的弧度数;
5.3.2 斜边,就是这个圆形的半径,即 200;
5.3.3 &ldquo;对边&rdquo;值,即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
<div class="cnblogs_code">
//
半径
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}); });
回复
使用道具
举报
提升卡
置顶卡
沉默卡
喧嚣卡
变色卡
千斤顶
显身卡
返回列表
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
立即注册
本版积分规则
发表回复
回帖后跳转到最后一页
浏览过的版块
Windows Phone
Copyright © 2008-2020
六狼论坛
(http://it.6wolf.com) 版权所有 All Rights Reserved.
Powered by
Discuz!
X3.4
京ICP备14020293号-2
本网站内容均收集于互联网,如有问题请联系
QQ:389897944
予以删除
快速回复
返回顶部
返回列表