目錄

高二下自主學習成果

初探網頁設計

二年六班 侯竣奇

Contents

  • 計劃
    • 教材 & 工具
  • 基礎中的基礎
    • Flexbox 排版
    • RWD 設計
  • JavaScript
    • 共用 Header
  • 上架靜態伺服器
    • Github
  • 網域與 Nameserver
  • 每次更新內容都需要這樣嗎?
    • 認識 Markdown 語法
  • 初識 Hugo 靜態網頁生成
  • 在 Netlify 上架
    • CMS:靜態網站也能有後台

計劃

教材選用

彭彭的教學頻道

彭彭的教學頻道

1 基礎 HTML 8 CSS3 Flexbox – RWD
2 基礎 CSS 9 JavaScript (JS) 入門
3 CSS 選擇器 10 JS 變數與運算子
4 CSS 表格樣式 11 JS 判斷式
5 基礎網頁排版 12 JS 迴圈
6 回應式排版設計 13 編寫網頁並上架
7 CSS3 Flexbox

工具

  • Repl.it 線上多程式語言編譯 IDE

    Repl.it 截圖
  • Notion 學習過程記錄

    Notion 截圖
  • Brackets 網頁編輯軟體,有即時預覽功能

基礎中的基礎

HTML 語法

  先認識最基本的網頁架構,在這個階段做出來的網頁只有最基礎的內容。
基本上就是跟著影片中的教學在 repl.it 上面把程式碼敲一遍,最後看瀏覽器渲染出來的結果。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8"></meta>
        <title>我的首頁</title>
    </head>
    <body>
        <h3>我的照片</h3>
        <img width="200" src="head.jpg"/>
        <hr/>
        <h3>我的最愛</h3>
        <ul>
            <li><a href="https://www.google.com">Google</a></li>
            <li>Facebook</li>
            <li>PTT.cc</li>
        </ul>
        <h3>MLB baseball</h3>
        <table border=1 width="400" cellpadding="5">
            <tr>
                <td>Name</td>
                <td>Win</td>
                <td>Lose</td>
            </tr>
            <tr>
                <td><b>New York Yankees</b></td>
                <td>10</td>
                <td>8</td>
            </tr>
            <tr>
                <td>Boston Red Sox</td>
                <td>9</td>
                <td>9</td>
            </tr>
        </table>
    </body>
</html>
純 html 的表格截圖

CSS 語法

  除了教學用途之外,基本上很少會看到「純的」html 網頁。CSS 可以幫助我們將網頁修飾得更為美觀,而且可以讓多個區塊套用相同的屬性,不僅避免多次的重複編寫還能讓格式更統一。

基礎 CSS

  • class 選擇器
    • style 區塊或者獨立的 CSS 文件中使用 .xxx 代表指定特定的 class 名詞要使用的 css 效果
    • divp 中可以使用 class="xxx" 來使整個區塊套用已經寫好的 css 語法
  • id 選擇器
    • 1
      2
      3
      4
      5
      6
      7
      8
      
      #btn{
       border:1px solid #888888;
       background-color:#ffffff;
       padding: 5px;
      }
      
      /* 套用在物件上 */
      <button id="btn">我是要套用的按鈕</button>
      
  • 虛擬選擇器:以 :focus 為例
    • 1
      2
      3
      
      input:focus{
       border:2px solid #ff0000;
      }
      
    • 當目標取得焦點(鍵盤或滑鼠)時套用此設定
  • 階層式選擇
    • CSS 可以指定「在 A 區塊中的 B」套用某組設定
    • 1
      2
      3
      
      .favorite h1{
       color:#0000ff;
      }
      
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
  <!DOCTYPE html>
    <html>
    <head>
        <meta charset="utf-8"/>
        <title>CSS 基礎語法</title>
        <style type="text/css">
        .title{font-weight:bold;font-size:24px}
        .content{width:400px;padding:10px;border:1px dashed blue;margin-top:10px;margin-bottom:10px}
        .keyword{color:red}
        .box{
            position:relative;left:200px;top:50px;
            width:100px;height:100px;background-color:green
        }
        </style>
    </head>
    <body>
        <div class="title">今天天氣不錯</div>
        <div class="content">
           我去公園散步<span class="keyword">鴿子</span><br/>
           覺得鴿子好可愛喔
        </div>

        <div class="title">公園裡有很多小朋友</div>
        <div class="content">
           小朋友在玩溜滑梯盪鞦韆還有幾隻<span class="keyword">狗狗</span>和貓貓
        </div>
        <div class="content">
           還有幾位老公公<span style="position:relative;top:-8px">2</span>在聊天
        </div>
    </body>
    </html>
