JavaScript九宮格隨機顏色練習

練習要求:

在html頁面中做出3*3九個格子,隨機抽取其中三個并賦予隨機三種不同的背景色。

九宮格下有兩個按鈕,第一個按鈕點擊后開始隨機,自動隨機抓取三個格子并賦予隨機三種顏色。第二個按鈕點擊后停止隨機。

編碼過程:


首先按照要求制作九宮格頁面布局,利用CSS進行精準布局,這個練習項目的重點是javascript隨機算法,布局為次,所以很快用<div> <li> 標簽完成布局,如圖1.1

1.1

CSS代碼如下

*{

margin: 0;

padding: 0;

}

li {

margin: 2px;

display: block;

width: 30px;

height: 30px;

border-radius: 7px;

position: relative;

border: 1px solid black;

}

div {

float: left;

margin: 1px;

padding: 0;

}

ul {

margin: 0px;

padding: 0;

}

button {

position: relative;

top: 120px;

left: -100px;

}

input {

position: relative;

top: 110px;

left: -100px;

}

構建編程邏輯

首先是如何獲得隨機顏色 ?在html中顏色可以使用三種方法表示: 直接使用顏色名稱 如“red” "black"?

使用RGB(255,255,255)表示 , 使用十六進制顏色表示 如:#ffffff

本次練習就用十六進制顏色。

首先 Math.random() 函數可以得到一個0~1之間的一個隨機數,但是它是一個浮點數,也就是可能得到0.8778這種有小數的數字。使用Math.floor可以得到一個最接近浮點數的整數,用上面兩種函數可以得到隨機整數

Math.floor(Math.random())

用得到的隨機整數乘以0xffffff得到十六進制數字,使用toString(16)轉為十六進制字符串

所以得到隨機十六進制的顏色的代碼為

?Math.floor(Math.random()*0xffffff).toString(16);賦值給變量col

var col = Math.floor(Math.random()*0xffffff).toString(16);

因為九宮格的默認顏色是白色,所以要防止隨機顏色為白色(#ffffff),使用if語句可以做到

if ? (col != #ffffff) ?{

return col } else{

bg1() ? //重新隨機

}

其中 bg1()函數就是產生隨機顏色的函數名

function bg1() {

var col ='#'+Math.floor(Math.random()*0xffffff).toString(16);

if (col == "#ffffff") {

bg1();

}

else {

return col

}

};

然后需要在九個塊中隨機抽取三個不同的塊,改變他們的背景色為隨機色,使用setTimeout()函數進行遞歸,實現自動抽取,直到手動暫停。

HTML中<body>標簽內容如下


<body>內容

給九個li標簽賦予不同的ID屬性“1”~“8”,這樣就可以使用隨機函數抓取不同ID屬性的li標簽

var mub1 = Math.floor(Math.random()*9); ? ?

var mub2 = Math.floor(Math.random()*9);

var mub3 = Math.floor(Math.random()*9); ? ?

生成三個隨機范圍在0~9之間的隨機變量 mub1, mub2 ,mub3

必須要保證這三個隨機函數不相等,這樣才能抓取三個隨機的塊

使用if,else語句過遞歸過濾不滿足條件的隨機數,然后再使生成的mub1,2,3作為ID值,各賦予之前完成的隨機顏色函數,把之前得到隨機數代碼一起封裝為函數 gc();

document.getElementById("sta").onclick = function gc(){

var mub1 = Math.floor(Math.random()*9);

var mub2 = Math.floor(Math.random()*9);

var mub3 = Math.floor(Math.random()*9);

if (mub1 != mub2&&mub2 !=mub3&&mub1 !=mub3) {

document.getElementById(mub1).style.backgroundColor = bg1();

document.getElementById(mub2).style.backgroundColor = bg1();

document.getElementById(mub3).style.backgroundColor = bg1();

}

else{

gc();

}

這樣的函數是不完整的,這樣點擊開始按鈕只執行一次抓取與上色,需要使用setTimeout()設置時間間隔進行遞歸,達到自動抓取與上色的目的sto = setTimeout(function(){gc()},1001)

sto = setTimeout(function(){gc()},1001);

cle = setTimeout(function(){cm()},1000);

設置時間間隔循環函數語法為:setTimeout(code,millisec) , code為必填項,為要執行的javascript代碼,millisec必填項,單位為毫秒,指在多少毫秒后執行code語句。

不能直接設置setTimeout(gc(),1000),這樣設置會導致瀏覽器報錯gc()函數未定義defind

因為setTimeout函數作用域是window.而 gc()函數不是全局函數,所以找不到gc()函數,所以要

這樣設置: setTimeout(funtion(){gc()},1000);

同時每次抓取三個塊上色完成后,在第二次抓取之前,需要將之前的顏色清除為白色,所以需要一個設置所有li標簽背景色為白色的函數cm();

function cm() {

var li = document.getElementsByTagName("li") ? ? //抓取所有“li"標簽,賦值數組li

var i = 0 ;

for (var i = 0; i < li.length; i++) { ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//歷遍所有li標簽,改變backgroundColor

li[i].style.backgroundColor = "#ffffff"

};

};

為STOP按鈕設置清除setTimeout函數clearTimeout()

document.getElementById("stop").onclick =function stopMot() {

clearTimeout(sto);

clearTimeout(cle);};

}

以上,基本已經完成了要求效果。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,578評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,701評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,691評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,974評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,694評論 6 413
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,026評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,015評論 3 450
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,193評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,719評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,442評論 3 360
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,668評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,151評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,846評論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,255評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,592評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,394評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,635評論 2 380

推薦閱讀更多精彩內容

  • 第1章 認識JS JavaScript能做什么?1.增強頁面動態效果(如:下拉菜單、圖片輪播、信息滾動等)2.實現...
    mo默22閱讀 1,319評論 0 5
  • 一、JS前言 (1)認識JS 也許你已經了解HTML標記(也稱為結構),知道了CSS樣式(也稱為表示),會使用HT...
    凜0_0閱讀 2,790評論 0 8
  • FreeCodeCamp - Basic JavaScript 寫在前面: 我曾經在進谷前刷過這一套題,不過當時只...
    付林恒閱讀 16,483評論 5 28
  • 一、需求 仿微信短視頻錄制,點擊拍照,長按錄視頻 二、實現代碼 1、RecordVideoActivity 2、r...
    CnPeng閱讀 5,206評論 2 6
  • 這句話是我在奇葩說第18期聽劉楠講到的。 仿佛看穿了一切,預示著我們大多數的人生,終究只能平凡的度過,雖然我們也曾...
    鐵妞兒閱讀 1,799評論 0 2