基于javascript實(shí)現(xiàn)按圓形排列DIV元素(二)
一、原理分析
1.1怎么才能讓DIV元素動(dòng)起來?
動(dòng)起來的實(shí)質(zhì),就是改變DIV的位置,也就是改變其left和top值;
2.2怎么上DIV元素動(dòng)起來的時(shí)候,是在規(guī)定的圓周上面?
通過上一次的分析,讓DIV按圓形排隊(duì),我們知道了,如要讓DIV定位在圓周上面,主要是根據(jù)角度(弧度)來實(shí)現(xiàn)的。
看下圖:

上圖中,我們B元素和C元素的定位是如何實(shí)現(xiàn)的?根據(jù)上一次講的公式,如下:
(index:元素的索引值,radius半徑,dotLeft:圓心的橫坐標(biāo),dotTop:圓心的縱坐標(biāo))
B的left = Math.sin((ahd*Bindex))*radius+dotLeft B的top = Math.cos((ahd*Bindex))*radius+dotTop C的left = Math.sin((ahd*Cindex))*radius+dotLeft C的top = Math.cos((ahd*Cindex))*radius+dotTop
從公式中可以看出,都一樣,只是B和C的index,即索引值不一樣,從而讓角度(弧度)數(shù)不一樣,結(jié)果就是正弦和余弦的值不一樣,所以定位也就不一樣了,但結(jié)果都是在這個(gè)圓周上變化。不會(huì)跑離這個(gè)圓周;
如果我現(xiàn)在想讓B元素,定位到C元素的位置,該怎么做呢?
就是讓B元素的角度(弧度)和C元素的一樣,然后,套用上面的公式,就可以了。
B元素的現(xiàn)在的用的圓心角,是AOB,C元素用的圓心角,是AOC; B元素和C元素之間相差了上圖中BOC這個(gè)角度(弧度)值,也就是兩個(gè)藍(lán)色線條之間的角度(弧度);
得出結(jié)論:改變角度(弧度)就可以讓元素在圓周上改變位置;
二、實(shí)例分析
根據(jù)上面的分析,我們已經(jīng)知道如何在圓周上,改變DIV的位了;現(xiàn)在我們要做的就是怎么去改變才能讓元素看起來是在運(yùn)動(dòng)?
是“速度”;有運(yùn)動(dòng)就會(huì)有速度
速度就是在規(guī)定時(shí)間內(nèi)移動(dòng)的距離:速度 = 距離/時(shí)間
速度太快就是“瞬間移動(dòng)”讓B移動(dòng)到C;
速度慢,就可以看到B一點(diǎn)點(diǎn)向C的位置移動(dòng);
時(shí)間:在Javascript里的時(shí)間:就是用的setInterval(....,時(shí)間)
例如:setInterval(移動(dòng),1000) 我們規(guī)定間隔1000毫秒,讓元素做移動(dòng)。
在本例中的移動(dòng):就是改變DVI的left和TOP值,而要改變這個(gè)值,需要用到上面的圓周上移動(dòng)的公式;
速度:設(shè)一個(gè)速度 speed = 5;
這里的5,就是角度,即讓圓心角,每1000毫秒,變化5度。
speed = speed*Math.PI/180;將這個(gè)變化的角度轉(zhuǎn)換成弧度,因?yàn)镸ath.sin只接受弧度單位的參數(shù);
得出:
function 移動(dòng)(){
speed ++
left = Math.sin((ahd*Bindex+speed ))*radius+dotLeft;
Math.cos((ahd*Bindex+speed))*radius+dotTop
}
三、實(shí)現(xiàn)代碼:
$(function(){
//中心點(diǎn)橫坐標(biāo)
var dotLeft = ($(".container").width()-$(".dot").width())/2;
//中心點(diǎn)縱坐標(biāo)
var dotTop = ($(".container").height()-$(".dot").height())/2;
//起始角度
var stard = 0;
//半徑
var radius = 200;
//每一個(gè)BOX對(duì)應(yīng)的角度;
var avd = 360/$(".box").length;
//每一個(gè)BOX對(duì)應(yīng)的弧度;
var ahd = avd*Math.PI/180;
//運(yùn)動(dòng)的速度
var speed = 2;
//設(shè)置圓的中心點(diǎn)的位置
$(".dot").css({"left":dotLeft,"top":dotTop});
//設(shè)置DIV圓形排列
$(".box").each(function(index, element){
$(this).css({"left":Math.sin((ahd*index))*radius+dotLeft,"top":Math.cos((ahd*index))*radius+dotTop});
});
//運(yùn)動(dòng)函數(shù)
var fun_animat = function(){
speed = speed<360?speed:2;
//運(yùn)運(yùn)的速度
speed+=2;
//運(yùn)動(dòng)距離,即運(yùn)動(dòng)的弧度數(shù);
var ainhd = speed*Math.PI/180;
//按速度來定位DIV元素
$(".box").each(function(index, element){
$(this).css({"left":Math.sin((ahd*index+ainhd))*radius+dotLeft,"top":Math.cos((ahd*index+ainhd))*radius+dotTop});
});
}
//定時(shí)調(diào)用運(yùn)動(dòng)函數(shù)
var setAnimate = setInterval(fun_animat,100);
})
其實(shí)也可以反過來思考,即每1000毫秒,我們獲得圓周上的一個(gè)坐標(biāo)點(diǎn),將這個(gè)點(diǎn)的left和TOP值,賦給,需要改變位置,即運(yùn)動(dòng)的DIV元素!~~
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家有所幫助,有興趣的朋友可以參考文章《基于javascript實(shí)現(xiàn)按圓形排列DIV元素(一)》和《基于javascript實(shí)現(xiàn)按圓形排列DIV元素(三)》,謝謝對(duì)腳本之家的支持!
- 基于javascript實(shí)現(xiàn)按圓形排列DIV元素(一)
- 基于javascript實(shí)現(xiàn)按圓形排列DIV元素(三)
- JS實(shí)現(xiàn)二維數(shù)組元素的排列組合運(yùn)算簡(jiǎn)單示例
- 特漂亮的JS圖片排列旋轉(zhuǎn)效果代碼
- JS實(shí)現(xiàn)數(shù)組按升序及降序排列的方法
- js實(shí)現(xiàn)簡(jiǎn)單排列組合的方法
- JavaScript實(shí)現(xiàn)數(shù)字?jǐn)?shù)組按照倒序排列的方法
- JavaScript全排列的六種算法 具體實(shí)現(xiàn)
- JS實(shí)現(xiàn)的數(shù)組全排列輸出算法
- JavaScript如何實(shí)現(xiàn)元素全排列實(shí)例代碼
相關(guān)文章
在element-ui的select下拉框加上滾動(dòng)加載
這篇文章主要介紹了在element-ui的select下拉框加上滾動(dòng)加載,本文以以element-ui中的select為例,給大家介紹的非常詳細(xì),需要的朋友可以參考下2019-04-04
js的window.showModalDialog及window.open用法實(shí)例分析
這篇文章主要介紹了js的window.showModalDialog及window.open用法,實(shí)例分析了window.showModalDialog與window.open方法的定義、功能與使用技巧,需要的朋友可以參考下2015-01-01
ajax前臺(tái)后臺(tái)跨域請(qǐng)求處理方式
本篇文章通過前臺(tái)跨域請(qǐng)求處理以及后臺(tái)跨域的數(shù)據(jù)處理方式介紹,詳細(xì)分析了ajax跨域的問題,對(duì)此有需要的朋友學(xué)習(xí)下。2018-02-02
IE6/7/8中Option元素未設(shè)value時(shí)Select將獲取空字符串
可以看到當(dāng)忘記寫option的value時(shí)這些現(xiàn)代瀏覽器都會(huì)盡量返回正確的(客戶端程序員想要的)結(jié)果value,其容錯(cuò)性比IE6/7/8做的更好。2011-04-04
用javascript為頁面添加天氣顯示實(shí)現(xiàn)思路及代碼
為頁面添加天氣顯示的方法有很多,在本文為大家介紹下使用js來輕松實(shí)現(xiàn),具體的代碼如下,感興趣的朋友不要錯(cuò)過2013-12-12
javascript中的變量作用域以及變量提升詳細(xì)介紹
在javascript中, 理解變量的作用域以及變量提升是非常有必要的。這個(gè)看起來是否很簡(jiǎn)單,但其實(shí)并不是你想的那樣,還要一些重要的細(xì)節(jié)你需要理解2013-10-10
js canvas實(shí)現(xiàn)星空連線背景特效
這篇文章主要為大家詳細(xì)介紹了js canvas實(shí)現(xiàn)星空連線背景特效,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-11-11
JS實(shí)現(xiàn)新浪博客左側(cè)的Blog管理菜單效果代碼
這篇文章主要介紹了JS實(shí)現(xiàn)新浪博客左側(cè)的Blog管理菜單效果代碼,可實(shí)現(xiàn)基于鼠標(biāo)點(diǎn)擊事件動(dòng)態(tài)操作頁面元素樣式的功能,界面美觀大方,簡(jiǎn)潔實(shí)用,需要的朋友可以參考下2015-10-10