CSS 基礎語法

CSS 表格

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>CSS 表格樣式 - 詳細介紹</title>
<style type="text/css">
table{
	width:400px;
	border-collapse:collapse;
}
td{
	border-bottom:1px solid#888888;padding:10px;
}
/* 表格中的第一對 <tr> */
tr:nth-child(1){
	background-color:#7788aa;color:#ffffff;
}
/*表格中的偶數對 <tr> */
tr:nth-child(even){
	background-color:#e8e8e8;
}
</style>
</head>
<body>
	<table>
		<tr>
			<td>球隊</td>
			<td></td>
			<td></td>
		</tr>
		<tr>
			<td>紐約洋基隊</td>
			<td>10</td>
			<td>8</td>
		</tr>
		<tr>
			<td>波士頓紅襪隊</td>
			<td>9</td>
			<td>9</td>
		</tr>
		<tr>
			<td>多倫多藍鳥隊</td>
			<td>8</td>
			<td>9</td>
		</tr>
	</table>
</body> 
</html>	
CSS 表格截圖

Flexbox 排版

傳統 CSS 排版

  • <div> 不換行
    • display:inline-block;
  • <div> 置中
    • margin-left:auto; margin-right:auto;
  • <div> 對母塊置中
    • vertical-align:top;
  • 調整行高
    • line-height: 30px;
  • <body> 與邊界沒有距離(網頁貼齊螢幕)
    • margin:0px;
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8" />
	<title>竣奇的自我介紹</title>
	<style type="text/css">
	.head{
		background-color:#003344;color:white;
		font-weight:bold;font-size:30px;
		text-align:center;padding:10px
	}
	.content{
		width:1000px;
		margin-left:auto;margin-right:auto;
	}
	.box{
		width:280px;padding:10px;margin:10px;
		background-color:white;
		display:inline-block;vertical-align:top;
		text-align:center;height:150px;line-height:30px;
	}
	.title{
		font-weight:bold;
	}
	</style>
</head>
<body style="margin:0px;background-color:#eeeeee;">
	<div class="head">竣奇的自我介紹</div>
	<div class="content">
		<div class="box">
			<div class="title">我的基本資料</div>
			<div>姓名侯竣奇</div>
			<div>2004 年生</div>
		</div>
		<div class="box">
			<div class="title">我的個人興趣</div>
			<div>寫程式</div>
			<div>金融交易</div>
			<div>研究生產力工具</div>
		</div>
		<div class="box">
			<div class="title">學經歷</div>
			<div>嘉義高中</div>
			<div>南興國中</div>
			<div>興安國小</div>
		</div>
	</div>
</body> 
</html>	
HTML 結合 CSS 做表格

Flexbox 排版

什麼是 Flexbox?
Flex 是 CSS3 開始出現的 box model。它就像一個一個靈活的盒子,可以藉由設定盒子的內容物如何排列來控制網頁中的內容 flexbox 的概念圖

  • justify-content
    • 內容與整個 Flexbox 的「水平對齊」
    • flex-start
    • flex-end
    • center
    • space-between
    • space-around
  • align-items
    • 內容與整個 Flexbox 的「垂直對齊」
    • flex-start
    • flex-end
    • center
    • stretch:預設值,將內容元素全部撐得和 Flexbox 一樣高
    • baseline 以所有內容的基線作為對齊標準
    • flexbox 的概念圖2
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8" />
	<title>CSS3 Flexbox</title>
	<link href="style.css" rel="stylesheet" type="text/css"
			media="all" />
</head>
<body>
	<nav>
		<div class="logo">Logo</div>
		<div class="menu">Menu</div>
		<div class="user">User</div>
	</nav>
	<!-- Flex 如何解決並排切欄)、水平對齊垂直對齊的問題 -->
	<main>
		<div class="item">News 1<br/>Today is a good day.</div>
		<div class="item">News 2</div>
		<div class="item">News 3</div>
	</main>
</body>
</html>
flexbox 練習截圖

RWD

RWD:Responsive Web Design
自適應排版

✩ 依照使用者的螢幕大小(1200px/500px/…)規畫不同的 CSS 設定

HTML:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8" />
	<title>CSS3 Flexbox RWD 排版</title>
	<link href="style.css" rel="stylesheet" type="text/css"
			media="all" />
