[前言]
其實一開始看到這個題目,就知道的 JavaScript 不難(雙迴圈),真正的難題是刻排版XD
前幾天本來已經來到一樓門口想要攻略,
但是排版的感覺整個忘光光囧
所以乖乖跑去複習 Flex,
把排版手感找回來再繼續回來挑戰。
(編按:剛好洧杰老師有在「使用 HTML、CSS 開發一個網站」新增 Flex 的DLC,
也完成了「Flex 修煉時光屋」的任務練功,
感恩老師!讚嘆老師!QAQ)
[正題-排版]
要能夠用 JavaScript 寫出來,
首先你一定要先手動將版面刻出來!
如果你連純手工的畫面都長不出來,
就不用想後面要怎麼在 JavaScript 動態產生了。
正式刻排版前一定要聽老師的話,
要先手繪排版,
大概知道版面跟裡面元素長怎樣後先在html把元素長出來。
先長陽春版的,之後再慢慢調,
像這樣:
<body>
<div class="wrap">
<ul class="chart-all">
<li class="chart-block">
<div class="show-formula">
<h2>2</h2>
<p>2x1=2</p>
<p>2x2=4</p>
<p>2x3=6</p>
<p>2x5=10</p>
<p>2x6=12</p>
<p>2x7=14</p>
<p>2x8=16</p>
<p>2x9=18</p>
</div>
</li>
</ul>
</body>
這樣離正式的樣子還很遠,不過已經有點樣子了。
我原本想說數字2跟99乘法我想要弄成一整塊,
然後用flex wrap去換行就好,
可是我發現這樣很難設定對齊,
所以還是拆成2塊了。
像這樣:
<li class="chart-block">
<div class="show-formula left">
<h2 class="show-num">2</h2>
<p>2x1=2</p>
<p>2x2=4</p>
<p>2x3=6</p>
</div>
<div class="show-formula right">
<p>2x4=8</p>
<p>2x5=<span>10</span></p>
<p>2x6=<span>12</span></p>
<p>2x7=<span>14</span></p>
<p>2x8=<span>16</span></p>
<p>2x9=<span>18</span></p>
</div>
</li>
html有大概的樣子後,就可以動手 CSS 的部份啦!
(然後這邊我又偷偷複習了一下 SCSS 的寫法)這邊不細述中間排版的流程了。
一個區塊排出來後,
我會故意在html上複製好幾塊看排版是不是我要的樣子,
是的話再繼續往後面走。
像這樣:
<li class="chart-block">
<div class="show-formula left">
<h2 class="show-num">2</h2>
<p>2x1=2</p>
<p>2x2=4</p>
<p>2x3=6</p>
</div>
<div class="show-formula right">
<p>2x4=8</p>
<p>2x5=<span>10</span></p>
<p>2x6=<span>12</span></p>
<p>2x7=<span>14</span></p>
<p>2x8=<span>16</span></p>
<p>2x9=<span>18</span></p>
</div>
</li>
<li class="chart-block">
<div class="show-formula left">
<h2 class="show-num">2</h2>
<p>2x1=2</p>
<p>2x2=4</p>
<p>2x3=6</p>
</div>
<div class="show-formula right">
<p>2x4=8</p>
<p>2x5=<span>10</span></p>
<p>2x6=<span>12</span></p>
<p>2x7=<span>14</span></p>
<p>2x8=<span>16</span></p>
<p>2x9=<span>18</span></p>
</div>
</li>
<li class="chart-block">
<div class="show-formula left">
<h2 class="show-num">2</h2>
<p>2x1=2</p>
<p>2x2=4</p>
<p>2x3=6</p>
</div>
<div class="show-formula right">
<p>2x4=8</p>
<p>2x5=<span>10</span></p>
<p>2x6=<span>12</span></p>
<p>2x7=<span>14</span></p>
<p>2x8=<span>16</span></p>
<p>2x9=<span>18</span></p>
</div>
</li>
然後這邊說一下,我是先刻出9x9 乘法表主要的區塊(下圖左),
後來回頭才去刻第一個區塊(下圖右)。


(小聲說:我覺得上圖右那個線條超難刻的(笑)
原本那個線條想用之前助教教過的偽元素,
但我怎樣就是無法跟X並排在一起,
所以我後來就用了很爛的方法排了XD)
[正題-JavaScript]
接著就是到 JavaScript 寫出動態產生的 9x9 乘法表囉!
前面花了很多時間刻排版,到 JavaScript 就很簡單了XD
1.先用console.log測試一下雙迴圈寫出 9x9 乘法表 有沒有問題
2.OK的話就正式進入重頭戲~
我會故意在html那邊留剛剛手刻的排版,
註解起來,方便
像這樣:
<!-- <li class="chart-block">
<div class="show-formula left">
<h2 class="show-num">2</h2>
<p>2x1=2</p>
<p>2x2=4</p>
<p>2x3=6</p>
</div>
<div class="show-formula right">
<p>2x4=8</p>
<p>2x5=<span>10</span></p>
<p>2x6=<span>12</span></p>
<p>2x7=<span>14</span></p>
<p>2x8=<span>16</span></p>
<p>2x9=<span>18</span></p>
</div>
</li> -->
再來我真的幾乎是複製貼上XD
除了把一些剛hardcode的地方改成變數外,
其他真的只是複製貼上,頂多微調細節。
像 2x3=6
2 改成 ${i}
3 改成 ${j}
6 改成 ${i*j}
就結束了XD
for ( let i=2; i<=9; i++ ){
// 每次都要新增li元素
let chart_block_li = document.createElement("li");
chart_block_li.setAttribute("class","chart-block");
chart_block_li_HTML = `<div class="show-formula left"><h2 class="show-num">${i}</h2>`; // li裡面的HTML字串的開頭
for ( let j=1; j<=9; j++){
// 原本有設字元間距為 1em,如果 ixj 結果為2位數,則不要字元間距,因此有加 <span> 各別處理
if ( (i*j).toString().length == 1 ){
chart_block_li_HTML += `<p>${i}x${j}=${i*j}</p>`;
} else{
chart_block_li_HTML += `<p>${i}x${j}=<span>${i*j}</span></p>`;
}
// 3是切分點,為3的時候要加不同的HTML
if ( j==3 ){
chart_block_li_HTML += `</div><div class="show-formula right">`;
}
}
}
[後記:一些背不起來的語法但這關會用到]
CSS -
陰影:
box-shadow: 0px 3px 10px #D8D8D8;
文字陰影:
text-shadow: 4px 3px 0px #F0F0F0;
9x9 乘法表每個區塊的圓角設定:
border-radius: 100px 0px 30px 0px;
字元間距:
letter-spacing: 5px;
-
JavaScript -
網頁元件宣告:
let chart_all_El = document.getElementById("chart-all");
新增元件:
let chart_block_li = document.createElement("li");
chart_block_li.setAttribute("class","chart-block"); //設定元件屬性
將 li append 到 ul裡:
chart_all_El.appendChild(chart_block_li);
[程式碼]
[Codepen] 新手 JS 地下城 1F - 9x9 乘法表

沒有留言:
張貼留言