</head>
<body>
	<nav>
		<div class="logo">Logo</div>
		<div class="menu">Menu</div>
		<div class="user">User</div>
	</nav>
	<!--
		RWD 回應式設計的關鍵動作:欄位變化
		Flex 如何控制欄位的變化?
		例如:4欄 > 2欄 > 1欄

		規劃:
			1200px 以上的規劃:4 欄,固定尺寸
			500px~1200px 的規劃:2 欄,彈性尺寸
			500px 以下的規劃:1 欄,彈性尺寸
	-->
	<main>
		<div class="item">News 1<br/>Today is a good day.</div>
		<div class="item">News 2</div>
		<div class="item">News 3</div>
		<div class="item">News 4</div>
	</main>
</body>
</html>
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
body{margin:0px;}
/* nav 樣式設定 */
nav{
	display:flex;
}
nav>.logo{
	/* 沒有彈性,固定尺寸 */
	flex:none;width:100px;
	background-color:#ffcccc;
}
nav>.menu{
	/* 盡量把容器的空間張滿 */	
	flex:auto;
	background-color:#ccccff;
}
nav>.user{
	flex:none;width:100px;
	background-color:#ccffcc;
}
/* main 樣式設定 */
main{ /* 容器 */
	display:flex;flex-wrap:wrap;
	justify-content:center;
	align-items:flex-start;
	background-color:#cccccc;
}
main>.item{ /* 項目 */
	flex:none;
	width:270px;margin:10px;
	background-color:#ffcccc;
}
@media (max-width:1200px){
	main>.item{
		width:45%;
	}
}
@media (max-width:500px){
	main>.item{
		width:90%;
	}
}
  • Desktop:
    /schoollearninghtml/rwd-desktop.webp
  • Phone:
    RWD 手機端截圖

JavaScript

基礎語法

與 C++ 相似處:

  1. 都須以 ; 結尾
  2. 都區分大小寫
  3. 變數觀念似乎相似
1
2
3
4
5
//在 head 裡面可以寫 JS
<script type="text/javascript">
		alert("大家好");
		alert("大家午安");
</script>

事件處理

  • 讓按扭在按下時顯示 Clicked
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8"/>
		<title>Event 事件處裡</title>
		<script type="text/javascript">
			function over(element){
				element.style.color="red";
			}
			function out(element){
				element.style.color="black";
			}
		</script>
	</head>
	<body>
		<button onclick="alert('Clicked')">Click</button>
		<span onmouseover="over(this);" onmouseout="out(this);">Test</span>
		<div onmouseover="over(this);" onmouseout="out(this);">Line2</div>
	</body>
</html>

神奇的語法問題

  • 計時器
1
2
3
4
5
//第一種寫法:執行後倒數計時器馬上就歸零了
window.setTimeout(countdown(),1000);

//後來試著跟著影片裡寫,這樣子居然就可以了
window.setTimeout(countdown,1000);

有誰知道為什麼嗎?


共用 Header

資料:

查詢到的方法

  1. 手寫 JavaScript
  2. 利用 JQuery

其中第一種方法我嘗試失敗,後來改用第二種。

其實我第二種一開始也失敗,因為竟然不知道 JQuery 裡面的語法不是內建的,要先下載下來引用…

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8"/>
        <title>樹(いつき)的金融學堂</title>
        <link rel="icon" href="/favicon.svg" type="image/x-icon" />
        <link rel="stylesheet" href="main.css" />
        <script src="jquery-3.6.0.min.js"></script>
    </head>
    <body>
        <script type="text/javascript" src="/main.js"></script>
        
        <div class="header"></div>
        <script>$(".header").load("header.html");</script>
        
        <main>
            <H1>HOMEPAGE</H1>
        </main>
    </body>
</html>

  然後在目錄放一個叫 header.html 的檔案,裡面只需要寫 Menu 的區塊就好了(不用寫完整的 html 檔)

上架靜態伺服器

做到此時網頁的樣子:

  • 花了很多時間才完成的 RWD Menu
  • 沒錯,我花了好久才弄好 Menu,而且其實比例好像有哪裡怪怪的。
    RWD Menu 電腦端
    RWD Menu 手機端

Github

別管那麼多,先上架就對了!

資料:

/schoollearninghtml/upload-github.webp

/schoollearninghtml/enable-github-pages.webp

網域與 Nameserver

源由

  • Github 可以自訂網域
  • .com.net 等大部分頂級網域需要花錢
  • 不想用次級網域 eg.junqi.github.io

資料:

Freenom

Freenom 網域商

小結

自訂網址

每次更新內容都需要這樣嗎?

  根據原訂的計畫,到了這一步以後應該就是開始寫一些網頁的內容豐富我的網站。但是突然想到幾個問題點:

  1. 每次一需要修訂內容就需要動到網頁原始碼。
  2. 對於寫文章來說,每一行都動到 HTML 原碼並不是一個很順暢的書寫體驗。

於是乎想到我現在正在用來記錄學習過程的 Notion 似乎也支援分享為網頁的功能,後來深入找尋資料發現 Markdown 語法似乎天生就可以轉成 HTML…

Markdown 語法

最初接觸

Notion:支援 Markdown 的線上多功能筆記軟體

  從這個學期初開始,我為了方便記錄我的學習內容,一直都是使用 Notion 作為記錄的工具。
在 Notion 中許多常用的語法,其實都是 Markdown 語法:

  • # 標題
    • ## 次標題
    • ### 次次標題
      …以此類推,最高支援六層
  • [文字](URL) 超連結
  • `code` 程式碼引用
    • 使用三個 ` 在頭尾:可以輸入多行程式碼

Markdown 特性

  由於 Markdown(下稱 MD)在最終顯示時會被轉換成 HTML,當 MD 語法無法滿足你需求的時候,其實可以直接在檔案中寫上 HTML 碼,最終顯示出來是不會有問題的。

認識 Hugo

前言

資料:

最後我選用 Hugo 當靜態網頁生成器。

Why Hugo?

What’s Hugo?

Hexo 與 Hugo 都是靜態網頁生成器,只要給它們 Markdwon 文件就可以自動依據你給的模版產生出網頁。

我選用 Hugo 主要有以下原因:

  • 開源免費。
  • 極快的網頁生成速度,既使文章數量多起來也不必擔心。
  • 支援 Markdown 語法,方便更新文章。

Code Notes:

1
2
3
hugo new site xxx //建立一個網站
hugo new posts/xx.md //建立一個新文章
hugo server -D //在本機架預覽伺服器

選擇模版

  • LoveIt
    1. KaTeX 語法
      • 例:等差級數和公式
      • $\sum_{i=1}^{n}{a_i}=\frac{(a_1+a_n)*n}{2}$
      • $\sum_{i=1}^{n}{a_i}=\frac{(a_1+a_n)*n}{2}$
    2. 黑色模式
    3. 程式碼高亮
    4. RWD
    5. 簡潔美觀

設定 config.toml

設定 Menu 的項目、網站的 icon、等等
/schoollearninghtml/hugo-config.webp

在 Netlify 上架

部屬

  Netlify 提供免費的靜態伺服器,並且支援 Automatic Deploy,可以在你把更新的文章 push 到 Github 上面以後自動更新文章到網頁上。

  • Github 作為源碼儲存庫
    • 在 Github 上的 Hugo 源碼 Repo
  • Netlify 發現有變動後自動 Deploy
    • images/schoollearninghtml/netlify-deploy.webp
    • /schoollearninghtml/netlify-deploy-console.webp

Netlify CMS:靜態網站的後台系統

建立

CMS:Content Management System(內容管理系統)

設定後台可以管理的項目(標題、內文、日期、分類等…)

/schoollearninghtml/setting-cms.webp

(對應的設定介面)
/schoollearninghtml/actuall-cms.webp

最終成果

本站網址:junqi.ml
2023/07/11 更:現為 blog.junqi.tw

文章管理流程:

  1. 在 CMS 上面新增文章
    • 會自動開一個 Github 的分支儲存
  2. 從 HackMD 上面 Pull 下來修改內文
  3. 從 HackMD 寫好後 Push 回 Github
  4. 在 CMS 上「發文」,合併分支及 Deploy 的部分會全自動處理

/schoollearninghtml/actuall-cms-2.webp

/schoollearninghtml/edit-hackmd.webp

心得

與上學期的差異

  我上學期的自主學習的主題是「自學 MT5 程式交易」,起初我也有個宏大的目標:希望能夠寫出一些市場上流傳常見的策略,利用歷史資料一一驗證它們在這些年的績效表現並做數據分析。
  但到了後來頻繁出現的編譯錯誤,又加上不是常見的程式語言以至無從問起,經過好幾週的重寫與測試後我還是放棄了…又或者說是放到以後待完成的願望清單。
  這學期我將目標放得更鬆,為了讓我學習過程中即使遇到障礙也較容易尋找協助,我把主題定在較常見的網頁設計。我最低的目標是:學習基礎的語法、了解網頁的構成。
  雖然最終我沒有硬生生把整個網頁手刻出來,但在把預計的教材學習完並且初步寫出 Menu 後,我透過修改模版、結合架站時學到的網域概念,最終生出了本站。

未來展望

  今後在學習的過程中會順手把歷程在這裡,除了作為自己的學習記錄,也希望今後若有人遇到與我相同問題時,我能幫上忙。