<?xml version="1.0" encoding="UTF-8"?>
        <?xml-stylesheet type="text/xsl" href="/static/rss.xsl"?>
        <rss version="2.0" 
        xmlns:content="http://purl.org/rss/1.0/modules/content/"
        xmlns:media="http://search.yahoo.com/mrss/">
        <channel>
        <title>毛哥EM資訊密技</title>
        <link>https://emtech.cc</link>
        <description>分享各種程式及軟體</description>
        <language>zh-Hant</language>
        <lastBuildDate>Fri, 17 Apr 2026 10:23:35 GMT
        </lastBuildDate>
        <pubDate>Fri, 17 Apr 2026 10:23:35 GMT</pubDate>
        <ttl>1800</ttl>
        <item>
      <title>把 GitHub Pages 從 /repo 變成 /a/b：用多個 Repo 管理同一個網站的子路徑</title>
      <link>https://emtech.cc/p/repo-subpage</link>
      <description>在 SITCON 學生計算機年會的官網每年都有很多子網站，混在一起管理會非常麻煩。這篇文章介紹了我們是怎麼利用 GitHub Actions 來自動把多個 Repo 的內容部署到同一個 Repo 的不同子路徑下，讓我們可以輕鬆地管理所有的子網站。</description>
      <pubDate>Tue, 07 Apr 2026 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/repo-subpage</guid>
      <media:thumbnail url="https://emtech.cc/static/repo-subpage/thumbnail.webp" />
      <category>軟體開發</category>
     <content:encoded><![CDATA[<img src="/static/repo-subpage/thumbnail.webp" />
<p>GitHub Pages 讓我們可以輕鬆地把一個 Repo 變成一個網站。他支援以下兩種方式：</p>
<ol>
<li>建立一個名叫 <code>username.github.io</code> 的 Repo，然後把網站內容放在這個 Repo 裡面。這樣網站就會出現在 <code>https://username.github.io/</code>。</li>
<li>把任意一個 Repo 設定成 GitHub Pages，然後把網站內容放在這個 Repo 裡面。這樣網站就會出現在 <code>https://username.github.io/repo/</code>。</li>
</ol>
<p>但是在 SITCON 學生計算機年會的官網我們遇到了一個問題，我們每年都有很多子網站：</p>
<ul>
<li><code>https://sitcon.org/2026/</code>：年會主網站 - Astro</li>
<li><code>https://sitcon.org/2026/cfp/</code>：徵稿網站 - Astro</li>
<li><code>https://sitcon.org/2026/cfs/</code>：贊助徵求書 - Astro</li>
<li><code>https://sitcon.org/2026/landing/</code>：工人召募頁面 - Next.js</li>
<li><code>https://sitcon.org/2026/closing/</code>：本來的閉幕動畫 - 原本只有 Vite 變成 Astro</li>
</ul>
<p>這些網頁都是完全不同的架構與設計，甚至是使用的框架都不一樣。混在一起管理會非常麻煩，每次 clone 跟部署都會很久（尤其是官網有一堆生成縮圖的步驟），權限管理跟卡片管理也很痛苦。</p>
<p>但是 GitHub Pages 的限制讓我們只能把網站放在 <code>/repo/</code> 這樣的子路徑裡面，無法直接放在 <code>/a/b/</code> 這樣的子路徑裡面。那我們要怎麼辦呢？</p>
<h2 id="步驟一：創建-a-repo">步驟一：創建 /a Repo</h2>
<p>這裡我創建了一個 Repo 叫做 <a href="https://github.com/elvisdragonmao/base-repo"><code>base-repo</code></a>，然後放一個簡單的 HTML 網頁在裡面。這個 Repo 就是我們要放在 <code>/a/</code> 這個子路徑裡面的網站內容了。</p>
<p><code>dist/index.html</code>：</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div><div class="ln">3</div><div class="ln">4</div><div class="ln">5</div><div class="ln">6</div><div class="ln">7</div><div class="ln">8</div><div class="ln">9</div><div class="ln">10</div><div class="ln">11</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-html hljs" data-lang="html"><span class="hljs-meta">&lt;!doctype <span class="hljs-keyword">html</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">html</span>&gt;</span>
	<span class="hljs-tag">&lt;<span class="hljs-name">head</span>&gt;</span>
		<span class="hljs-tag">&lt;<span class="hljs-name">meta</span> <span class="hljs-attr">charset</span>=<span class="hljs-string">&quot;UTF-8&quot;</span> /&gt;</span>
		<span class="hljs-tag">&lt;<span class="hljs-name">meta</span> <span class="hljs-attr">name</span>=<span class="hljs-string">&quot;viewport&quot;</span> <span class="hljs-attr">content</span>=<span class="hljs-string">&quot;width=device-width, initial-scale=1.0&quot;</span> /&gt;</span>
		<span class="hljs-tag">&lt;<span class="hljs-name">title</span>&gt;</span>父頁面<span class="hljs-tag">&lt;/<span class="hljs-name">title</span>&gt;</span>
	<span class="hljs-tag">&lt;/<span class="hljs-name">head</span>&gt;</span>
	<span class="hljs-tag">&lt;<span class="hljs-name">body</span>&gt;</span>
		<span class="hljs-tag">&lt;<span class="hljs-name">h1</span>&gt;</span>父頁面<span class="hljs-tag">&lt;/<span class="hljs-name">h1</span>&gt;</span>
	<span class="hljs-tag">&lt;/<span class="hljs-name">body</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">html</span>&gt;</span></code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  <input type="checkbox" class="code-toggle" id="code-toggle-26">
        <label for="code-toggle-26" class="code-toggle-label"></label>
</div>
<h2 id="步驟二：創建-ab-repo">步驟二：創建 /a/b Repo</h2>
<p>接著我們再開一個 Repo 叫做 <a href="https://github.com/elvisdragonmao/base-repo-sub"><code>base-repo-sub</code></a>，這個 Repo 就是我們要放在 <code>/a/b/</code> 這個子路徑裡面的網站內容了。在裡面我也放點 HTML。</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div><div class="ln">3</div><div class="ln">4</div><div class="ln">5</div><div class="ln">6</div><div class="ln">7</div><div class="ln">8</div><div class="ln">9</div><div class="ln">10</div><div class="ln">11</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-html hljs" data-lang="html"><span class="hljs-meta">&lt;!doctype <span class="hljs-keyword">html</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">html</span>&gt;</span>
	<span class="hljs-tag">&lt;<span class="hljs-name">head</span>&gt;</span>
		<span class="hljs-tag">&lt;<span class="hljs-name">meta</span> <span class="hljs-attr">charset</span>=<span class="hljs-string">&quot;UTF-8&quot;</span> /&gt;</span>
		<span class="hljs-tag">&lt;<span class="hljs-name">meta</span> <span class="hljs-attr">name</span>=<span class="hljs-string">&quot;viewport&quot;</span> <span class="hljs-attr">content</span>=<span class="hljs-string">&quot;width=device-width, initial-scale=1.0&quot;</span> /&gt;</span>
		<span class="hljs-tag">&lt;<span class="hljs-name">title</span>&gt;</span>子頁面<span class="hljs-tag">&lt;/<span class="hljs-name">title</span>&gt;</span>
	<span class="hljs-tag">&lt;/<span class="hljs-name">head</span>&gt;</span>
	<span class="hljs-tag">&lt;<span class="hljs-name">body</span> <span class="hljs-attr">style</span>=<span class="hljs-string">&quot;background-color: black; color: white;&quot;</span>&gt;</span>
		<span class="hljs-tag">&lt;<span class="hljs-name">h1</span>&gt;</span>子頁面<span class="hljs-tag">&lt;/<span class="hljs-name">h1</span>&gt;</span>
	<span class="hljs-tag">&lt;/<span class="hljs-name">body</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">html</span>&gt;</span></code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  <input type="checkbox" class="code-toggle" id="code-toggle-44">
        <label for="code-toggle-44" class="code-toggle-label"></label>
</div>
<h2 id="步驟三：設定-github-actions">步驟三：設定 GitHub Actions</h2>
<p>猜到了嗎？我們可以利用 GitHub Actions 來自動把 <code>base-repo-sub</code> 的內容部署到 <code>base-repo</code> 這個 Repo 的 <code>/sub/</code> 路徑下。這樣我們就可以在 <code>base-repo</code> Repo 裡面管理所有的子網站了。</p>
<p>因為我們在 Repo <code>base-repo</code> 也是有自己的網頁內容，所以我在 <code>base-repo</code> 這個 Repo 底下建立了一個叫做 <code>gh-pages</code> 的 branch，專門用來放置從其他 Repo 部署過來的子網站內容。這樣我們就可以在 <code>base-repo</code> 這個 Repo 裡面管理所有的子網站了。</p>
<p>請你載 <code>base-repo-sub</code> 這個 Repo 裡面建立一個 <code>.github/workflows/deploy.yml</code> 的檔案，然後把以下的內容貼上去：</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div><div class="ln">3</div><div class="ln">4</div><div class="ln">5</div><div class="ln">6</div><div class="ln">7</div><div class="ln">8</div><div class="ln">9</div><div class="ln">10</div><div class="ln">11</div><div class="ln">12</div><div class="ln">13</div><div class="ln">14</div><div class="ln">15</div><div class="ln">16</div><div class="ln">17</div><div class="ln">18</div><div class="ln">19</div><div class="ln">20</div><div class="ln">21</div><div class="ln">22</div><div class="ln">23</div><div class="ln">24</div><div class="ln">25</div><div class="ln">26</div><div class="ln">27</div><div class="ln">28</div><div class="ln">29</div><div class="ln">30</div><div class="ln">31</div><div class="ln">32</div><div class="ln">33</div><div class="ln">34</div><div class="ln">35</div><div class="ln">36</div><div class="ln">37</div><div class="ln">38</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-yml hljs" data-lang="yml"><span class="hljs-attr">name:</span> <span class="hljs-string">Deploy</span> <span class="hljs-string">Pages</span>

<span class="hljs-attr">on:</span>
  <span class="hljs-attr">push:</span>
    <span class="hljs-attr">branches:</span> [<span class="hljs-string">main</span>]
  <span class="hljs-attr">workflow_dispatch:</span>

<span class="hljs-attr">jobs:</span>
  <span class="hljs-attr">build-and-deploy:</span>
    <span class="hljs-attr">runs-on:</span> <span class="hljs-string">ubuntu-latest</span>
    <span class="hljs-attr">steps:</span>
      <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">Checkout</span> <span class="hljs-string">repo</span>
        <span class="hljs-attr">uses:</span> <span class="hljs-string">actions/checkout@v5</span>

      <span class="hljs-comment"># 如果你需要的話：</span>
      <span class="hljs-comment"># - name: Setup pnpm</span>
      <span class="hljs-comment">#   uses: pnpm/action-setup@v5</span>

      <span class="hljs-comment"># - name: Setup Node.js</span>
      <span class="hljs-comment">#   uses: actions/setup-node@v6</span>
      <span class="hljs-comment">#   with:</span>
      <span class="hljs-comment">#     node-version: 22</span>
      <span class="hljs-comment">#     cache: &quot;pnpm&quot;</span>

      <span class="hljs-comment"># - name: Install dependencies</span>
      <span class="hljs-comment">#   run: pnpm install --frozen-lockfile</span>

      <span class="hljs-comment"># - name: Install &amp; Build</span>
      <span class="hljs-comment">#   run: pnpm build</span>

      <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">Deploy</span> <span class="hljs-string">to</span> <span class="hljs-string">main</span> <span class="hljs-string">repo</span>
        <span class="hljs-attr">uses:</span> <span class="hljs-string">peaceiris/actions-gh-pages@v4</span>
        <span class="hljs-attr">with:</span>
          <span class="hljs-attr">deploy_key:</span> <span class="hljs-string">${{</span> <span class="hljs-string">secrets.DEPLOY_KEY</span> <span class="hljs-string">}}</span>
          <span class="hljs-attr">external_repository:</span> <span class="hljs-string">elvisdragonmao/base-repo</span>
          <span class="hljs-attr">publish_branch:</span> <span class="hljs-string">gh-pages</span>
          <span class="hljs-attr">publish_dir:</span> <span class="hljs-string">./</span> <span class="hljs-comment"># 或是 ./dist</span>
          <span class="hljs-attr">destination_dir:</span> <span class="hljs-string">sub</span> <span class="hljs-comment"># 這裡是你想要部署到的子路徑</span></code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  <input type="checkbox" class="code-toggle" id="code-toggle-66">
        <label for="code-toggle-66" class="code-toggle-label"></label>
</div>
<blockquote>
<p>如果你的網站需要 build 的話，你可以把上面註解掉的部分打開，然後根據你的專案需求來修改安裝跟 build 的步驟。</p>
</blockquote>
<h2 id="步驟四：設定-deploy-key">步驟四：設定 Deploy Key</h2>
<p>不過這樣 push 上去會跑失敗，因為 GitHub Actions 內建提供的 <code>GITHUB_TOKEN</code> 是沒有權限去操作其他 Repo 的，所以我們需要自己產生一個 <code>base-repo</code> 的 Deploy Key，然後把這個 Deploy Key 加到 <code>base-repo-sub</code> 這個 Repo 的環境變數裡面。</p>
<h3 id="生成-deploy-key">生成 Deploy Key</h3>
<p>請你先在你的電腦上使用以下的指令來生成一個新的 SSH Key，或是你也可以使用線上的生成器：<a href="https://8gwifi.org/sshfunctions.jsp">8gwifi.org/sshfunctions.jsp</a>。</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-bash hljs" data-lang="bash">ssh-keygen -t ed25519 -C <span class="hljs-string">&quot;deploy-key&quot;</span> -f deploy_key</code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<p>當他問你 <code>Enter passphrase for &quot;deploy_key&quot;</code> 直接按 enter 保持空白即可。接著你會發現你在當前的目錄創建了 兩個檔案：<code>deploy_key</code>（私鑰）和 <code>deploy_key.pub</code>（公鑰）。</p>
<h3 id="把-deploy-key-加到-base-repo-repo">把 Deploy Key 加到 <code>base-repo</code> Repo</h3>
<p>接著你要把剛剛生成的 Deploy Key 的公鑰（<code>deploy_key.pub</code>）加到 <code>base-repo</code> 這個 Repo 的 Deploy Key 裡面，並且給它寫入權限。</p>
<p>進到  Settings -&gt; Deploy Keys -&gt; Add deploy key，然後把 <code>deploy_key.pub</code> 的內容貼上去，勾選 <code>Allow write access</code>，最後按下 <code>Add key</code> 就完成了。

        <figure>
            <img src="/static/repo-subpage/deploy-keys.webp" alt="進到  Settings -> Deploy Keys" title="" width="1200" height="912">
            <figcaption>進到  Settings -> Deploy Keys</figcaption>
        </figure>
    </p>
<p>記得要勾選 Allow write access，這樣這個 Deploy Key 才有權限去操作 <code>base-repo</code> 這個 Repo。</p>
<p>
        <figure>
            <img src="/static/repo-subpage/deploy-keys-new.webp" alt="新增 Deploy Key" title="" width="1200" height="912">
            <figcaption>新增 Deploy Key</figcaption>
        </figure>
    </p>
<h3 id="把-deploy-key-加到-github-actions-的-secrets-裡面">把 Deploy Key 加到 GitHub Actions 的 Secrets 裡面</h3>
<p>最後你要把剛剛生成的 Deploy Key 的私鑰（<code>deploy_key</code>）的內容複製到 <code>base-repo-sub</code> 這個 Repo 的 GitHub Actions 的 Secrets 裡面，命名為 <code>DEPLOY_KEY</code>。</p>
<p>
        <figure>
            <img src="/static/repo-subpage/set-secrets.webp" alt="設定 Secrets" title="" width="1200" height="901">
            <figcaption>設定 Secrets</figcaption>
        </figure>
    </p>
<p>進到 <code>base-repo-sub</code> Repo 的 Settings -&gt; Secrets and variables -&gt; Actions -&gt; New repository secret，然後把 <code>deploy_key</code> 的內容貼上去，名字填 <code>DEPLOY_KEY</code>，最後按下 <code>Add secret</code> 就完成了。</p>
<p>
        <figure>
            <img src="/static/repo-subpage/secrets-new.webp" alt="新增 Secrets" title="" width="1200" height="901">
            <figcaption>新增 Secrets</figcaption>
        </figure>
    </p>
<p>這樣你就完成了設定，當你 push 你的 <code>base-repo-sub</code> Repo 的 <code>main</code> branch 的時候，GitHub Actions 就會自動把 <code>base-repo-sub</code> Repo 的內容部署到 <code>base-repo</code> Repo 的 <code>/sub/</code> 路徑下囉！</p>
<p><a href="https://elvisdragonmao.github.io/base-repo/sub/">https://elvisdragonmao.github.io/base-repo/sub/</a></p>
<h3 id="重新執行-github-actions">重新執行 GitHub Actions</h3>
<p>如果你剛才是先設定 GitHub Actions 的話，你需要回到 <code>base-repo-sub</code> 這個 Repo 的 Actions 頁面，然後手動重新執行剛剛的 Workflow，這樣他才會使用到你剛剛設定的 Deploy Key。</p>
<p>
        <figure>
            <img src="/static/repo-subpage/trigger-actions.webp" alt="手動觸發 Actions" title="" width="1200" height="422">
            <figcaption>手動觸發 Actions</figcaption>
        </figure>
    </p>
<h2 id="步驟五：部署主網站">步驟五：部署主網站</h2>
<p>最後如果你想要把 <code>base-repo</code> 這個 Repo 的內容也部署到 GitHub Pages 上的話，你可以在 <code>base-repo</code> 這個 Repo 裡面建立一個 <code>.github/workflows/deploy.yml</code> 的檔案，然後把以下的內容貼上去：</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div><div class="ln">3</div><div class="ln">4</div><div class="ln">5</div><div class="ln">6</div><div class="ln">7</div><div class="ln">8</div><div class="ln">9</div><div class="ln">10</div><div class="ln">11</div><div class="ln">12</div><div class="ln">13</div><div class="ln">14</div><div class="ln">15</div><div class="ln">16</div><div class="ln">17</div><div class="ln">18</div><div class="ln">19</div><div class="ln">20</div><div class="ln">21</div><div class="ln">22</div><div class="ln">23</div><div class="ln">24</div><div class="ln">25</div><div class="ln">26</div><div class="ln">27</div><div class="ln">28</div><div class="ln">29</div><div class="ln">30</div><div class="ln">31</div><div class="ln">32</div><div class="ln">33</div><div class="ln">34</div><div class="ln">35</div><div class="ln">36</div><div class="ln">37</div><div class="ln">38</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-yml hljs" data-lang="yml"><span class="hljs-attr">name:</span> <span class="hljs-string">Deploy</span> <span class="hljs-string">Pages</span>

<span class="hljs-attr">on:</span>
  <span class="hljs-attr">push:</span>
    <span class="hljs-attr">branches:</span>
      <span class="hljs-bullet">-</span> <span class="hljs-string">main</span>
  <span class="hljs-attr">workflow_dispatch:</span>

<span class="hljs-attr">permissions:</span>
  <span class="hljs-attr">contents:</span> <span class="hljs-string">write</span>
  <span class="hljs-attr">pages:</span> <span class="hljs-string">write</span>
  <span class="hljs-attr">id-token:</span> <span class="hljs-string">write</span>
  <span class="hljs-attr">actions:</span> <span class="hljs-string">write</span>

<span class="hljs-attr">jobs:</span>
  <span class="hljs-attr">build-and-deploy:</span>
    <span class="hljs-attr">runs-on:</span> <span class="hljs-string">ubuntu-latest</span>
    <span class="hljs-attr">steps:</span>
      <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">Checkout</span> <span class="hljs-string">repo</span>
        <span class="hljs-attr">uses:</span> <span class="hljs-string">actions/checkout@v5</span>

      <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">Deploy</span> <span class="hljs-string">into</span> <span class="hljs-string">gh-pages</span>
        <span class="hljs-attr">run:</span> <span class="hljs-string">|
          git fetch origin gh-pages || true
          git worktree add ../gh-pages gh-pages || git checkout --orphan gh-pages
</span>
          <span class="hljs-comment"># 清空你不需要的舊檔案</span>
          <span class="hljs-string">rm</span> <span class="hljs-string">-rf</span> <span class="hljs-string">../gh-pages/_astro</span> <span class="hljs-string">../gh-pages/_next</span>

          <span class="hljs-comment"># 複製新的網頁</span>
          <span class="hljs-string">cp</span> <span class="hljs-string">-r</span> <span class="hljs-string">dist/*</span> <span class="hljs-string">../gh-pages/</span> <span class="hljs-comment"># 根據你的需求調整資料夾</span>

          <span class="hljs-string">cd</span> <span class="hljs-string">../gh-pages</span>
          <span class="hljs-string">git</span> <span class="hljs-string">add</span> <span class="hljs-string">.</span>
          <span class="hljs-string">git</span> <span class="hljs-string">config</span> <span class="hljs-string">user.name</span> <span class="hljs-string">&quot;github-actions[bot]&quot;</span>
          <span class="hljs-string">git</span> <span class="hljs-string">config</span> <span class="hljs-string">user.email</span> <span class="hljs-string">&quot;github-actions[bot]@users.noreply.github.com&quot;</span>
          <span class="hljs-string">git</span> <span class="hljs-string">commit</span> <span class="hljs-string">-m</span> <span class="hljs-string">&quot;chore: Deploy main site&quot;</span> <span class="hljs-string">||</span> <span class="hljs-string">echo</span> <span class="hljs-string">&quot;No changes to commit&quot;</span>
          <span class="hljs-string">git</span> <span class="hljs-string">push</span> <span class="hljs-string">origin</span> <span class="hljs-string">gh-pages</span></code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  <input type="checkbox" class="code-toggle" id="code-toggle-159">
        <label for="code-toggle-159" class="code-toggle-label"></label>
</div>
<p>哇賽這裡怎麼就變得這麼麻煩得手動操作 Git 了？原因是因為如果我們直接用 <code>peaceiris/actions-gh-pages</code> 這個 Action 的話，因為我們首頁在根目錄，所以會把所有東西全部都清掉（包涵 <code>/sub/</code> 這個子路徑裡面的內容）。但是我們只有想要清掉首頁主 Repo 裡面不需要的檔案而已，所以我們就只能自己寫腳本來操作 Git，把我們需要的檔案複製過去，然後 commit 跟 push 上去。</p>
<p>記得要自己調整裡面 Build 的指令以及要傳的資料夾喔！</p>
<div class="notice">
<h3 id="worktree-是什麼">Worktree 是什麼</h3>
<p>Worktree 是 Git 內建功能幫你複製貼上整個 Repo 資料夾（但是共用 .git）讓你可以編輯兩個 branch，方便我們搬檔案到另一個 branch。</p>
</div>
<h2 id="總結">總結</h2>
<p>其實在 <a href="https://github.com/sitcon-tw/2026">SITCON 2026 的 Repo</a> 你可以看到我把事情搞得比較複雜。像是我是搬到 <code>build</code> 這個 branch 裡面，部署還用自己寫 GitHub Actions 而不是 Deploy From Branch 所以多寫了很多複雜的東西。記得當時研究這個也是花了好多時間，不過後來在進行各專案的開發時候就非常方便了。每個網站開始時也可以重新決定要使用哪個框架，網頁架構要怎麼寫，要用哪個套件。輕量又好管理。</p>
]]></content:encoded>
    </item>
<item>
      <title>JavaScript 教學：從入門到精通</title>
      <link>https://emtech.cc/p/js</link>
      <description>這份講義會從 JavaScript 基本語法開始，一路帶你走到 function、DOM 操作、event listener。</description>
      <pubDate>Wed, 01 Apr 2026 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/js</guid>
      <media:thumbnail url="https://emtech.cc/static/js/thumbnail.webp" />
      <category>程式教學</category>
     <content:encoded><![CDATA[<img src="/static/js/thumbnail.webp" />
<p>JavaScript 是瀏覽器裡最重要的互動程式語言之一。</p>
<p>如果把前端網頁比喻成一間店：</p>
<ul>
<li><strong>HTML</strong>：店裡有哪些東西（結構）</li>
<li><strong>CSS</strong>：店裡長怎樣（樣式）</li>
<li><strong>JavaScript</strong>：店員會不會動、會不會回應客人（互動）</li>
</ul>
<p>例如：</p>
<ul>
<li>點按鈕後跳出提示</li>
<li>使用者輸入內容後即時顯示</li>
<li>點擊卡片切換展開/收合</li>
<li>表單送出前先驗證資料</li>
</ul>
<p>這些通常都會用到 JavaScript。</p>
<h2 id="怎麼把-javascript-放進網頁？">怎麼把 JavaScript 放進網頁？</h2>
<p>最基本有兩種方式：</p>
<h3 id="1-寫在-html-裡">1. 寫在 HTML 裡</h3>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div><div class="ln">3</div><div class="ln">4</div><div class="ln">5</div><div class="ln">6</div><div class="ln">7</div><div class="ln">8</div><div class="ln">9</div><div class="ln">10</div><div class="ln">11</div><div class="ln">12</div><div class="ln">13</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-html hljs" data-lang="html"><span class="hljs-meta">&lt;!DOCTYPE <span class="hljs-keyword">html</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">html</span>&gt;</span>
	<span class="hljs-tag">&lt;<span class="hljs-name">head</span>&gt;</span>
		<span class="hljs-tag">&lt;<span class="hljs-name">title</span>&gt;</span>JS Demo<span class="hljs-tag">&lt;/<span class="hljs-name">title</span>&gt;</span>
	<span class="hljs-tag">&lt;/<span class="hljs-name">head</span>&gt;</span>
	<span class="hljs-tag">&lt;<span class="hljs-name">body</span>&gt;</span>
		<span class="hljs-tag">&lt;<span class="hljs-name">h1</span>&gt;</span>Hello<span class="hljs-tag">&lt;/<span class="hljs-name">h1</span>&gt;</span>

		<span class="hljs-tag">&lt;<span class="hljs-name">script</span>&gt;</span><span class="language-javascript">
			<span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(<span class="hljs-string">&quot;我是 JavaScript&quot;</span>);
		</span><span class="hljs-tag">&lt;/<span class="hljs-name">script</span>&gt;</span>
	<span class="hljs-tag">&lt;/<span class="hljs-name">body</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">html</span>&gt;</span></code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  <input type="checkbox" class="code-toggle" id="code-toggle-26">
        <label for="code-toggle-26" class="code-toggle-label"></label>
</div>
<h3 id="2-用外部檔案引入">2. 用外部檔案引入</h3>
<h4 id="html">HTML</h4>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-html hljs" data-lang="html"><span class="hljs-tag">&lt;<span class="hljs-name">script</span> <span class="hljs-attr">src</span>=<span class="hljs-string">&quot;main.js&quot;</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">script</span>&gt;</span></code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<h4 id="mainjs">main.js</h4>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-js hljs" data-lang="js"><span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(<span class="hljs-string">&quot;我是外部檔案中的 JavaScript&quot;</span>);</code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<h3 id="consolelog-是什麼？"><code>console.log()</code> 是什麼？</h3>
<p><code>console.log()</code> 是 JavaScript 的 Hello World。它會把東西印到瀏覽器開發者工具的 Console。</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div><div class="ln">3</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-js hljs" data-lang="js"><span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(<span class="hljs-string">&quot;哈囉&quot;</span>);
<span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(<span class="hljs-number">123</span>);
<span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(<span class="hljs-literal">true</span>);</code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<p>當你不確定程式跑到哪、變數裡面裝了什麼，先 <code>console.log()</code> 再說。</p>
<p>我們現在可以像上一堂 CSS 和上上堂 HTML 一樣先打開一個 Visual Studio Code 的資料夾，然後在 <code>index.html</code> 裡引入 <code>main.js</code>，打開右下角的 Go Live 之後就可以開始練習 JavaScript 基礎語法囉！</p>
<p>不過不用擔心如果你沒有讀過前兩篇也可以直接跟著這篇練習，JavaScript 的部分會從頭開始講解。</p>
<blockquote>
<p>回顧：<a href="https://emtech.cc/p/html/">環境建置與 HTML 完全指南</a></p>
</blockquote>
<p>打開 Live Server 之後你可以點擊 F12 進入開發者工具，接著點擊主控台（Console）就可以看到 <code>console.log()</code> 印出來的內容了。之後網頁有錯誤也會在這裡顯示（像是現在底下紅紅的那樣）。</p>
<p>
        <figure>
            <img src="/static/js/first.webp" alt="你的第一個 JavaScript" title="" width="1450" height="784">
            <figcaption>你的第一個 JavaScript</figcaption>
        </figure>
    </p>
<p>你的瀏覽器開發者工具畫面可能跟我長得稍微有一點點不一樣，因為我是使用 Firefox（我也建議你使用，因為你的隱私很重要，而且狐狸很可愛！）同時 Firefox 有一些很好用的開發者工具。</p>
<p>接下來我們先來認識一下 JavaScript 的基本語法，這樣我們才有工具可以跟網頁互動。</p>
<h2 id="變數與資料型別">變數與資料型別</h2>
<h3 id="什麼是變數？">什麼是變數？</h3>
<p>變數就是一個有名字的盒子，或是邊條紙，你可以把資料放進去。</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-js hljs" data-lang="js"><span class="hljs-keyword">let</span> name = <span class="hljs-string">&quot;小明&quot;</span>;
<span class="hljs-keyword">let</span> age = <span class="hljs-number">18</span>;</code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<h3 id="let、const、var"><code>let</code>、<code>const</code>、<code>var</code></h3>
<p>JavaScript 裡有三種宣告變數的方式： <code>let</code>、<code>const</code>、<code>var</code>。</p>
<ul>
<li><code>let</code> 用在一般的變數，只要在那個括號裡面的東西都可以用。</li>
<li><code>const</code> 跟 <code>let</code> 一樣在同一個括號裡面都能用，但是他不能重新編輯。像是黏了強力膠的樂高一樣。可以比較穩定比較安全。</li>
</ul>
<p>比如說這個 <code>let</code> 可重新賦值。</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-js hljs" data-lang="js"><span class="hljs-keyword">let</span> score = <span class="hljs-number">60</span>;
score = <span class="hljs-number">80</span>;</code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<p><code>const</code> 這樣不行：</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-js hljs" data-lang="js"><span class="hljs-keyword">const</span> pi = <span class="hljs-number">3.14</span>;
pi = <span class="hljs-number">100</span>; <span class="hljs-comment">// 錯誤</span></code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<p>你的主控台會尖叫說：&quot;Uncaught TypeError: invalid assignment to const 'pi'&quot;（你不能把 pi 重新賦值！）。</p>
<h4 id="var"><code>var</code></h4>
<p>在有 <code>let</code> 和 <code>const</code> 之前的原古時代，JavaScript 只有 <code>var</code> 可以宣告變數。它的行為比較古怪，現在已經不建議使用了。</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-js hljs" data-lang="js"><span class="hljs-keyword">var</span> oldWay = <span class="hljs-string">&quot;舊寫法&quot;</span>;</code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<blockquote>
<p>初學建議：<strong>優先用 <code>const</code>，需要變動時再用 <code>let</code>。</strong></p>
</blockquote>
<h3 id="常見資料型別">常見資料型別</h3>
<p>那麼我們可以在變數這盒子裡面放什麼東西呢？這裡舉幾個範例。你不需要特別指定 JavaScript 很聰明會自己辨認！</p>
<h4 id="1-字串-string">1. 字串 <code>string</code></h4>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-js hljs" data-lang="js"><span class="hljs-keyword">const</span> username = <span class="hljs-string">&quot;Alice&quot;</span>;
<span class="hljs-keyword">const</span> message = <span class="hljs-string">&quot;Hello&quot;</span>;</code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<h4 id="2-數字-number">2. 數字 <code>number</code></h4>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-js hljs" data-lang="js"><span class="hljs-keyword">const</span> price = <span class="hljs-number">100</span>;
<span class="hljs-keyword">const</span> pi = <span class="hljs-number">3.14159</span>;</code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<h4 id="3-布林-boolean">3. 布林 <code>boolean</code></h4>
<p>只有是否，<code>true</code> 跟 <code>false</code>。</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-js hljs" data-lang="js"><span class="hljs-keyword">const</span> isLoggedIn = <span class="hljs-literal">true</span>;
<span class="hljs-keyword">const</span> isAdmin = <span class="hljs-literal">false</span>;</code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<h4 id="4-null">4. <code>null</code></h4>
<p>代表「這裡沒有東西」。</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-js hljs" data-lang="js"><span class="hljs-keyword">const</span> selectedUser = <span class="hljs-literal">null</span>;</code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<h4 id="5-undefined">5. <code>undefined</code></h4>
<p>代表「還沒被指定值」（我不知道這裡是什麼）。</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-js hljs" data-lang="js"><span class="hljs-keyword">let</span> test;
<span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(test); <span class="hljs-comment">// undefined</span></code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<h4 id="6-物件-object">6. 物件 <code>object</code></h4>
<p>你可以放一個有多個屬性的資料包在一起。比如說這裡創建了一個 user 物件，裡面有 name 跟 age 兩個屬性。</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div><div class="ln">3</div><div class="ln">4</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-js hljs" data-lang="js"><span class="hljs-keyword">const</span> user = {
	<span class="hljs-attr">name</span>: <span class="hljs-string">&quot;小明&quot;</span>,
	<span class="hljs-attr">age</span>: <span class="hljs-number">18</span>
};</code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<h4 id="7-陣列-array">7. 陣列 <code>array</code></h4>
<p>Aka 清單。其實也是物件的一種，但你可以先把它當成「有順序的資料列表」。</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-js hljs" data-lang="js"><span class="hljs-keyword">const</span> fruits = [<span class="hljs-string">&quot;apple&quot;</span>, <span class="hljs-string">&quot;banana&quot;</span>, <span class="hljs-string">&quot;orange&quot;</span>];</code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<h3 id="typeof"><code>typeof</code></h3>
<p><code>typeof</code> 可以幫你看看目前這個變數的資料型別。</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div><div class="ln">3</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-js hljs" data-lang="js"><span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(<span class="hljs-keyword">typeof</span> <span class="hljs-string">&quot;hello&quot;</span>); <span class="hljs-comment">// string</span>
<span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(<span class="hljs-keyword">typeof</span> <span class="hljs-number">123</span>); <span class="hljs-comment">// number</span>
<span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(<span class="hljs-keyword">typeof</span> <span class="hljs-literal">true</span>); <span class="hljs-comment">// boolean</span></code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<h2 id="運算子與比較">運算子與比較</h2>
<p>接下來我們要來做一些基本的數學運算。</p>
<h3 id="算術運算子">算術運算子</h3>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div><div class="ln">3</div><div class="ln">4</div><div class="ln">5</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-js hljs" data-lang="js"><span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(<span class="hljs-number">1</span> + <span class="hljs-number">2</span>); <span class="hljs-comment">// 3</span>
<span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(<span class="hljs-number">5</span> - <span class="hljs-number">2</span>); <span class="hljs-comment">// 3</span>
<span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(<span class="hljs-number">3</span> * <span class="hljs-number">4</span>); <span class="hljs-comment">// 12</span>
<span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(<span class="hljs-number">1</span> / <span class="hljs-number">2</span>); <span class="hljs-comment">// 0.5</span>
<span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(<span class="hljs-number">10</span> % <span class="hljs-number">3</span>); <span class="hljs-comment">// 1</span></code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<p><code>%</code> 是取餘數，很常拿來判斷奇偶數。</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-js hljs" data-lang="js"><span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(<span class="hljs-number">4</span> % <span class="hljs-number">2</span>); <span class="hljs-comment">// 0</span>
<span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(<span class="hljs-number">5</span> % <span class="hljs-number">2</span>); <span class="hljs-comment">// 1</span></code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<h3 id="字串組合">字串組合</h3>
<p>想要把兩個字串合在一起？簡單，直接 <code>+</code> 就可以囉。</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div><div class="ln">3</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-js hljs" data-lang="js"><span class="hljs-keyword">const</span> firstName = <span class="hljs-string">&quot;王&quot;</span>;
<span class="hljs-keyword">const</span> lastName = <span class="hljs-string">&quot;小明&quot;</span>;
<span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(firstName + lastName); <span class="hljs-comment">// 王小明</span></code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<h3 id="樣板字串-template-literal">樣板字串 template literal</h3>
<p>如果我們在字串中想要加入好幾個變數，那我們得一直 <code>+</code> <code>+</code> <code>+</code> <code>+</code> <code>+</code>程式碼看起來就很亂。這時我們其實可以用一個特殊的語法，寫在反引號 <code>`</code>裡面來插入變數。</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div><div class="ln">3</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-js hljs" data-lang="js"><span class="hljs-keyword">const</span> name = <span class="hljs-string">&quot;小明&quot;</span>;
<span class="hljs-keyword">const</span> age = <span class="hljs-number">18</span>;
<span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(<span class="hljs-string">`我是 <span class="hljs-subst">${name}</span>，今年 <span class="hljs-subst">${age}</span> 歲`</span>);</code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<h3 id="比較運算子">比較運算子</h3>
<p>接下來是一些比大小。</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div><div class="ln">3</div><div class="ln">4</div><div class="ln">5</div><div class="ln">6</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-js hljs" data-lang="js"><span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(<span class="hljs-number">5</span> &gt; <span class="hljs-number">3</span>); <span class="hljs-comment">// true</span>
<span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(<span class="hljs-number">5</span> &lt; <span class="hljs-number">3</span>); <span class="hljs-comment">// false</span>
<span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(<span class="hljs-number">5</span> &gt;= <span class="hljs-number">5</span>); <span class="hljs-comment">// true</span>
<span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(<span class="hljs-number">5</span> &lt;= <span class="hljs-number">4</span>); <span class="hljs-comment">// false</span>
<span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(<span class="hljs-number">5</span> == <span class="hljs-string">&quot;5&quot;</span>); <span class="hljs-comment">// true</span>
<span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(<span class="hljs-number">5</span> === <span class="hljs-string">&quot;5&quot;</span>); <span class="hljs-comment">// false</span></code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  <input type="checkbox" class="code-toggle" id="code-toggle-244">
        <label for="code-toggle-244" class="code-toggle-label"></label>
</div>
<h4 id="-與-"><code>==</code> 與 <code>===</code></h4>
<p>你覺得 6 和 &quot;6&quot; 是一樣的嗎？在 JavaScript 裡面，<code>==</code> 會偷偷幫你轉型，所以 <code>6 == &quot;6&quot;</code> 是 <code>true</code>。但是 <code>===</code> 就不會轉型了，所以 <code>6 === &quot;6&quot;</code> 是 <code>false</code>。</p>
<ul>
<li><code>==</code>：只比值，會偷偷轉型</li>
<li><code>===</code>：連型別都一起比</li>
</ul>
<p><code>==</code> 在 JS 裡面有一些神奇的規則如：</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div><div class="ln">3</div><div class="ln">4</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-js hljs" data-lang="js"><span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(<span class="hljs-number">0</span> == <span class="hljs-literal">false</span>); <span class="hljs-comment">// true</span>
<span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(<span class="hljs-string">&quot;&quot;</span> == <span class="hljs-literal">false</span>); <span class="hljs-comment">// true</span>
<span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(<span class="hljs-literal">null</span> == <span class="hljs-literal">undefined</span>); <span class="hljs-comment">// true</span>
<span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>([] == <span class="hljs-literal">false</span>); <span class="hljs-comment">// true</span></code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<p>還有更多更可怕的，因此建議<strong>優先使用嚴格的 <code>===</code></strong>。</p>
<h3 id="邏輯運算子">邏輯運算子</h3>
<h4 id="-且"><code>&amp;&amp;</code> 且</h4>
<p>兩個都要成立。</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div><div class="ln">3</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-js hljs" data-lang="js"><span class="hljs-keyword">const</span> hasTicket = <span class="hljs-literal">true</span>;
<span class="hljs-keyword">const</span> hasId = <span class="hljs-literal">true</span>;
<span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(hasTicket &amp;&amp; hasId); <span class="hljs-comment">// true</span></code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<h4 id="-或"><code>||</code> 或</h4>
<p>兩個有一個成立就好。</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div><div class="ln">3</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-js hljs" data-lang="js"><span class="hljs-keyword">const</span> isWeekend = <span class="hljs-literal">false</span>;
<span class="hljs-keyword">const</span> isHoliday = <span class="hljs-literal">true</span>;
<span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(isWeekend || isHoliday); <span class="hljs-comment">// true</span></code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<h4 id="-反轉"><code>!</code> 反轉</h4>
<p>本來是 <code>true</code> 就變 <code>false</code>，本來是 <code>false</code> 就變 <code>true</code>。</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-js hljs" data-lang="js"><span class="hljs-keyword">const</span> isOpen = <span class="hljs-literal">true</span>;
<span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(!isOpen); <span class="hljs-comment">// false</span></code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<h2 id="條件判斷">條件判斷</h2>
<p>生活中充滿了條件。例如如果你有 18 歲以上就可以進入一些成人場所，比如說交大圖書館。</p>
<h3 id="if"><code>if</code></h3>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div><div class="ln">3</div><div class="ln">4</div><div class="ln">5</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-js hljs" data-lang="js"><span class="hljs-keyword">const</span> age = <span class="hljs-number">20</span>;

<span class="hljs-keyword">if</span> (age &gt;= <span class="hljs-number">18</span>) {
	<span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(<span class="hljs-string">&quot;你已成年，歡迎進入圖書館&quot;</span>);
}</code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<h3 id="ifelse"><code>if...else</code></h3>
<p>那麼如果你沒有 18 歲呢？我們可以加一個 <code>else</code> 來處理不符合條件的情況。</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div><div class="ln">3</div><div class="ln">4</div><div class="ln">5</div><div class="ln">6</div><div class="ln">7</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-js hljs" data-lang="js"><span class="hljs-keyword">const</span> age = <span class="hljs-number">16</span>;

<span class="hljs-keyword">if</span> (age &gt;= <span class="hljs-number">18</span>) {
	<span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(<span class="hljs-string">&quot;你已成年，歡迎進入圖書館&quot;</span>);
} <span class="hljs-keyword">else</span> {
	<span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(<span class="hljs-string">&quot;未成年請回家寫作業&quot;</span>);
}</code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  <input type="checkbox" class="code-toggle" id="code-toggle-320">
        <label for="code-toggle-320" class="code-toggle-label"></label>
</div>
<h3 id="ifelse-ifelse"><code>if...else if...else</code></h3>
<p>我們可以添加很多不同的條件，如果一個不成立就去看下一個。比如說我們想把你的成績換算成等第：</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div><div class="ln">3</div><div class="ln">4</div><div class="ln">5</div><div class="ln">6</div><div class="ln">7</div><div class="ln">8</div><div class="ln">9</div><div class="ln">10</div><div class="ln">11</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-js hljs" data-lang="js"><span class="hljs-keyword">const</span> score = <span class="hljs-number">85</span>;

<span class="hljs-keyword">if</span> (score &gt;= <span class="hljs-number">90</span>) {
	<span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(<span class="hljs-string">&quot;A&quot;</span>);
} <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> (score &gt;= <span class="hljs-number">80</span>) {
	<span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(<span class="hljs-string">&quot;B&quot;</span>);
} <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> (score &gt;= <span class="hljs-number">60</span>) {
	<span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(<span class="hljs-string">&quot;C&quot;</span>);
} <span class="hljs-keyword">else</span> {
	<span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(<span class="hljs-string">&quot;再加油&quot;</span>);
}</code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  <input type="checkbox" class="code-toggle" id="code-toggle-334">
        <label for="code-toggle-334" class="code-toggle-label"></label>
</div>
<h3 id="switch"><code>switch</code></h3>
<p>當你要比很多固定值時，<code>switch</code> 有時候可讀性不錯。</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div><div class="ln">3</div><div class="ln">4</div><div class="ln">5</div><div class="ln">6</div><div class="ln">7</div><div class="ln">8</div><div class="ln">9</div><div class="ln">10</div><div class="ln">11</div><div class="ln">12</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-js hljs" data-lang="js"><span class="hljs-keyword">const</span> role = <span class="hljs-string">&quot;admin&quot;</span>;

<span class="hljs-keyword">switch</span> (role) {
	<span class="hljs-keyword">case</span> <span class="hljs-string">&quot;admin&quot;</span>:
		<span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(<span class="hljs-string">&quot;管理員&quot;</span>);
		<span class="hljs-keyword">break</span>;
	<span class="hljs-keyword">case</span> <span class="hljs-string">&quot;editor&quot;</span>:
		<span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(<span class="hljs-string">&quot;編輯者&quot;</span>);
		<span class="hljs-keyword">break</span>;
	<span class="hljs-attr">default</span>:
		<span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(<span class="hljs-string">&quot;一般使用者&quot;</span>);
}</code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  <input type="checkbox" class="code-toggle" id="code-toggle-352">
        <label for="code-toggle-352" class="code-toggle-label"></label>
</div>
<blockquote>
<p>平常建議<strong>先用 <code>if...else</code>，熟悉了再看 <code>switch</code>。</strong> 因為 <code>switch</code> 的語法比較冗長，初學時可能會覺得很麻煩。</p>
</blockquote>
<p>break 是為了讓程式跳出 switch，不然他會繼續往下執行，這也是很多新手第一次看到 switch 會踩到的坑。</p>
<p>比如說如果你忘了寫 break：</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div><div class="ln">3</div><div class="ln">4</div><div class="ln">5</div><div class="ln">6</div><div class="ln">7</div><div class="ln">8</div><div class="ln">9</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-js hljs" data-lang="js"><span class="hljs-keyword">const</span> role = <span class="hljs-string">&quot;admin&quot;</span>;
<span class="hljs-keyword">switch</span> (role) {
	<span class="hljs-keyword">case</span> <span class="hljs-string">&quot;admin&quot;</span>:
		<span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(<span class="hljs-string">&quot;管理員&quot;</span>);
	<span class="hljs-keyword">case</span> <span class="hljs-string">&quot;editor&quot;</span>:
		<span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(<span class="hljs-string">&quot;編輯者&quot;</span>);
	<span class="hljs-attr">default</span>:
		<span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(<span class="hljs-string">&quot;一般使用者&quot;</span>);
}</code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  <input type="checkbox" class="code-toggle" id="code-toggle-373">
        <label for="code-toggle-373" class="code-toggle-label"></label>
</div>
<p>輸出會是：</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div><div class="ln">3</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class=" hljs" data-lang="code">管理員
編輯者
一般使用者</code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<div class="notice">
<h2 id="小練習-1：條件判斷">小練習 1：條件判斷</h2>
<p>請寫一段程式：</p>
<ul>
<li>如果分數 &gt;= 90，顯示 <code>優秀</code></li>
<li>如果分數 &gt;= 60，顯示 <code>及格</code></li>
<li>否則顯示 <code>不及格</code></li>
</ul>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-js hljs" data-lang="js"><span class="hljs-keyword">const</span> score = <span class="hljs-number">75</span>;</code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<p>先自己試試看，不要馬上偷看答案。</p>
</div>
<h2 id="迴圈">迴圈</h2>
<p>當你有重複的事情要做，你會需要把同樣的程式碼寫很多次。</p>
<p>例如說你想印出 0 到 4：</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div><div class="ln">3</div><div class="ln">4</div><div class="ln">5</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-js hljs" data-lang="js"><span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(<span class="hljs-number">0</span>);
<span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(<span class="hljs-number">1</span>);
<span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(<span class="hljs-number">2</span>);
<span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(<span class="hljs-number">3</span>);
<span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(<span class="hljs-number">4</span>);</code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<p>這樣非常的不優雅，這時我們就可以用迴圈來幫我們重複執行同一段程式碼。</p>
<h3 id="for"><code>for</code></h3>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div><div class="ln">3</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-js hljs" data-lang="js"><span class="hljs-keyword">for</span> (<span class="hljs-keyword">let</span> i = <span class="hljs-number">0</span>; i &lt; <span class="hljs-number">5</span>; i++) {
	<span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(i);
}</code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<p>輸出：</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div><div class="ln">3</div><div class="ln">4</div><div class="ln">5</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-js hljs" data-lang="js"><span class="hljs-number">0</span>;
<span class="hljs-number">1</span>;
<span class="hljs-number">2</span>;
<span class="hljs-number">3</span>;
<span class="hljs-number">4</span>;</code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<p>我們來拆解一下這個語法</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-js hljs" data-lang="js"><span class="hljs-keyword">for</span> (初始值; 條件; 每圈做什麼)</code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<ul>
<li><code>let i = 0</code>：一開始會先做的是，我們先定義了一個變數是 0</li>
<li><code>i &lt; 5</code>：只要還小於 5 就繼續重複下去</li>
<li><code>i++</code>：每次加 1</li>
</ul>
<p>所以你可以看到，當 <code>i</code> 是 0 的時候，條件 <code>i &lt; 5</code> 是成立的，所以就印出 0，然後 <code>i++</code> 變成 1。接著再檢查條件，1 &lt; 5 成立，就印出 1，然後 <code>i++</code> 變成 2。一直這樣重複下去直到 <code>i</code> 變成 5 的時候，條件 <code>i &lt; 5</code> 不成立了，就會跳出迴圈。</p>
<h3 id="while"><code>while</code></h3>
<p>While 的語法比較簡單，只有一個條件，當條件成立的時候就一直重複下去。</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div><div class="ln">3</div><div class="ln">4</div><div class="ln">5</div><div class="ln">6</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-js hljs" data-lang="js"><span class="hljs-keyword">let</span> count = <span class="hljs-number">0</span>;

<span class="hljs-keyword">while</span> (count &lt; <span class="hljs-number">3</span>) {
	<span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(count);
	count++;
}</code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  <input type="checkbox" class="code-toggle" id="code-toggle-463">
        <label for="code-toggle-463" class="code-toggle-label"></label>
</div>
<h3 id="break"><code>break</code></h3>
<p>我們可以設定一個條件，當滿足的時候就直接跳出迴圈，不再繼續執行。</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div><div class="ln">3</div><div class="ln">4</div><div class="ln">5</div><div class="ln">6</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-js hljs" data-lang="js"><span class="hljs-keyword">for</span> (<span class="hljs-keyword">let</span> i = <span class="hljs-number">0</span>; i &lt; <span class="hljs-number">10</span>; i++) {
	<span class="hljs-keyword">if</span> (i === <span class="hljs-number">5</span>) {
		<span class="hljs-keyword">break</span>;
	}
	<span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(i);
}</code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  <input type="checkbox" class="code-toggle" id="code-toggle-476">
        <label for="code-toggle-476" class="code-toggle-label"></label>
</div>
<h3 id="continue"><code>continue</code></h3>
<p>在某些情況我們會想要立即停止本次迴圈，直接進入下一次迴圈。就像是你發現這次段考沒救了就不讀了，直接開始準備下一次。這時候就可以用 <code>continue</code>。</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div><div class="ln">3</div><div class="ln">4</div><div class="ln">5</div><div class="ln">6</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-js hljs" data-lang="js"><span class="hljs-keyword">for</span> (<span class="hljs-keyword">let</span> i = <span class="hljs-number">0</span>; i &lt; <span class="hljs-number">5</span>; i++) {
	<span class="hljs-keyword">if</span> (i === <span class="hljs-number">2</span>) {
		<span class="hljs-keyword">continue</span>;
	}
	<span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(i);
}</code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  <input type="checkbox" class="code-toggle" id="code-toggle-489">
        <label for="code-toggle-489" class="code-toggle-label"></label>
</div>
<h2 id="陣列-array">陣列 Array</h2>
<p>我們剛才提到陣列其實就是清單，只是工程師想要聽起來比較酷所以叫做陣列。</p>
<p>陣列就是一包有順序的資料。比如說根據 <a href="https://www.youtube.com/watch?v=wJnBTPUQS5A">Alan Walker 的 The Spectre</a>，我們直播，我們愛，我們躺下。</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-js hljs" data-lang="js"><span class="hljs-keyword">const</span> action = [<span class="hljs-string">&quot;live&quot;</span>, <span class="hljs-string">&quot;love&quot;</span>, <span class="hljs-string">&quot;lie&quot;</span>];</code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<h3 id="透過索引取值">透過索引取值</h3>
<p>這時候我們可以抓出我們要第一個動作還是第幾個動作。</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-js hljs" data-lang="js"><span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(action[<span class="hljs-number">0</span>]); <span class="hljs-comment">// live</span>
<span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(action[<span class="hljs-number">1</span>]); <span class="hljs-comment">// love</span></code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<p>索引從 <strong>0</strong> 開始，不是從 1。這是很多新手第一次會踩到的坑。</p>
<h3 id="修改陣列內容">修改陣列內容</h3>
<p>我們可以重新指定某個索引的值。你不再躺平了，你立起來了。</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div><div class="ln">3</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-js hljs" data-lang="js"><span class="hljs-keyword">const</span> action = [<span class="hljs-string">&quot;live&quot;</span>, <span class="hljs-string">&quot;love&quot;</span>, <span class="hljs-string">&quot;lie&quot;</span>];
action[<span class="hljs-number">2</span>] = <span class="hljs-string">&quot;stand&quot;</span>;
<span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(action); <span class="hljs-comment">// [&quot;live&quot;, &quot;love&quot;, &quot;stand&quot;]</span></code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<h3 id="常見屬性與方法">常見屬性與方法</h3>
<h4 id="length"><code>length</code></h4>
<p>我們可以抓出陣列裡面有幾個元素。</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-js hljs" data-lang="js"><span class="hljs-keyword">const</span> action = [<span class="hljs-string">&quot;live&quot;</span>, <span class="hljs-string">&quot;love&quot;</span>, <span class="hljs-string">&quot;lie&quot;</span>];
<span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(action.<span class="hljs-property">length</span>); <span class="hljs-comment">// 3</span></code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<h4 id="push"><code>push()</code></h4>
<p>加到最後面。比如說你解鎖了新技能可以坐下。</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div><div class="ln">3</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-js hljs" data-lang="js"><span class="hljs-keyword">const</span> action = [<span class="hljs-string">&quot;live&quot;</span>, <span class="hljs-string">&quot;love&quot;</span>, <span class="hljs-string">&quot;lie&quot;</span>];
action.<span class="hljs-title function_">push</span>(<span class="hljs-string">&quot;sit&quot;</span>);
<span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(action); <span class="hljs-comment">// [&quot;live&quot;, &quot;love&quot;, &quot;lie&quot;, &quot;sit&quot;]</span></code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<h4 id="pop"><code>pop()</code></h4>
<p>刪掉最後一個。比如說愛是會消失的對吧？</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div><div class="ln">3</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-js hljs" data-lang="js"><span class="hljs-keyword">const</span> action = [<span class="hljs-string">&quot;live&quot;</span>, <span class="hljs-string">&quot;lie&quot;</span>, <span class="hljs-string">&quot;love&quot;</span>];
action.<span class="hljs-title function_">pop</span>();
<span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(action); <span class="hljs-comment">// [&quot;live&quot;, &quot;lie&quot;]</span></code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<h4 id="shift"><code>shift()</code></h4>
<p>刪掉第一個。</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div><div class="ln">3</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-js hljs" data-lang="js"><span class="hljs-keyword">const</span> action = [<span class="hljs-string">&quot;live&quot;</span>, <span class="hljs-string">&quot;love&quot;</span>, <span class="hljs-string">&quot;lie&quot;</span>];
action.<span class="hljs-title function_">shift</span>();
<span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(action); <span class="hljs-comment">// [&quot;love&quot;, &quot;lie&quot;]</span></code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<h4 id="unshift"><code>unshift()</code></h4>
<p>加到最前面。</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div><div class="ln">3</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-js hljs" data-lang="js"><span class="hljs-keyword">const</span> action = [<span class="hljs-string">&quot;love&quot;</span>, <span class="hljs-string">&quot;lie&quot;</span>];
action.<span class="hljs-title function_">unshift</span>(<span class="hljs-string">&quot;live&quot;</span>);
<span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(action); <span class="hljs-comment">// [&quot;live&quot;, &quot;love&quot;, &quot;lie&quot;]</span></code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<h3 id="遍歷陣列">遍歷陣列</h3>
<p>架設我們想要把陣列裡面的每個東西都跑一次來一個個印出來：</p>
<h4 id="傳統-for">傳統 <code>for</code></h4>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div><div class="ln">3</div><div class="ln">4</div><div class="ln">5</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-js hljs" data-lang="js"><span class="hljs-keyword">const</span> fruits = [<span class="hljs-string">&quot;apple&quot;</span>, <span class="hljs-string">&quot;banana&quot;</span>, <span class="hljs-string">&quot;orange&quot;</span>];

<span class="hljs-keyword">for</span> (<span class="hljs-keyword">let</span> i = <span class="hljs-number">0</span>; i &lt; fruits.<span class="hljs-property">length</span>; i++) {
	<span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(fruits[i]);
}</code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<h4 id="forof"><code>for...of</code></h4>
<p>既然我們要做的事情很明確就是全部一個個拿出來，有更好的語法。</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div><div class="ln">3</div><div class="ln">4</div><div class="ln">5</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-js hljs" data-lang="js"><span class="hljs-keyword">const</span> fruits = [<span class="hljs-string">&quot;apple&quot;</span>, <span class="hljs-string">&quot;banana&quot;</span>, <span class="hljs-string">&quot;orange&quot;</span>];

<span class="hljs-keyword">for</span> (<span class="hljs-keyword">const</span> fruit <span class="hljs-keyword">of</span> fruits) {
	<span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(fruit);
}</code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<h4 id="foreach"><code>forEach()</code></h4>
<p>或是還有一種寫法，不過這就有點超出目前講到的範圍了：</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div><div class="ln">3</div><div class="ln">4</div><div class="ln">5</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-js hljs" data-lang="js"><span class="hljs-keyword">const</span> fruits = [<span class="hljs-string">&quot;apple&quot;</span>, <span class="hljs-string">&quot;banana&quot;</span>, <span class="hljs-string">&quot;orange&quot;</span>];

fruits.<span class="hljs-title function_">forEach</span>(<span class="hljs-keyword">function</span> (<span class="hljs-params">fruit</span>) {
	<span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(fruit);
});</code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<p>也可以寫成箭頭函式：</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div><div class="ln">3</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-js hljs" data-lang="js">fruits.<span class="hljs-title function_">forEach</span>(<span class="hljs-function"><span class="hljs-params">fruit</span> =&gt;</span> {
	<span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(fruit);
});</code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<div class="notice">
<h2 id="小練習-2：陣列">小練習 2：陣列</h2>
<p>給你下面的陣列：</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-js hljs" data-lang="js"><span class="hljs-keyword">const</span> numbers = [<span class="hljs-number">10</span>, <span class="hljs-number">20</span>, <span class="hljs-number">30</span>, <span class="hljs-number">40</span>];</code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<p>請完成：</p>
<ol>
<li>印出陣列長度</li>
<li>把 <code>50</code> 加到最後面</li>
<li>用迴圈把每個數字都印出來</li>
</ol>
</div>
<h2 id="物件-object">物件 Object</h2>
<p>物件可以把多個有關聯的資料包在一起。</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div><div class="ln">3</div><div class="ln">4</div><div class="ln">5</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-js hljs" data-lang="js"><span class="hljs-keyword">const</span> user = {
	<span class="hljs-attr">name</span>: <span class="hljs-string">&quot;小明&quot;</span>,
	<span class="hljs-attr">age</span>: <span class="hljs-number">18</span>,
	<span class="hljs-attr">isAdmin</span>: <span class="hljs-literal">false</span>
};</code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<h3 id="取值方式">取值方式</h3>
<p>那我們要怎麼存取裡面的資料呢？有兩種做法。</p>
<h4 id="點記法">點記法</h4>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-js hljs" data-lang="js"><span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(user.<span class="hljs-property">name</span>);
<span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(user.<span class="hljs-property">age</span>);</code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<h4 id="中括號記法">中括號記法</h4>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-js hljs" data-lang="js"><span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(user[<span class="hljs-string">&quot;name&quot;</span>]);</code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<h3 id="修改屬性">修改屬性</h3>
<p>我們也可以修改裡面的值。比如說小明長大了變成 20 歲了，然後他變成管理員了。</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-js hljs" data-lang="js">user.<span class="hljs-property">age</span> = <span class="hljs-number">20</span>;
user.<span class="hljs-property">isAdmin</span> = <span class="hljs-literal">true</span>;</code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<h3 id="新增屬性">新增屬性</h3>
<p>可以直接寫一個不存在的值沒關係。</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-js hljs" data-lang="js">user.<span class="hljs-property">email</span> = <span class="hljs-string">&quot;ming@example.com&quot;</span>;</code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<h3 id="物件裡也可以放陣列">物件裡也可以放陣列</h3>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div><div class="ln">3</div><div class="ln">4</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-js hljs" data-lang="js"><span class="hljs-keyword">const</span> student = {
	<span class="hljs-attr">name</span>: <span class="hljs-string">&quot;小美&quot;</span>,
	<span class="hljs-attr">scores</span>: [<span class="hljs-number">90</span>, <span class="hljs-number">80</span>, <span class="hljs-number">100</span>]
};</code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<h3 id="巢狀物件">巢狀物件</h3>
<p>我可以在物件裡面放一個物件。比如說小華住在台北，郵遞區號是 100。</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div><div class="ln">3</div><div class="ln">4</div><div class="ln">5</div><div class="ln">6</div><div class="ln">7</div><div class="ln">8</div><div class="ln">9</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-js hljs" data-lang="js"><span class="hljs-keyword">const</span> profile = {
	<span class="hljs-attr">name</span>: <span class="hljs-string">&quot;小華&quot;</span>,
	<span class="hljs-attr">address</span>: {
		<span class="hljs-attr">city</span>: <span class="hljs-string">&quot;Taipei&quot;</span>,
		<span class="hljs-attr">zip</span>: <span class="hljs-string">&quot;100&quot;</span>
	}
};

<span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(profile.<span class="hljs-property">address</span>.<span class="hljs-property">city</span>);</code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  <input type="checkbox" class="code-toggle" id="code-toggle-705">
        <label for="code-toggle-705" class="code-toggle-label"></label>
</div>
<p>你可以這樣無限包下去，但是包太多層你自己也可能會很亂搞不清楚。</p>
<h2 id="函式-function">函式 Function</h2>
<p>今天我們要來算圓形的面積，我們每次都需要帶一次一樣的公式：</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div><div class="ln">3</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-js hljs" data-lang="js"><span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(<span class="hljs-number">5</span> * <span class="hljs-number">5</span> * <span class="hljs-number">3.14</span>);
<span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(<span class="hljs-number">10</span> * <span class="hljs-number">10</span> * <span class="hljs-number">3.14</span>);
<span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(<span class="hljs-number">15</span> * <span class="hljs-number">15</span> * <span class="hljs-number">3.14</span>);</code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<p>首先是這樣我們一直在寫重複的 Code，再來是如果我的圓周率想換成 3.1415926 呢？這樣很麻煩很不優雅，這時我們可以把它包裝成一個函式，這樣以後要算圓面積的時候就可以直接叫它來幫我們算了。</p>
<p>函式就是「把一段會重複使用的程式包起來，之後可以叫它來做事」。</p>
<h3 id="為什麼需要函式？">為什麼需要函式？</h3>
<p>如果你有一段程式要重複寫很多次，函式可以幫你：</p>
<ul>
<li>減少重複程式碼</li>
<li>增加可讀性</li>
<li>增加可維護性</li>
</ul>
<h3 id="函式宣告">函式宣告</h3>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div><div class="ln">3</div><div class="ln">4</div><div class="ln">5</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-js hljs" data-lang="js"><span class="hljs-keyword">function</span> <span class="hljs-title function_">sayHello</span>(<span class="hljs-params"></span>) {
	<span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(<span class="hljs-string">&quot;Hello!&quot;</span>);
}

<span class="hljs-title function_">sayHello</span>();</code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<p>這樣我們每次 call <code>sayHello()</code> 的時候就會印出 &quot;Hello!&quot;。</p>
<h3 id="參數-parameter">參數 parameter</h3>
<p>我們也可以設定參數，就像是數學的函式一樣的寫法。</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div><div class="ln">3</div><div class="ln">4</div><div class="ln">5</div><div class="ln">6</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-js hljs" data-lang="js"><span class="hljs-keyword">function</span> <span class="hljs-title function_">greet</span>(<span class="hljs-params">name</span>) {
	<span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(<span class="hljs-string">`你好，<span class="hljs-subst">${name}</span>`</span>);
}

<span class="hljs-title function_">greet</span>(<span class="hljs-string">&quot;小明&quot;</span>);
<span class="hljs-title function_">greet</span>(<span class="hljs-string">&quot;小華&quot;</span>);</code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  <input type="checkbox" class="code-toggle" id="code-toggle-757">
        <label for="code-toggle-757" class="code-toggle-label"></label>
</div>
<p>這裡的 <code>name</code> 是參數。每次我們都可以根據需求修改。</p>
<h3 id="回傳值-return">回傳值 <code>return</code></h3>
<p>我們不只可以 call function 來做事，還可以請他算完之後把結果交回來給我們。</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div><div class="ln">3</div><div class="ln">4</div><div class="ln">5</div><div class="ln">6</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-js hljs" data-lang="js"><span class="hljs-keyword">function</span> <span class="hljs-title function_">add</span>(<span class="hljs-params">a, b</span>) {
	<span class="hljs-keyword">return</span> a + b;
}

<span class="hljs-keyword">const</span> result = <span class="hljs-title function_">add</span>(<span class="hljs-number">3</span>, <span class="hljs-number">5</span>);
<span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(result); <span class="hljs-comment">// 8</span></code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  <input type="checkbox" class="code-toggle" id="code-toggle-772">
        <label for="code-toggle-772" class="code-toggle-label"></label>
</div>
<p>你可以看到：</p>
<ul>
<li><code>console.log()</code>：只是印出來</li>
<li><code>return</code>：把結果交回去，讓外面可以繼續用</li>
</ul>
<h3 id="函式表達式">函式表達式</h3>
<p>這是另一種宣告函式的方式，會把函式當成一個值來處理。</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div><div class="ln">3</div><div class="ln">4</div><div class="ln">5</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-js hljs" data-lang="js"><span class="hljs-keyword">const</span> sayHi = <span class="hljs-keyword">function</span> (<span class="hljs-params"></span>) {
	<span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(<span class="hljs-string">&quot;Hi&quot;</span>);
};

<span class="hljs-title function_">sayHi</span>();</code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<h3 id="箭頭函式-arrow-function">箭頭函式 arrow function</h3>
<p>接下來是 ES6 以後比較新的寫法，叫做箭頭函式。它的語法更簡潔。</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div><div class="ln">3</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-js hljs" data-lang="js"><span class="hljs-keyword">const</span> <span class="hljs-title function_">multiply</span> = (<span class="hljs-params">a, b</span>) =&gt; {
	<span class="hljs-keyword">return</span> a * b;
};</code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<p>如果只有一行可以更短，大括號裡面如果只有一個東西可以省略，</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-js hljs" data-lang="js"><span class="hljs-keyword">const</span> <span class="hljs-title function_">multiply</span> = (<span class="hljs-params">a, b</span>) =&gt; <span class="hljs-keyword">return</span> a * b;</code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<p>return 也可以省略：</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-js hljs" data-lang="js"><span class="hljs-keyword">const</span> <span class="hljs-title function_">multiply</span> = (<span class="hljs-params">a, b</span>) =&gt; a * b;</code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<p>我很喜歡箭頭函式。除了可以更短以外他長得也很可愛 &gt;&lt;（</p>
<p>這裡再來幾個例子：</p>
<h3 id="沒有參數">沒有參數</h3>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div><div class="ln">3</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-js hljs" data-lang="js"><span class="hljs-keyword">const</span> <span class="hljs-title function_">welcome</span> = (<span class="hljs-params"></span>) =&gt; {
	<span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(<span class="hljs-string">&quot;歡迎光臨&quot;</span>);
};</code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<h3 id="一個參數時可省略括號">一個參數時可省略括號</h3>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-js hljs" data-lang="js"><span class="hljs-keyword">const</span> <span class="hljs-title function_">square</span> = x =&gt; x * x;</code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<div class="notice">
<h2 id="小練習-3：函式">小練習 3：函式</h2>
<p>請寫一個函式 <code>isEven(number)</code>：</p>
<ul>
<li>如果是偶數，回傳 <code>true</code></li>
<li>否則回傳 <code>false</code></li>
</ul>
<p>提示：可以用 <code>%</code> 來取餘數。</p>
</div>
<h2 id="作用域與-hoisting-基礎觀念">作用域與 hoisting 基礎觀念</h2>
<p>這裡比較抽象，先抓大方向就好。</p>
<h3 id="作用域-scope">作用域 scope</h3>
<p>作用域就是「變數活在哪個範圍」。</p>
<ul>
<li>全域變數：外面大部分地方都能用</li>
<li>區域變數：只有函式或區塊裡能用</li>
</ul>
<p>比如說這裡這段程式：</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div><div class="ln">3</div><div class="ln">4</div><div class="ln">5</div><div class="ln">6</div><div class="ln">7</div><div class="ln">8</div><div class="ln">9</div><div class="ln">10</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-js hljs" data-lang="js"><span class="hljs-keyword">const</span> globalName = <span class="hljs-string">&quot;全域變數&quot;</span>;

<span class="hljs-keyword">function</span> <span class="hljs-title function_">test</span>(<span class="hljs-params"></span>) {
	<span class="hljs-keyword">const</span> localName = <span class="hljs-string">&quot;區域變數&quot;</span>;
	<span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(globalName);
	<span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(localName);
}

<span class="hljs-title function_">test</span>();
<span class="hljs-comment">// console.log(localName) // 這行會錯</span></code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  <input type="checkbox" class="code-toggle" id="code-toggle-866">
        <label for="code-toggle-866" class="code-toggle-label"></label>
</div>
<p>之所以會錯是因為 <code>localName</code> 是在 <code>test</code> 函式裡面宣告的區域變數，只有在 <code>test</code> 裡面能用，外面是看不到的。<code>let</code> 與 <code>const</code> 有區塊作用域。</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div><div class="ln">3</div><div class="ln">4</div><div class="ln">5</div><div class="ln">6</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-js hljs" data-lang="js"><span class="hljs-keyword">if</span> (<span class="hljs-literal">true</span>) {
	<span class="hljs-keyword">const</span> message = <span class="hljs-string">&quot;Hello&quot;</span>;
	<span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(message); <span class="hljs-comment">// 這裡顯示沒問題！</span>
}

<span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(message); <span class="hljs-comment">// 但是這裡就會錯了</span></code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  <input type="checkbox" class="code-toggle" id="code-toggle-881">
        <label for="code-toggle-881" class="code-toggle-label"></label>
</div>
<p>因為 message 是在 if 區塊裡面宣告的區域變數，外面看不到。</p>
<h3 id="hoisting">hoisting</h3>
<p>JavaScript 在執行前，會先處理某些宣告。</p>
<h4 id="函式宣告通常可以先呼叫">函式宣告通常可以先呼叫</h4>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div><div class="ln">3</div><div class="ln">4</div><div class="ln">5</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-js hljs" data-lang="js"><span class="hljs-title function_">sayHello</span>();

<span class="hljs-keyword">function</span> <span class="hljs-title function_">sayHello</span>(<span class="hljs-params"></span>) {
	<span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(<span class="hljs-string">&quot;Hello&quot;</span>);
}</code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<h4 id="但-let-const-不要這樣玩">但 <code>let</code> / <code>const</code> 不要這樣玩</h4>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-js hljs" data-lang="js"><span class="hljs-comment">// console.log(a)</span>
<span class="hljs-keyword">let</span> a = <span class="hljs-number">10</span>;</code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<p>建議大家盡量<strong>先宣告，再使用。</strong> 不要跟 hoisting 硬碰硬。</p>
<h2 id="其他常見語法">其他常見語法</h2>
<h3 id="字串">字串</h3>
<h4 id="length-2"><code>length</code></h4>
<p>字串長度。</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-js hljs" data-lang="js"><span class="hljs-keyword">const</span> str = <span class="hljs-string">&quot;hello&quot;</span>;
<span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(str.<span class="hljs-property">length</span>); <span class="hljs-comment">// 5</span></code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<h4 id="touppercase"><code>toUpperCase()</code></h4>
<p>轉大寫。</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-js hljs" data-lang="js"><span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(<span class="hljs-string">&quot;hello&quot;</span>.<span class="hljs-title function_">toUpperCase</span>()); <span class="hljs-comment">// HELLO</span></code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<h4 id="includes"><code>includes()</code></h4>
<p>檢查字串裡面有沒有包含某個子字串。</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-js hljs" data-lang="js"><span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(<span class="hljs-string">&quot;javascript&quot;</span>.<span class="hljs-title function_">includes</span>(<span class="hljs-string">&quot;script&quot;</span>)); <span class="hljs-comment">// true</span></code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<h4 id="trim"><code>trim()</code></h4>
<p>去掉前後空白。</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-js hljs" data-lang="js"><span class="hljs-keyword">const</span> text = <span class="hljs-string">&quot;  hello  &quot;</span>;
<span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(text.<span class="hljs-title function_">trim</span>()); <span class="hljs-comment">// &quot;hello&quot;</span></code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<h3 id="陣列">陣列</h3>
<h4 id="map"><code>map()</code></h4>
<p>把每個元素轉換成新陣列。</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div><div class="ln">3</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-js hljs" data-lang="js"><span class="hljs-keyword">const</span> numbers = [<span class="hljs-number">1</span>, <span class="hljs-number">2</span>, <span class="hljs-number">3</span>];
<span class="hljs-keyword">const</span> doubled = numbers.<span class="hljs-title function_">map</span>(<span class="hljs-function"><span class="hljs-params">n</span> =&gt;</span> n * <span class="hljs-number">2</span>);
<span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(doubled); <span class="hljs-comment">// [2, 4, 6]</span></code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<h4 id="filter"><code>filter()</code></h4>
<p>篩選符合條件的元素。</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div><div class="ln">3</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-js hljs" data-lang="js"><span class="hljs-keyword">const</span> numbers = [<span class="hljs-number">1</span>, <span class="hljs-number">2</span>, <span class="hljs-number">3</span>, <span class="hljs-number">4</span>, <span class="hljs-number">5</span>];
<span class="hljs-keyword">const</span> bigNumbers = numbers.<span class="hljs-title function_">filter</span>(<span class="hljs-function"><span class="hljs-params">n</span> =&gt;</span> n &gt; <span class="hljs-number">3</span>);
<span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(bigNumbers); <span class="hljs-comment">// [4, 5]</span></code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<h4 id="find"><code>find()</code></h4>
<p>找到第一個符合條件的元素。</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div><div class="ln">3</div><div class="ln">4</div><div class="ln">5</div><div class="ln">6</div><div class="ln">7</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-js hljs" data-lang="js"><span class="hljs-keyword">const</span> users = [
	{ <span class="hljs-attr">name</span>: <span class="hljs-string">&quot;A&quot;</span>, <span class="hljs-attr">age</span>: <span class="hljs-number">15</span> },
	{ <span class="hljs-attr">name</span>: <span class="hljs-string">&quot;B&quot;</span>, <span class="hljs-attr">age</span>: <span class="hljs-number">20</span> }
];

<span class="hljs-keyword">const</span> adult = users.<span class="hljs-title function_">find</span>(<span class="hljs-function"><span class="hljs-params">user</span> =&gt;</span> user.<span class="hljs-property">age</span> &gt;= <span class="hljs-number">18</span>);
<span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(adult);</code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  <input type="checkbox" class="code-toggle" id="code-toggle-979">
        <label for="code-toggle-979" class="code-toggle-label"></label>
</div>
<blockquote>
<p>新手其實拿 <code>for</code>、<code>forEach</code>、<code>map</code>、<code>filter</code> 就很夠用囉！</p>
</blockquote>
<p>講了那麼多 JavaScript 的基本語法，接下來我們要來看看怎麼用 JavaScript 跟網頁互動，這也是 JavaScript 最重要的功能之一了。</p>
<h2 id="dom-是什麼？">DOM 是什麼？</h2>
<p>DOM 全名是 <strong>Document Object Model</strong>。</p>
<p>你可以把它理解成：</p>
<blockquote>
<p>瀏覽器把 HTML 解析後，變成一棵可以被 JavaScript 操作的樹。</p>
</blockquote>
<p>例如這段 HTML：</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div><div class="ln">3</div><div class="ln">4</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-html hljs" data-lang="html"><span class="hljs-tag">&lt;<span class="hljs-name">body</span>&gt;</span>
	<span class="hljs-tag">&lt;<span class="hljs-name">h1</span> <span class="hljs-attr">id</span>=<span class="hljs-string">&quot;title&quot;</span>&gt;</span>Hello<span class="hljs-tag">&lt;/<span class="hljs-name">h1</span>&gt;</span>
	<span class="hljs-tag">&lt;<span class="hljs-name">button</span> <span class="hljs-attr">id</span>=<span class="hljs-string">&quot;btn&quot;</span>&gt;</span>Click me<span class="hljs-tag">&lt;/<span class="hljs-name">button</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">body</span>&gt;</span></code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<p>JavaScript 可以透過 DOM：</p>
<ul>
<li>找到 <code>h1</code></li>
<li>修改文字</li>
<li>幫按鈕加點擊事件</li>
<li>新增或刪除元素</li>
</ul>
<p>這就是前端互動的核心之一。</p>
<h2 id="選取-dom-元素">選取 DOM 元素</h2>
<p>假設 HTML 長這樣：</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div><div class="ln">3</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-html hljs" data-lang="html"><span class="hljs-tag">&lt;<span class="hljs-name">h1</span> <span class="hljs-attr">id</span>=<span class="hljs-string">&quot;title&quot;</span>&gt;</span>JavaScript 好好玩<span class="hljs-tag">&lt;/<span class="hljs-name">h1</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">p</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;desc&quot;</span>&gt;</span>這是一段介紹文字<span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">button</span> <span class="hljs-attr">id</span>=<span class="hljs-string">&quot;changeBtn&quot;</span>&gt;</span>改文字<span class="hljs-tag">&lt;/<span class="hljs-name">button</span>&gt;</span></code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<h3 id="getelementbyid"><code>getElementById()</code></h3>
<p>我們可以用 <code>getElementById()</code> 來選取有特定 id 的元素。</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-js hljs" data-lang="js"><span class="hljs-keyword">const</span> title = <span class="hljs-variable language_">document</span>.<span class="hljs-title function_">getElementById</span>(<span class="hljs-string">&quot;title&quot;</span>);
<span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(title);</code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<h3 id="queryselector"><code>querySelector()</code></h3>
<p>會回傳第一個符合選擇器的元素。可以像是 CSS 一樣用 id、class、標籤名來選取。</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div><div class="ln">3</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-js hljs" data-lang="js"><span class="hljs-keyword">const</span> title = <span class="hljs-variable language_">document</span>.<span class="hljs-title function_">querySelector</span>(<span class="hljs-string">&quot;#title&quot;</span>);
<span class="hljs-keyword">const</span> desc = <span class="hljs-variable language_">document</span>.<span class="hljs-title function_">querySelector</span>(<span class="hljs-string">&quot;.desc&quot;</span>);
<span class="hljs-keyword">const</span> button = <span class="hljs-variable language_">document</span>.<span class="hljs-title function_">querySelector</span>(<span class="hljs-string">&quot;button&quot;</span>);</code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<h3 id="queryselectorall"><code>querySelectorAll()</code></h3>
<p>會回傳所有符合條件的元素。你會拿到一個類陣列的物件，裡面裝著所有符合條件的元素。</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-js hljs" data-lang="js"><span class="hljs-keyword">const</span> paragraphs = <span class="hljs-variable language_">document</span>.<span class="hljs-title function_">querySelectorAll</span>(<span class="hljs-string">&quot;p&quot;</span>);
<span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(paragraphs);</code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<p>可以搭配迴圈使用：</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div><div class="ln">3</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-js hljs" data-lang="js">paragraphs.<span class="hljs-title function_">forEach</span>(<span class="hljs-function"><span class="hljs-params">p</span> =&gt;</span> {
	<span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(p.<span class="hljs-property">textContent</span>);
});</code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<h2 id="修改-dom-內容與樣式">修改 DOM 內容與樣式</h2>
<p>既然選取了當然就可以讀寫裡面的內容：</p>
<h3 id="修改文字">修改文字</h3>
<h4 id="textcontent"><code>textContent</code></h4>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-js hljs" data-lang="js"><span class="hljs-keyword">const</span> title = <span class="hljs-variable language_">document</span>.<span class="hljs-title function_">querySelector</span>(<span class="hljs-string">&quot;#title&quot;</span>);
title.<span class="hljs-property">textContent</span> = <span class="hljs-string">&quot;標題被改掉了&quot;</span>;</code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<h3 id="修改-html">修改 HTML</h3>
<p>不只是可以改文字我們可以直接改整段 HTML：</p>
<h4 id="innerhtml"><code>innerHTML</code></h4>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-js hljs" data-lang="js"><span class="hljs-keyword">const</span> desc = <span class="hljs-variable language_">document</span>.<span class="hljs-title function_">querySelector</span>(<span class="hljs-string">&quot;.desc&quot;</span>);
desc.<span class="hljs-property">innerHTML</span> = <span class="hljs-string">&quot;&lt;strong&gt;這段變粗了&lt;/strong&gt;&quot;</span>;</code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<blockquote>
<p>注意：<code>innerHTML</code> 會把字串當 HTML 解析。使用時要小心，不要亂塞來路不明的內容。你可能會不小心執行到其他人的 JavaScript！（XSS 攻擊）。</p>
</blockquote>
<h3 id="修改樣式">修改樣式</h3>
<p>我們可以用 JavaScript 直接改變元素的 CSS 樣式：</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div><div class="ln">3</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-js hljs" data-lang="js"><span class="hljs-keyword">const</span> title = <span class="hljs-variable language_">document</span>.<span class="hljs-title function_">querySelector</span>(<span class="hljs-string">&quot;#title&quot;</span>);
title.<span class="hljs-property">style</span>.<span class="hljs-property">color</span> = <span class="hljs-string">&quot;red&quot;</span>;
title.<span class="hljs-property">style</span>.<span class="hljs-property">fontSize</span> = <span class="hljs-string">&quot;40px&quot;</span>;</code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<h3 id="修改-class">修改 class</h3>
<p>也可以添加以及刪除 HTML class：</p>
<h4 id="classlistadd"><code>classList.add()</code></h4>
<p>添加 class：</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-js hljs" data-lang="js">title.<span class="hljs-property">classList</span>.<span class="hljs-title function_">add</span>(<span class="hljs-string">&quot;active&quot;</span>);</code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<h4 id="classlistremove"><code>classList.remove()</code></h4>
<p>刪除 class：</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-js hljs" data-lang="js">title.<span class="hljs-property">classList</span>.<span class="hljs-title function_">remove</span>(<span class="hljs-string">&quot;active&quot;</span>);</code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<h4 id="classlisttoggle"><code>classList.toggle()</code></h4>
<p>切換 class（沒有的話添加，有的話拿掉）：</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-js hljs" data-lang="js">title.<span class="hljs-property">classList</span>.<span class="hljs-title function_">toggle</span>(<span class="hljs-string">&quot;active&quot;</span>);</code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<p>可以拿來做：</p>
<ul>
<li>開關選單</li>
<li>顯示/隱藏內容</li>
<li>切換深色模式 class</li>
</ul>
<div class="notice">
<h2 id="小練習-4：dom-基本操作">小練習 4：DOM 基本操作</h2>
<p>給你這段 HTML：</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-html hljs" data-lang="html"><span class="hljs-tag">&lt;<span class="hljs-name">h1</span> <span class="hljs-attr">id</span>=<span class="hljs-string">&quot;title&quot;</span>&gt;</span>原本標題<span class="hljs-tag">&lt;/<span class="hljs-name">h1</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">button</span> <span class="hljs-attr">id</span>=<span class="hljs-string">&quot;btn&quot;</span>&gt;</span>按我<span class="hljs-tag">&lt;/<span class="hljs-name">button</span>&gt;</span></code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<p>請寫 JavaScript：</p>
<ol>
<li>取得 <code>h1</code></li>
<li>把文字改成 <code>我被 JavaScript 改掉了</code></li>
<li>把字體顏色改成藍色</li>
</ol>
</div>
<h2 id="建立與刪除-dom-元素">建立與刪除 DOM 元素</h2>
<p>我們可以用 JavaScript 來建立新的元素，然後把它插入到畫面中。當然也可以刪除不需要的元素。</p>
<h3 id="建立元素">建立元素</h3>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-js hljs" data-lang="js"><span class="hljs-keyword">const</span> li = <span class="hljs-variable language_">document</span>.<span class="hljs-title function_">createElement</span>(<span class="hljs-string">&quot;li&quot;</span>);
li.<span class="hljs-property">textContent</span> = <span class="hljs-string">&quot;新的項目&quot;</span>;</code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<h3 id="插入到畫面中">插入到畫面中</h3>
<p>假設 HTML：</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-html hljs" data-lang="html"><span class="hljs-tag">&lt;<span class="hljs-name">ul</span> <span class="hljs-attr">id</span>=<span class="hljs-string">&quot;list&quot;</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">ul</span>&gt;</span></code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<p>JavaScript：</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div><div class="ln">3</div><div class="ln">4</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-js hljs" data-lang="js"><span class="hljs-keyword">const</span> list = <span class="hljs-variable language_">document</span>.<span class="hljs-title function_">querySelector</span>(<span class="hljs-string">&quot;#list&quot;</span>);
<span class="hljs-keyword">const</span> li = <span class="hljs-variable language_">document</span>.<span class="hljs-title function_">createElement</span>(<span class="hljs-string">&quot;li&quot;</span>);
li.<span class="hljs-property">textContent</span> = <span class="hljs-string">&quot;新的項目&quot;</span>;
list.<span class="hljs-title function_">appendChild</span>(li);</code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<p>這樣就會在 <code>ul</code> 裡面新增一個 <code>li</code>，內容是 &quot;新的項目&quot;。</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div><div class="ln">3</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-html hljs" data-lang="html"><span class="hljs-tag">&lt;<span class="hljs-name">ul</span> <span class="hljs-attr">id</span>=<span class="hljs-string">&quot;list&quot;</span>&gt;</span>
	<span class="hljs-tag">&lt;<span class="hljs-name">li</span>&gt;</span>新的項目<span class="hljs-tag">&lt;/<span class="hljs-name">li</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">ul</span>&gt;</span></code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<h3 id="刪除元素">刪除元素</h3>
<p>從 DOM（HTML）中刪除元素也很簡單，直接 call <code>remove()</code> 就好。</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-js hljs" data-lang="js">li.<span class="hljs-title function_">remove</span>();</code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<p>比如說這裡我們從陣列裡面把每個水過都建立成一個 <code>li</code>，然後插入到 <code>ul</code> 裡面：</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div><div class="ln">3</div><div class="ln">4</div><div class="ln">5</div><div class="ln">6</div><div class="ln">7</div><div class="ln">8</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-js hljs" data-lang="js"><span class="hljs-keyword">const</span> fruits = [<span class="hljs-string">&quot;apple&quot;</span>, <span class="hljs-string">&quot;banana&quot;</span>, <span class="hljs-string">&quot;orange&quot;</span>];
<span class="hljs-keyword">const</span> list = <span class="hljs-variable language_">document</span>.<span class="hljs-title function_">querySelector</span>(<span class="hljs-string">&quot;#list&quot;</span>);

fruits.<span class="hljs-title function_">forEach</span>(<span class="hljs-function"><span class="hljs-params">fruit</span> =&gt;</span> {
	<span class="hljs-keyword">const</span> li = <span class="hljs-variable language_">document</span>.<span class="hljs-title function_">createElement</span>(<span class="hljs-string">&quot;li&quot;</span>);
	li.<span class="hljs-property">textContent</span> = fruit;
	list.<span class="hljs-title function_">appendChild</span>(li);
});</code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  <input type="checkbox" class="code-toggle" id="code-toggle-1202">
        <label for="code-toggle-1202" class="code-toggle-label"></label>
</div>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div><div class="ln">3</div><div class="ln">4</div><div class="ln">5</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-html hljs" data-lang="html"><span class="hljs-tag">&lt;<span class="hljs-name">ul</span> <span class="hljs-attr">id</span>=<span class="hljs-string">&quot;list&quot;</span>&gt;</span>
	<span class="hljs-tag">&lt;<span class="hljs-name">li</span>&gt;</span>apple<span class="hljs-tag">&lt;/<span class="hljs-name">li</span>&gt;</span>
	<span class="hljs-tag">&lt;<span class="hljs-name">li</span>&gt;</span>banana<span class="hljs-tag">&lt;/<span class="hljs-name">li</span>&gt;</span>
	<span class="hljs-tag">&lt;<span class="hljs-name">li</span>&gt;</span>orange<span class="hljs-tag">&lt;/<span class="hljs-name">li</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">ul</span>&gt;</span></code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<h2 id="事件-event-與-event-listener">事件 Event 與 event listener</h2>
<p>終於來到讓網頁「活起來」的部分了。</p>
<h3 id="什麼是事件？">什麼是事件？</h3>
<p>事件就是使用者或瀏覽器發生的某個動作，例如：</p>
<ul>
<li>點擊 <code>click</code></li>
<li>輸入 <code>input</code></li>
<li>送出表單 <code>submit</code></li>
<li>滑鼠移入 <code>mouseenter</code></li>
<li>鍵盤按下 <code>keydown</code></li>
</ul>
<p>我們要能夠抓到這些事件就需要先註冊一個事件監聽器（event listener）在我們想要監聽的元素上。</p>
<h3 id="addeventlistener"><code>addEventListener()</code></h3>
<p>基本語法：</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div><div class="ln">3</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-js hljs" data-lang="js">element.<span class="hljs-title function_">addEventListener</span>(<span class="hljs-string">&quot;事件名稱&quot;</span>, <span class="hljs-keyword">function</span> (<span class="hljs-params"></span>) {
	<span class="hljs-comment">// 事件發生時要做的事</span>
});</code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<h3 id="點擊事件-click">點擊事件 <code>click</code></h3>
<h4 id="html-2">HTML</h4>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-html hljs" data-lang="html"><span class="hljs-tag">&lt;<span class="hljs-name">button</span> <span class="hljs-attr">id</span>=<span class="hljs-string">&quot;btn&quot;</span>&gt;</span>點我<span class="hljs-tag">&lt;/<span class="hljs-name">button</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">p</span> <span class="hljs-attr">id</span>=<span class="hljs-string">&quot;result&quot;</span>&gt;</span>還沒被點<span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span></code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<h4 id="javascript">JavaScript</h4>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div><div class="ln">3</div><div class="ln">4</div><div class="ln">5</div><div class="ln">6</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-js hljs" data-lang="js"><span class="hljs-keyword">const</span> btn = <span class="hljs-variable language_">document</span>.<span class="hljs-title function_">querySelector</span>(<span class="hljs-string">&quot;#btn&quot;</span>);
<span class="hljs-keyword">const</span> result = <span class="hljs-variable language_">document</span>.<span class="hljs-title function_">querySelector</span>(<span class="hljs-string">&quot;#result&quot;</span>);

btn.<span class="hljs-title function_">addEventListener</span>(<span class="hljs-string">&quot;click&quot;</span>, <span class="hljs-keyword">function</span> (<span class="hljs-params"></span>) {
	result.<span class="hljs-property">textContent</span> = <span class="hljs-string">&quot;按鈕被點了！&quot;</span>;
});</code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  <input type="checkbox" class="code-toggle" id="code-toggle-1258">
        <label for="code-toggle-1258" class="code-toggle-label"></label>
</div>
<h3 id="用箭頭函式寫">用箭頭函式寫</h3>
<p>你看使用箭頭函式寫起來是不是看起來更簡潔！</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div><div class="ln">3</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-js hljs" data-lang="js">btn.<span class="hljs-title function_">addEventListener</span>(<span class="hljs-string">&quot;click&quot;</span>, <span class="hljs-function">() =&gt;</span> {
	result.<span class="hljs-property">textContent</span> = <span class="hljs-string">&quot;按鈕被點了！&quot;</span>;
});</code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<h3 id="切換-class-的常見範例">切換 class 的常見範例</h3>
<p>比如說我們有一個盒子，點擊按鈕的時候切換它的 active class：</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div><div class="ln">3</div><div class="ln">4</div><div class="ln">5</div><div class="ln">6</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-js hljs" data-lang="js"><span class="hljs-keyword">const</span> button = <span class="hljs-variable language_">document</span>.<span class="hljs-title function_">querySelector</span>(<span class="hljs-string">&quot;#btn&quot;</span>);
<span class="hljs-keyword">const</span> box = <span class="hljs-variable language_">document</span>.<span class="hljs-title function_">querySelector</span>(<span class="hljs-string">&quot;#box&quot;</span>);

button.<span class="hljs-title function_">addEventListener</span>(<span class="hljs-string">&quot;click&quot;</span>, <span class="hljs-function">() =&gt;</span> {
	box.<span class="hljs-property">classList</span>.<span class="hljs-title function_">toggle</span>(<span class="hljs-string">&quot;active&quot;</span>);
});</code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  <input type="checkbox" class="code-toggle" id="code-toggle-1281">
        <label for="code-toggle-1281" class="code-toggle-label"></label>
</div>
<h2 id="事件物件-event">事件物件 event</h2>
<p>有時候我們不只想知道這件事情發生了，我們還想知道更多細節。比如說你知道有人點擊了，但是他點了哪裡呢？</p>
<p>很多事件 callback 會收到一個參數，通常叫 <code>event</code> 或 <code>e</code>。</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div><div class="ln">3</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-js hljs" data-lang="js">btn.<span class="hljs-title function_">addEventListener</span>(<span class="hljs-string">&quot;click&quot;</span>, <span class="hljs-function"><span class="hljs-params">event</span> =&gt;</span> {
	<span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(event);
});</code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<h3 id="eventtarget"><code>event.target</code></h3>
<p>代表觸發事件的元素。</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div><div class="ln">3</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-js hljs" data-lang="js">btn.<span class="hljs-title function_">addEventListener</span>(<span class="hljs-string">&quot;click&quot;</span>, <span class="hljs-function"><span class="hljs-params">event</span> =&gt;</span> {
	<span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(event.<span class="hljs-property">target</span>);
});</code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<p>如果你按的是按鈕，<code>event.target</code> 通常就是那顆按鈕。</p>
<h2 id="常見事件類型">常見事件類型</h2>
<h3 id="click"><code>click</code></h3>
<p>按一下。</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div><div class="ln">3</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-js hljs" data-lang="js">button.<span class="hljs-title function_">addEventListener</span>(<span class="hljs-string">&quot;click&quot;</span>, <span class="hljs-function">() =&gt;</span> {
	<span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(<span class="hljs-string">&quot;clicked&quot;</span>);
});</code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<h3 id="input"><code>input</code></h3>
<p>輸入框內容一變就觸發。</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div><div class="ln">3</div><div class="ln">4</div><div class="ln">5</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-js hljs" data-lang="js"><span class="hljs-keyword">const</span> input = <span class="hljs-variable language_">document</span>.<span class="hljs-title function_">querySelector</span>(<span class="hljs-string">&quot;#nameInput&quot;</span>);

input.<span class="hljs-title function_">addEventListener</span>(<span class="hljs-string">&quot;input&quot;</span>, <span class="hljs-function"><span class="hljs-params">e</span> =&gt;</span> {
	<span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(e.<span class="hljs-property">target</span>.<span class="hljs-property">value</span>);
});</code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<h3 id="change"><code>change</code></h3>
<p>通常在輸入完成、失焦，或選單值變動時觸發。</p>
<h3 id="submit"><code>submit</code></h3>
<p>表單送出時觸發。</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div><div class="ln">3</div><div class="ln">4</div><div class="ln">5</div><div class="ln">6</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-js hljs" data-lang="js"><span class="hljs-keyword">const</span> form = <span class="hljs-variable language_">document</span>.<span class="hljs-title function_">querySelector</span>(<span class="hljs-string">&quot;#myForm&quot;</span>);

form.<span class="hljs-title function_">addEventListener</span>(<span class="hljs-string">&quot;submit&quot;</span>, <span class="hljs-function"><span class="hljs-params">e</span> =&gt;</span> {
	e.<span class="hljs-title function_">preventDefault</span>();
	<span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(<span class="hljs-string">&quot;表單送出了，但我先擋住預設行為&quot;</span>);
});</code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  <input type="checkbox" class="code-toggle" id="code-toggle-1346">
        <label for="code-toggle-1346" class="code-toggle-label"></label>
</div>
<h3 id="keydown"><code>keydown</code></h3>
<p>鍵盤按下時。</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div><div class="ln">3</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-js hljs" data-lang="js"><span class="hljs-variable language_">document</span>.<span class="hljs-title function_">addEventListener</span>(<span class="hljs-string">&quot;keydown&quot;</span>, <span class="hljs-function"><span class="hljs-params">e</span> =&gt;</span> {
	<span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(e.<span class="hljs-property">key</span>);
});</code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<h2 id="preventdefault-是什麼？"><code>preventDefault()</code> 是什麼？</h2>
<p>有些 HTML 元素本來就有預設行為，例如：</p>
<ul>
<li>表單送出會重新整理頁面</li>
<li><code>&lt;a&gt;</code> 連結點了會跳頁</li>
</ul>
<p>如果你想先用 JavaScript 接管請他冷靜先別做事就可以用：</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-js hljs" data-lang="js">e.<span class="hljs-title function_">preventDefault</span>();</code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<p>例如表單驗證時很常用，你可以先阻止 HTML 送出表單：</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div><div class="ln">3</div><div class="ln">4</div><div class="ln">5</div><div class="ln">6</div><div class="ln">7</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-js hljs" data-lang="js">form.<span class="hljs-title function_">addEventListener</span>(<span class="hljs-string">&quot;submit&quot;</span>, <span class="hljs-function"><span class="hljs-params">e</span> =&gt;</span> {
	e.<span class="hljs-title function_">preventDefault</span>();

	<span class="hljs-keyword">if</span> (input.<span class="hljs-property">value</span> === <span class="hljs-string">&quot;&quot;</span>) {
		<span class="hljs-title function_">alert</span>(<span class="hljs-string">&quot;請輸入內容&quot;</span>);
	}
});</code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  <input type="checkbox" class="code-toggle" id="code-toggle-1380">
        <label for="code-toggle-1380" class="code-toggle-label"></label>
</div>
<div class="notice">
<h2 id="小練習-5：事件監聽">小練習 5：事件監聽</h2>
<p>HTML：</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-html hljs" data-lang="html"><span class="hljs-tag">&lt;<span class="hljs-name">button</span> <span class="hljs-attr">id</span>=<span class="hljs-string">&quot;btn&quot;</span>&gt;</span>按我<span class="hljs-tag">&lt;/<span class="hljs-name">button</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">p</span> <span class="hljs-attr">id</span>=<span class="hljs-string">&quot;text&quot;</span>&gt;</span>還沒改變<span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span></code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<p>請寫 JavaScript，讓使用者按下按鈕時：</p>
<ul>
<li><code>p</code> 的文字改成 <code>你按下按鈕了</code></li>
</ul>
</div>
<h2 id="取得-input-的值">取得 input 的值</h2>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div><div class="ln">3</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-html hljs" data-lang="html"><span class="hljs-tag">&lt;<span class="hljs-name">input</span> <span class="hljs-attr">id</span>=<span class="hljs-string">&quot;nameInput&quot;</span> <span class="hljs-attr">type</span>=<span class="hljs-string">&quot;text&quot;</span> /&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">button</span> <span class="hljs-attr">id</span>=<span class="hljs-string">&quot;showBtn&quot;</span>&gt;</span>顯示名字<span class="hljs-tag">&lt;/<span class="hljs-name">button</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">p</span> <span class="hljs-attr">id</span>=<span class="hljs-string">&quot;output&quot;</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span></code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div><div class="ln">3</div><div class="ln">4</div><div class="ln">5</div><div class="ln">6</div><div class="ln">7</div><div class="ln">8</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-js hljs" data-lang="js"><span class="hljs-keyword">const</span> nameInput = <span class="hljs-variable language_">document</span>.<span class="hljs-title function_">querySelector</span>(<span class="hljs-string">&quot;#nameInput&quot;</span>);
<span class="hljs-keyword">const</span> showBtn = <span class="hljs-variable language_">document</span>.<span class="hljs-title function_">querySelector</span>(<span class="hljs-string">&quot;#showBtn&quot;</span>);
<span class="hljs-keyword">const</span> output = <span class="hljs-variable language_">document</span>.<span class="hljs-title function_">querySelector</span>(<span class="hljs-string">&quot;#output&quot;</span>);

showBtn.<span class="hljs-title function_">addEventListener</span>(<span class="hljs-string">&quot;click&quot;</span>, <span class="hljs-function">() =&gt;</span> {
	<span class="hljs-keyword">const</span> name = nameInput.<span class="hljs-property">value</span>;
	output.<span class="hljs-property">textContent</span> = <span class="hljs-string">`你好，<span class="hljs-subst">${name}</span>`</span>;
});</code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  <input type="checkbox" class="code-toggle" id="code-toggle-1417">
        <label for="code-toggle-1417" class="code-toggle-label"></label>
</div>
<p>這裡我們用 <code>nameInput.value</code> 來取得使用者在 input 裡面輸入的內容。</p>
<p>我們甚至可以做一點簡單的驗證，看看使用者有沒有真的輸入東西：</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div><div class="ln">3</div><div class="ln">4</div><div class="ln">5</div><div class="ln">6</div><div class="ln">7</div><div class="ln">8</div><div class="ln">9</div><div class="ln">10</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-js hljs" data-lang="js">showBtn.<span class="hljs-title function_">addEventListener</span>(<span class="hljs-string">&quot;click&quot;</span>, <span class="hljs-function">() =&gt;</span> {
	<span class="hljs-keyword">const</span> name = nameInput.<span class="hljs-property">value</span>.<span class="hljs-title function_">trim</span>();

	<span class="hljs-keyword">if</span> (name === <span class="hljs-string">&quot;&quot;</span>) {
		output.<span class="hljs-property">textContent</span> = <span class="hljs-string">&quot;請先輸入名字&quot;</span>;
		<span class="hljs-keyword">return</span>;
	}

	output.<span class="hljs-property">textContent</span> = <span class="hljs-string">`你好，<span class="hljs-subst">${name}</span>`</span>;
});</code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  <input type="checkbox" class="code-toggle" id="code-toggle-1432">
        <label for="code-toggle-1432" class="code-toggle-label"></label>
</div>
<p>這裡的 <code>trim()</code> 很好用，因為有人會輸入一堆空白，然後看起來像有打字，其實沒有。</p>
<h2 id="小專案：待辦清單-mini-版">小專案：待辦清單 mini 版</h2>
<p>這裡我們把前面學的觀念組起來做一個小練習吧！</p>
<h3 id="功能">功能</h3>
<ul>
<li>輸入一段文字</li>
<li>點擊新增按鈕</li>
<li>把內容新增到清單中</li>
</ul>
<h3 id="html-3">HTML</h3>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div><div class="ln">3</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-html hljs" data-lang="html"><span class="hljs-tag">&lt;<span class="hljs-name">input</span> <span class="hljs-attr">id</span>=<span class="hljs-string">&quot;todoInput&quot;</span> <span class="hljs-attr">type</span>=<span class="hljs-string">&quot;text&quot;</span> <span class="hljs-attr">placeholder</span>=<span class="hljs-string">&quot;輸入待辦事項&quot;</span> /&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">button</span> <span class="hljs-attr">id</span>=<span class="hljs-string">&quot;addBtn&quot;</span>&gt;</span>新增<span class="hljs-tag">&lt;/<span class="hljs-name">button</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">ul</span> <span class="hljs-attr">id</span>=<span class="hljs-string">&quot;todoList&quot;</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">ul</span>&gt;</span></code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<h3 id="javascript-2">JavaScript</h3>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div><div class="ln">3</div><div class="ln">4</div><div class="ln">5</div><div class="ln">6</div><div class="ln">7</div><div class="ln">8</div><div class="ln">9</div><div class="ln">10</div><div class="ln">11</div><div class="ln">12</div><div class="ln">13</div><div class="ln">14</div><div class="ln">15</div><div class="ln">16</div><div class="ln">17</div><div class="ln">18</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-js hljs" data-lang="js"><span class="hljs-keyword">const</span> todoInput = <span class="hljs-variable language_">document</span>.<span class="hljs-title function_">querySelector</span>(<span class="hljs-string">&quot;#todoInput&quot;</span>);
<span class="hljs-keyword">const</span> addBtn = <span class="hljs-variable language_">document</span>.<span class="hljs-title function_">querySelector</span>(<span class="hljs-string">&quot;#addBtn&quot;</span>);
<span class="hljs-keyword">const</span> todoList = <span class="hljs-variable language_">document</span>.<span class="hljs-title function_">querySelector</span>(<span class="hljs-string">&quot;#todoList&quot;</span>);

addBtn.<span class="hljs-title function_">addEventListener</span>(<span class="hljs-string">&quot;click&quot;</span>, <span class="hljs-function">() =&gt;</span> {
	<span class="hljs-keyword">const</span> text = todoInput.<span class="hljs-property">value</span>.<span class="hljs-title function_">trim</span>();

	<span class="hljs-keyword">if</span> (text === <span class="hljs-string">&quot;&quot;</span>) {
		<span class="hljs-title function_">alert</span>(<span class="hljs-string">&quot;請輸入待辦事項&quot;</span>);
		<span class="hljs-keyword">return</span>;
	}

	<span class="hljs-keyword">const</span> li = <span class="hljs-variable language_">document</span>.<span class="hljs-title function_">createElement</span>(<span class="hljs-string">&quot;li&quot;</span>);
	li.<span class="hljs-property">textContent</span> = text;

	todoList.<span class="hljs-title function_">appendChild</span>(li);
	todoInput.<span class="hljs-property">value</span> = <span class="hljs-string">&quot;&quot;</span>;
});</code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  <input type="checkbox" class="code-toggle" id="code-toggle-1467">
        <label for="code-toggle-1467" class="code-toggle-label"></label>
</div>
<p>這裡我們：</p>
<ol>
<li>先抓到 input、button、ul</li>
<li>監聽按鈕 click</li>
<li>讀取 input 值</li>
<li>檢查是不是空字串</li>
<li>建立新的 <code>li</code></li>
<li>設定 <code>li</code> 文字</li>
<li>加進 <code>ul</code></li>
<li>清空輸入框</li>
</ol>
<p>你可以再繼續嘗試做：</p>
<ul>
<li>點擊項目就刪除</li>
<li>每個項目旁邊加刪除按鈕</li>
<li>按 Enter 也能新增</li>
<li>存到 localStorage</li>
</ul>
<h2 id="常見新手雷點整理">常見新手雷點整理</h2>
<h3 id="1-把-跟-搞混">1. 把 <code>=</code> 跟 <code>===</code> 搞混</h3>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div><div class="ln">3</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-js hljs" data-lang="js"><span class="hljs-keyword">if</span> (score === <span class="hljs-number">100</span>) {
	<span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(<span class="hljs-string">&quot;滿分&quot;</span>);
}</code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<p>要記得：</p>
<ul>
<li><code>=</code> 是賦值（把東西放進變數）</li>
<li><code>===</code> 才是比較喔！</li>
</ul>
<h3 id="2-忘記索引從-0-開始">2. 忘記索引從 0 開始</h3>
<p>記得陣列的第一個元素是 <code>arr[0]</code>，不是 <code>arr[1]</code>。</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-js hljs" data-lang="js"><span class="hljs-keyword">const</span> arr = [<span class="hljs-string">&quot;a&quot;</span>, <span class="hljs-string">&quot;b&quot;</span>, <span class="hljs-string">&quot;c&quot;</span>];
<span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(arr[<span class="hljs-number">0</span>]); <span class="hljs-comment">// a</span></code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<h3 id="3-const-不能重新賦值">3. <code>const</code> 不能重新賦值</h3>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-js hljs" data-lang="js"><span class="hljs-keyword">const</span> name = <span class="hljs-string">&quot;A&quot;</span>;
<span class="hljs-comment">// name = &quot;B&quot; // 錯誤</span></code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<h3 id="4-dom-還沒載入就先抓元素">4. DOM 還沒載入就先抓元素</h3>
<p>如果你的 script 放太前面（如 <code>&lt;script&gt;</code> 放在 <code>&lt;head&gt;</code> 裡），元素可能還沒出現。</p>
<p>比較安全的方式把 script 放在 <code>&lt;/body&gt;</code> 前面：</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div><div class="ln">3</div><div class="ln">4</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-html hljs" data-lang="html"><span class="hljs-tag">&lt;<span class="hljs-name">body</span>&gt;</span>
	<span class="hljs-tag">&lt;<span class="hljs-name">h1</span>&gt;</span>Hello<span class="hljs-tag">&lt;/<span class="hljs-name">h1</span>&gt;</span>
	<span class="hljs-tag">&lt;<span class="hljs-name">script</span> <span class="hljs-attr">src</span>=<span class="hljs-string">&quot;main.js&quot;</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">script</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">body</span>&gt;</span></code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<h3 id="5-忘記事件監聽要傳函式">5. 忘記事件監聽要傳函式</h3>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-js hljs" data-lang="js">btn.<span class="hljs-title function_">addEventListener</span>(<span class="hljs-string">&quot;click&quot;</span>, <span class="hljs-title function_">changeText</span>());</code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<p>因為 <code>changeText()</code> 這行就是在執行了，這概念是你要給你的隊友手槍結果你直接朝他開了一槍。</p>
<p>正確使用方式是：</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-js hljs" data-lang="js">btn.<span class="hljs-title function_">addEventListener</span>(<span class="hljs-string">&quot;click&quot;</span>, changeText);</code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<p>或：</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div><div class="ln">3</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-js hljs" data-lang="js">btn.<span class="hljs-title function_">addEventListener</span>(<span class="hljs-string">&quot;click&quot;</span>, <span class="hljs-function">() =&gt;</span> {
	<span class="hljs-title function_">changeText</span>();
});</code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<h3 id="6-innerhtml-用太爽">6. <code>innerHTML</code> 用太爽</h3>
<p>雖然方便，但也比較危險，你可能會不小心把使用者給的文字當成 HTML 插進去把你的網站弄壞。純文字優先考慮 <code>textContent</code>。</p>
<h2 id="總結">總結</h2>
<p>如果你第一次接觸程式語言，有許多的新觀念需要同時吸收，可能會覺得有點混亂。這是完全正常的。你只要少用 AI，試著多寫幾次，慢慢地你就會開始有感覺了喔！</p>
<p>而如果你是已經會其他程式語言了，JavaScript 的語法其實不難，重點是要熟悉它的 DOM API，這樣你就可以開始做一些有趣的互動了。</p>
<h2 id="練習題解答區">練習題解答區</h2>
<h3 id="練習-1-解答：條件判斷">練習 1 解答：條件判斷</h3>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div><div class="ln">3</div><div class="ln">4</div><div class="ln">5</div><div class="ln">6</div><div class="ln">7</div><div class="ln">8</div><div class="ln">9</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-js hljs" data-lang="js"><span class="hljs-keyword">const</span> score = <span class="hljs-number">75</span>;

<span class="hljs-keyword">if</span> (score &gt;= <span class="hljs-number">90</span>) {
	<span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(<span class="hljs-string">&quot;優秀&quot;</span>);
} <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> (score &gt;= <span class="hljs-number">60</span>) {
	<span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(<span class="hljs-string">&quot;及格&quot;</span>);
} <span class="hljs-keyword">else</span> {
	<span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(<span class="hljs-string">&quot;不及格&quot;</span>);
}</code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  <input type="checkbox" class="code-toggle" id="code-toggle-1586">
        <label for="code-toggle-1586" class="code-toggle-label"></label>
</div>
<h3 id="練習-2-解答：陣列">練習 2 解答：陣列</h3>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div><div class="ln">3</div><div class="ln">4</div><div class="ln">5</div><div class="ln">6</div><div class="ln">7</div><div class="ln">8</div><div class="ln">9</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-js hljs" data-lang="js"><span class="hljs-keyword">const</span> numbers = [<span class="hljs-number">10</span>, <span class="hljs-number">20</span>, <span class="hljs-number">30</span>, <span class="hljs-number">40</span>];

<span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(numbers.<span class="hljs-property">length</span>);

numbers.<span class="hljs-title function_">push</span>(<span class="hljs-number">50</span>);

<span class="hljs-keyword">for</span> (<span class="hljs-keyword">let</span> i = <span class="hljs-number">0</span>; i &lt; numbers.<span class="hljs-property">length</span>; i++) {
	<span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(numbers[i]);
}</code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  <input type="checkbox" class="code-toggle" id="code-toggle-1600">
        <label for="code-toggle-1600" class="code-toggle-label"></label>
</div>
<p>也可以這樣寫：</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div><div class="ln">3</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-js hljs" data-lang="js">numbers.<span class="hljs-title function_">forEach</span>(<span class="hljs-function"><span class="hljs-params">number</span> =&gt;</span> {
	<span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(number);
});</code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<h3 id="練習-3-解答：函式">練習 3 解答：函式</h3>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div><div class="ln">3</div><div class="ln">4</div><div class="ln">5</div><div class="ln">6</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-js hljs" data-lang="js"><span class="hljs-keyword">function</span> <span class="hljs-title function_">isEven</span>(<span class="hljs-params">number</span>) {
	<span class="hljs-keyword">return</span> number % <span class="hljs-number">2</span> === <span class="hljs-number">0</span>;
}

<span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(<span class="hljs-title function_">isEven</span>(<span class="hljs-number">4</span>)); <span class="hljs-comment">// true</span>
<span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(<span class="hljs-title function_">isEven</span>(<span class="hljs-number">5</span>)); <span class="hljs-comment">// false</span></code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  <input type="checkbox" class="code-toggle" id="code-toggle-1622">
        <label for="code-toggle-1622" class="code-toggle-label"></label>
</div>
<p>箭頭函式版本：</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-js hljs" data-lang="js"><span class="hljs-keyword">const</span> <span class="hljs-title function_">isEven</span> = number =&gt; number % <span class="hljs-number">2</span> === <span class="hljs-number">0</span>;</code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<h3 id="練習-4-解答：dom-基本操作">練習 4 解答：DOM 基本操作</h3>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div><div class="ln">3</div><div class="ln">4</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-js hljs" data-lang="js"><span class="hljs-keyword">const</span> title = <span class="hljs-variable language_">document</span>.<span class="hljs-title function_">querySelector</span>(<span class="hljs-string">&quot;#title&quot;</span>);

title.<span class="hljs-property">textContent</span> = <span class="hljs-string">&quot;我被 JavaScript 改掉了&quot;</span>;
title.<span class="hljs-property">style</span>.<span class="hljs-property">color</span> = <span class="hljs-string">&quot;blue&quot;</span>;</code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<h3 id="練習-5-解答：事件監聽">練習 5 解答：事件監聽</h3>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div><div class="ln">3</div><div class="ln">4</div><div class="ln">5</div><div class="ln">6</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-js hljs" data-lang="js"><span class="hljs-keyword">const</span> btn = <span class="hljs-variable language_">document</span>.<span class="hljs-title function_">querySelector</span>(<span class="hljs-string">&quot;#btn&quot;</span>);
<span class="hljs-keyword">const</span> text = <span class="hljs-variable language_">document</span>.<span class="hljs-title function_">querySelector</span>(<span class="hljs-string">&quot;#text&quot;</span>);

btn.<span class="hljs-title function_">addEventListener</span>(<span class="hljs-string">&quot;click&quot;</span>, <span class="hljs-function">() =&gt;</span> {
	text.<span class="hljs-property">textContent</span> = <span class="hljs-string">&quot;你按下按鈕了&quot;</span>;
});</code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  <input type="checkbox" class="code-toggle" id="code-toggle-1648">
        <label for="code-toggle-1648" class="code-toggle-label"></label>
</div>
]]></content:encoded>
    </item>
<item>
      <title>CSS 教學：從入門到精通</title>
      <link>https://emtech.cc/p/css</link>
      <description>CSS 是用來裝飾網頁的語言，學會 CSS 你就能把網頁變得好看又好用。這篇文章會帶你快速入門 CSS，從基本的語法到一些常見的屬性，讓你能夠輕鬆上手。</description>
      <pubDate>Mon, 30 Mar 2026 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/css</guid>
      <media:thumbnail url="https://emtech.cc/static/css/thumbnail.webp" />
      <category>程式教學</category>
     <content:encoded><![CDATA[<img src="/static/css/thumbnail.webp" />
<p>上次我們談到了網頁的基本原理，以及怎麼寫 HTML。我們說到一個網頁通常是由 HTML、CSS 和 JavaScript 所組成。HTML 是骨架、CSS 是用來裝飾、而 JavaScript 可以讓他動起來。而今天我們就要來談談 CSS。</p>
<h2 id="環境建設">環境建設</h2>
<p>首先你可以使用 VS Code 打開上禮拜的資料夾，或是創建一個新的。</p>
<blockquote>
<p>macOS 快捷鍵：<code>Ctrl</code> + <code>O</code> Windows: <code>Ctrl+K</code> 然後按 <code>Ctrl+O</code></p>
</blockquote>
<p>
        <figure>
            <img src="/static/css/vscode-open-folder.webp" alt="開啟資料夾" title="" width="1512" height="982">
            <figcaption>開啟資料夾</figcaption>
        </figure>
    </p>
<p>一樣創一個 HTML 檔，然後點擊 <code>!</code>、<code>Tab</code> 。</p>
<p>
        <figure>
            <img src="/static/css/vscode-create-html-file.webp" alt="創建 HTML 檔" title="" width="907" height="569">
            <figcaption>創建 HTML 檔</figcaption>
        </figure>
    </p>
<p>請你先創建一個 <code>&lt;h1&gt;</code> 標題，並建立一個元素叫做 <code>&lt;style&gt;</code></p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div><div class="ln">3</div><div class="ln">4</div><div class="ln">5</div><div class="ln">6</div><div class="ln">7</div><div class="ln">8</div><div class="ln">9</div><div class="ln">10</div><div class="ln">11</div><div class="ln">12</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-html hljs" data-lang="html"><span class="hljs-meta">&lt;!doctype <span class="hljs-keyword">html</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">html</span> <span class="hljs-attr">lang</span>=<span class="hljs-string">&quot;en&quot;</span>&gt;</span>
	<span class="hljs-tag">&lt;<span class="hljs-name">head</span>&gt;</span>
		<span class="hljs-tag">&lt;<span class="hljs-name">meta</span> <span class="hljs-attr">charset</span>=<span class="hljs-string">&quot;UTF-8&quot;</span> /&gt;</span>
		<span class="hljs-tag">&lt;<span class="hljs-name">meta</span> <span class="hljs-attr">name</span>=<span class="hljs-string">&quot;viewport&quot;</span> <span class="hljs-attr">content</span>=<span class="hljs-string">&quot;width=device-width, initial-scale=1.0&quot;</span> /&gt;</span>
		<span class="hljs-tag">&lt;<span class="hljs-name">title</span>&gt;</span>Document<span class="hljs-tag">&lt;/<span class="hljs-name">title</span>&gt;</span>
	<span class="hljs-tag">&lt;/<span class="hljs-name">head</span>&gt;</span>
	<span class="hljs-tag">&lt;<span class="hljs-name">body</span>&gt;</span>
		<span class="hljs-tag">&lt;<span class="hljs-name">h1</span>&gt;</span>我是標題<span class="hljs-tag">&lt;/<span class="hljs-name">h1</span>&gt;</span>
		<span class="hljs-tag">&lt;<span class="hljs-name">style</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">style</span>&gt;</span>
	<span class="hljs-tag">&lt;/<span class="hljs-name">body</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">html</span>&gt;</span></code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  <input type="checkbox" class="code-toggle" id="code-toggle-19">
        <label for="code-toggle-19" class="code-toggle-label"></label>
</div>
<p>等一下我們的 CSS 就寫在 <code>&lt;style&gt;</code> 之間。準備好了嗎？點擊右下角的 Go Live 來開啟瀏覽器開始寫 CSS 吧！</p>
<div class="notice">
<h3 id="小提示">小提示</h3>
<p>建議你可以把 VS Code 放螢幕左側（ <code>Windows</code> + <code>←</code> / Mac: <code>🌐</code> + <code>⌃</code> + <code>←</code> )，瀏覽器放右邊</p>
<p>
        <figure>
            <img src="/static/css/vscode-browser-layout.webp" alt="VS Code 和瀏覽器的配置" title="" width="3600" height="2338">
            <figcaption>VS Code 和瀏覽器的配置</figcaption>
        </figure>
    </p>
</div>
<h2 id="簡單的-css">簡單的 CSS</h2>
<p>如果你想讓這個標題變成藍色的話你可以這樣打 CSS：</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div><div class="ln">3</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-css hljs" data-lang="css"><span class="hljs-selector-tag">h1</span> {
	<span class="hljs-attribute">color</span>: blue;
}</code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<p>這樣就可以了，你可以試試看改成其他顏色，例如紅色、綠色、黃色等等。或是你把滑鼠放上去你會發現你可以直接選顏色。</p>
<p>我們來看一下 CSS 的結構。h1 是選擇器，代表我們要選擇要改的元素，而 color 是屬性，代表…我們要改變的屬性。blue 是屬性質，代表我們要改成的值。</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div><div class="ln">3</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-css hljs" data-lang="css">選擇器 {
	屬性: 屬性值;
}</code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<h2 id="選擇器">選擇器</h2>
<p>選擇器有很多種，我們來看一下最常用的幾種。</p>
<ul>
<li>ID 選擇器：比如說 <code>&lt;img id=&quot;logo&quot;&gt;</code> 可以用 <code>#logo</code> 來選擇</li>
<li>元素選擇器：比如說<code>h1</code>就是選擇所有的 <code>&lt;h1&gt;</code> 元素</li>
<li>後代選擇器：比如說 <code>nav a</code>就是選擇所有 <code>&lt;nav&gt;</code> 裡面的 <code>&lt;a&gt;</code> 元素</li>
<li>親代選擇器：比如說 <code>ol &gt; li</code> 就是選擇所有 <code>&lt;ol&gt;</code> 裡面的 <code>&lt;li&gt;</code> 元素。而如果是 <code>&lt;ol&gt;</code> 裡的 <code>&lt;li&gt;</code> 裡的 <code>&lt;li&gt;</code> 就不會被選到。</li>
<li>群組選擇器：比如說 <code>nav, a</code>就是選擇所有 <code>&lt;nav&gt;</code> 還有 <code>&lt;a&gt;</code>。</li>
<li>相鄰兄弟：比如說 <code>h1 + p</code>就是選擇 <code>&lt;h1&gt;</code> 正後方的那一個 <code>&lt;p&gt;</code> 元素</li>
<li>一般兄弟：比如說 <code>h1 ~ p</code>就是選擇 <code>&lt;h1&gt;</code> 後面的所有 <code>&lt;p&gt;</code> 元素</li>
<li>屬性選擇器：比如說 <code>a[href=&quot;https://x.com&quot;]</code>就是選擇所有連結到 X 首頁的 a 元素
<ul>
<li>屬性網址包含某字是使用星號：<code>a[href*=&quot;tuts&quot;]</code> (比如說 <a href="http://nettuts.com/">nettuts.com</a>、<a href="http://net.tutsplus.com/">net.tutsplus.com</a>、<a href="http://tutsplus.com/">tutsplus.com</a>)</li>
<li>屬性開頭是使用上箭頭 caret 符號：<code>a[href^=&quot;http&quot;]</code></li>
<li>屬性結尾是使用錢符號：<code>[href$=&quot;.webp&quot;]</code></li>
</ul>
</li>
</ul>
<h3 id="權重">權重</h3>
<p>當有兩行 CSS 指令是在描述同一個元素，那們瀏覽器要聽誰的呢？這個時候我們就會看權重。有兩個規則。</p>
<h4 id="權重越高，就越有權力">權重越高，就越有權力</h4>
<blockquote>
<p>你女朋友說你很醜，早餐店阿姨說你是帥哥，那麼你應該很醜，因為女朋友永遠是對的，權重比較重。</p>
</blockquote>
<p>權重從高到低分別是：</p>
<ul>
<li>ID 選擇器</li>
<li>類別選擇器、屬性選擇器、偽類選擇器 (如：<code>root</code>)</li>
<li>元素選擇器、偽元素選擇器</li>
<li>任何元素選擇符沒有權級</li>
</ul>
<p>記得是可以相加的喔，這裡有一個<a href="https://specificity.keegan.st/">計算機</a>可以玩玩看，你的 Visual Studio Code 也會提示。\</p>
<p>
        <figure>
            <img src="/static/css/css-specificity-example.webp" alt="一個描述得清楚到不行權重超高的宣告。" title="" width="852" height="500">
            <figcaption>一個描述得清楚到不行權重超高的宣告。</figcaption>
        </figure>
    </p>
<p>如果你想要強迫讓你的樣式宣告比較有權力，你可以使用<code>!important</code> 驚嘆號尖叫。是這個方法不是很好，因為到最後你很有可能會所有地方都在尖叫，除了程式很吵很亂以外你會更難再蓋過去。但是如果真的沒辦法讓你的樣式權重更高的話，你可以考慮使用這個方法。</p>
<h4 id="權重如果相等，後寫的樣式宣告會蓋過先前的樣式宣告">權重如果相等，後寫的樣式宣告會蓋過先前的樣式宣告</h4>
<p>就像你女朋友在剛交往時說她很愛你，但是後來你變得很醜，所以她就不愛你了。那麼他不愛你了，因為要以後面的為主。</p>
<h2 id="各種單位">各種單位</h2>
<p>接下來我們來看一下各種單位。CSS 有很多種單位，我們來看一下常見的幾種。</p>
<h3 id="顏色">顏色</h3>
<p>今天假設你想表示紅色，你可以使用以下幾種方式，都是一樣的效果：</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div><div class="ln">3</div><div class="ln">4</div><div class="ln">5</div><div class="ln">6</div><div class="ln">7</div><div class="ln">8</div><div class="ln">9</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-css hljs" data-lang="css"><span class="hljs-selector-tag">h1</span> {
	<span class="hljs-attribute">color</span>: red; <span class="hljs-comment">/* 顏色名稱 */</span>
	<span class="hljs-attribute">color</span>: <span class="hljs-number">#ff0000</span>; <span class="hljs-comment">/* 16 進位 HEX 碼 */</span>
	<span class="hljs-attribute">color</span>: <span class="hljs-built_in">rgb</span>(<span class="hljs-number">255</span>, <span class="hljs-number">0</span>, <span class="hljs-number">0</span>);
	<span class="hljs-attribute">color</span>: <span class="hljs-built_in">rgba</span>(<span class="hljs-number">255</span>, <span class="hljs-number">0</span>, <span class="hljs-number">0</span>, <span class="hljs-number">1</span>); <span class="hljs-comment">/* RBG 加上 A 透明度 */</span>
	<span class="hljs-attribute">color</span>: <span class="hljs-built_in">hsl</span>(<span class="hljs-number">0</span>, <span class="hljs-number">100%</span>, <span class="hljs-number">50%</span>); <span class="hljs-comment">/* HSL 分別代表色相、飽和度、亮度 */</span>
	<span class="hljs-attribute">color</span>: <span class="hljs-built_in">hsla</span>(<span class="hljs-number">0</span>, <span class="hljs-number">100%</span>, <span class="hljs-number">50%</span>, <span class="hljs-number">1</span>); <span class="hljs-comment">/* HSL 加上 A 透明度 */</span>
	<span class="hljs-attribute">color</span>: <span class="hljs-built_in">color</span>(display-p3 <span class="hljs-number">1</span> <span class="hljs-number">0</span> <span class="hljs-number">0</span> / <span class="hljs-number">1</span>); <span class="hljs-comment">/* 使用 color 可以顯示 RGB 不能表示的顏色 */</span>
}</code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  <input type="checkbox" class="code-toggle" id="code-toggle-117">
        <label for="code-toggle-117" class="code-toggle-label"></label>
</div>
<p>最常見就是使用 Hex 碼，可以從設計圖中直接複製。</p>
<h3 id="大小">大小</h3>
<p>接下來是大小單位</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div><div class="ln">3</div><div class="ln">4</div><div class="ln">5</div><div class="ln">6</div><div class="ln">7</div><div class="ln">8</div><div class="ln">9</div><div class="ln">10</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-css hljs" data-lang="css"><span class="hljs-selector-tag">h1</span> {
	<span class="hljs-attribute">font-size</span>: <span class="hljs-number">100px</span>; <span class="hljs-comment">/* px 是像素 */</span>
	<span class="hljs-attribute">font-size</span>: <span class="hljs-number">10rem</span>; <span class="hljs-comment">/* rem 是相對於根元素的字體大小 */</span>
	<span class="hljs-attribute">font-size</span>: <span class="hljs-number">10em</span>; <span class="hljs-comment">/* em 是相對於父元素的字體大小 */</span>
	<span class="hljs-attribute">font-size</span>: <span class="hljs-number">10vw</span>; <span class="hljs-comment">/* 10vw 是相對於螢幕寬度 10% */</span>
	<span class="hljs-attribute">font-size</span>: <span class="hljs-number">10vh</span>; <span class="hljs-comment">/* 10vh 是相對於螢幕高度的 10% */</span>
	<span class="hljs-attribute">font-size</span>: <span class="hljs-number">10vmin</span>; <span class="hljs-comment">/* vmin 是相對於螢幕寬度和高度比較小的百分比 */</span>
	<span class="hljs-attribute">font-size</span>: <span class="hljs-number">10vmax</span>; <span class="hljs-comment">/* vmax 是相對於螢幕寬度和高度比較大的百分比 */</span>
	<span class="hljs-attribute">font-size</span>: <span class="hljs-number">10%</span>;
}</code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  <input type="checkbox" class="code-toggle" id="code-toggle-135">
        <label for="code-toggle-135" class="code-toggle-label"></label>
</div>
<p>百分比在不同時候的意思不太一樣，但原則上就是你想的那樣...</p>
<ul>
<li>width 跟 height 的%基準是父層</li>
<li>line-height 以本身文字行高為基準</li>
</ul>
<p>接下來我們來有效率的一次認識所有常用的 CSS 語法吧</p>
<h2 id="文字裝飾">文字裝飾</h2>
<p>語法直接全上！</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div><div class="ln">3</div><div class="ln">4</div><div class="ln">5</div><div class="ln">6</div><div class="ln">7</div><div class="ln">8</div><div class="ln">9</div><div class="ln">10</div><div class="ln">11</div><div class="ln">12</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-css hljs" data-lang="css"><span class="hljs-selector-tag">h1</span> {
	<span class="hljs-attribute">color</span>: red; <span class="hljs-comment">/* 顏色 */</span>
	<span class="hljs-attribute">font-size</span>: <span class="hljs-number">32px</span>; <span class="hljs-comment">/* 字體大小 */</span>
	<span class="hljs-attribute">letter-spacing</span>: <span class="hljs-number">10px</span>; <span class="hljs-comment">/* 字體間距 */</span>
	<span class="hljs-attribute">line-height</span>: <span class="hljs-number">1.5</span>; <span class="hljs-comment">/* 行高，通常會用數字代表正常高的倍數 */</span>
	<span class="hljs-attribute">font-weight</span>: <span class="hljs-number">500</span>; <span class="hljs-comment">/* 字體粗細，數字最大 1000，越大越重，預設 400 */</span>
	<span class="hljs-attribute">text-decoration</span>: underline; <span class="hljs-comment">/* 底線，最長是用 none 來把超連結醜醜的底線移除 */</span>
	<span class="hljs-attribute">font-style</span>: italic; <span class="hljs-comment">/* 斜體 */</span>
	<span class="hljs-attribute">opacity</span>: <span class="hljs-number">0.5</span>; <span class="hljs-comment">/*不透明度*/</span>
	<span class="hljs-attribute">text-align</span>: center; <span class="hljs-comment">/*文字對齊方向*/</span>
	<span class="hljs-attribute">font-family</span>: arial, sans-serif; <span class="hljs-comment">/*字體，如果第一個沒有就依序往後*/</span>
}</code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  <input type="checkbox" class="code-toggle" id="code-toggle-159">
        <label for="code-toggle-159" class="code-toggle-label"></label>
</div>
<h3 id="font-weight">font-weight</h3>
<p>font-weight 是字體粗細，有以下幾種寫法，不過還是最常用數字。</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div><div class="ln">3</div><div class="ln">4</div><div class="ln">5</div><div class="ln">6</div><div class="ln">7</div><div class="ln">8</div><div class="ln">9</div><div class="ln">10</div><div class="ln">11</div><div class="ln">12</div><div class="ln">13</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-css hljs" data-lang="css"><span class="hljs-comment">/* 關鍵字 */</span>
<span class="hljs-attribute">font-weight</span>: normal;
<span class="hljs-attribute">font-weight</span>: bold;

<span class="hljs-comment">/* 比較級關鍵字 */</span>
<span class="hljs-attribute">font-weight</span>: lighter;
<span class="hljs-attribute">font-weight</span>: bolder;

<span class="hljs-comment">/* 絕對的數值 */</span>
<span class="hljs-attribute">font-weight</span>: <span class="hljs-number">100</span>;
<span class="hljs-attribute">font-weight</span>: <span class="hljs-number">400</span>; <span class="hljs-comment">/* 正常 */</span>
<span class="hljs-attribute">font-weight</span>: <span class="hljs-number">700</span>; <span class="hljs-comment">/* 粗 */</span>
<span class="hljs-attribute">font-weight</span>: <span class="hljs-number">900</span>;</code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  <input type="checkbox" class="code-toggle" id="code-toggle-178">
        <label for="code-toggle-178" class="code-toggle-label"></label>
</div>
<h3 id="text-decoration">text-decoration</h3>
<p>text-decoration 是裝飾文字，有以下幾種寫法：</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div><div class="ln">3</div><div class="ln">4</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-css hljs" data-lang="css"><span class="hljs-attribute">text-decoration</span>: underline; <span class="hljs-comment">/* 底線 */</span>
<span class="hljs-attribute">text-decoration</span>: overline red; <span class="hljs-comment">/* 上線並且是紅色 */</span>
<span class="hljs-attribute">text-decoration</span>: none; <span class="hljs-comment">/* 沒有裝飾 */</span>
<span class="hljs-attribute">text-decoration-color</span>: <span class="hljs-number">#ff00ff</span>; <span class="hljs-comment">/* 裝飾的顏色 */</span></code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<h2 id="背景">背景</h2>
<h3 id="background-color-背景顏色">background-color 背景顏色</h3>
<p>background-color 是背景顏色。</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-css hljs" data-lang="css"><span class="hljs-attribute">background-color</span>: <span class="hljs-number">#ff0000</span>;</code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<h3 id="width-height">Width / Height</h3>
<p>我們把它用在一個 <code>div</code> 看看，我們先指定他的寬高然後設定背景顏色：</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-html hljs" data-lang="html"><span class="hljs-tag">&lt;<span class="hljs-name">div</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span></code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div><div class="ln">3</div><div class="ln">4</div><div class="ln">5</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-css hljs" data-lang="css"><span class="hljs-selector-tag">div</span> {
	<span class="hljs-attribute">background-color</span>: burlywood;
	<span class="hljs-attribute">width</span>: <span class="hljs-number">200px</span>;
	<span class="hljs-attribute">height</span>: <span class="hljs-number">200px</span>;
}</code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<p>
        <figure>
            <img src="/static/css/background-color-box.webp" alt="這個顏色是高大結實的木頭" title="" width="500" height="486">
            <figcaption>這個顏色是高大結實的木頭</figcaption>
        </figure>
    </p>
<h3 id="background-image-背景圖片">background-image 背景圖片</h3>
<p>background-image 是背景圖片，可以用 url() 來指定圖片位置。連結可以是相對位置或是絕對位置。</p>
<blockquote>
<p>複習：<a href="https://www.notion.so/3247dadd8040807d88adee7ae363141e?pvs=21">相對路徑與絕對路徑</a></p>
</blockquote>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div><div class="ln">3</div><div class="ln">4</div><div class="ln">5</div><div class="ln">6</div><div class="ln">7</div><div class="ln">8</div><div class="ln">9</div><div class="ln">10</div><div class="ln">11</div><div class="ln">12</div><div class="ln">13</div><div class="ln">14</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-css hljs" data-lang="css"><span class="hljs-attribute">background-image</span>: <span class="hljs-built_in">url</span>(<span class="hljs-string">&quot;vscode-browser-layout.webp&quot;</span>);
<span class="hljs-attribute">background-repeat</span>: no-repeat;
<span class="hljs-attribute">background-size</span>: cover; <span class="hljs-comment">/* 寬填滿 */</span>
<span class="hljs-attribute">background-size</span>: contain; <span class="hljs-comment">/* 高填滿 */</span>

<span class="hljs-attribute">background-position</span>: top left;
<span class="hljs-attribute">background-position</span>: <span class="hljs-number">20%</span> <span class="hljs-number">40%</span>; <span class="hljs-comment">/* 從左上開始算 */</span>

<span class="hljs-attribute">background-attachment</span>: scroll; <span class="hljs-comment">/* 不動但可以往下滾 */</span>
<span class="hljs-attribute">background-attachment</span>: fixed; <span class="hljs-comment">/* 卡住不動 */</span>
<span class="hljs-attribute">background-attachment</span>: local; <span class="hljs-comment">/* 一起動 */</span>

<span class="hljs-comment">/* 縮寫 */</span>
<span class="hljs-attribute">background</span>: no-repeat <span class="hljs-built_in">url</span>(<span class="hljs-string">&quot;vscode-browser-layout.webp&quot;</span>);</code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  <input type="checkbox" class="code-toggle" id="code-toggle-239">
        <label for="code-toggle-239" class="code-toggle-label"></label>
</div>
<blockquote>
<p>background 是上面所有東西的縮寫，語法可以參考：<a href="https://developer.mozilla.org/zh-CN/docs/Web/CSS/Reference/Properties/background">MDN</a>。</p>
</blockquote>
<h3 id="gradient-漸層">gradient 漸層</h3>
<p>語法可以直接寫多個顏色，在空白後寫佔的比例。</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-css hljs" data-lang="css"><span class="hljs-attribute">background</span>: <span class="hljs-built_in">linear-gradient</span>(<span class="hljs-number">#333</span>, <span class="hljs-number">#333</span> <span class="hljs-number">50%</span>, <span class="hljs-number">#eee</span> <span class="hljs-number">75%</span>, <span class="hljs-number">#333</span> <span class="hljs-number">75%</span>);</code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<p>這個比例可能跟你想像的不太一漾，漸層開始的位置是 0%，漸層結束的地方是 100%。你寫的百分比代表你寫的位置的顏色，顏色間會自動平分，如果沒有寫就會自動平分。</p>
<p>前面可以加入關鍵字表示漸層方向。12 點是 0 度，順時針旋轉前進。</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div><div class="ln">3</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-css hljs" data-lang="css"><span class="hljs-attribute">background</span>: <span class="hljs-built_in">linear-gradient</span>(<span class="hljs-number">#e66465</span>, <span class="hljs-number">#9198e5</span>);
<span class="hljs-attribute">background</span>: <span class="hljs-built_in">linear-gradient</span>(<span class="hljs-number">0.25turn</span>, <span class="hljs-number">#3f87a6</span>, <span class="hljs-number">#ebf8e1</span>, <span class="hljs-number">#f69d3c</span>);
<span class="hljs-attribute">background</span>: <span class="hljs-built_in">linear-gradient</span>(<span class="hljs-number">217deg</span>, <span class="hljs-built_in">rgba</span>(<span class="hljs-number">255</span>, <span class="hljs-number">0</span>, <span class="hljs-number">0</span>, <span class="hljs-number">0.8</span>), <span class="hljs-built_in">rgba</span>(<span class="hljs-number">255</span>, <span class="hljs-number">0</span>, <span class="hljs-number">0</span>, <span class="hljs-number">0</span>) <span class="hljs-number">70.71%</span>);</code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<p>
        <figure>
            <img src="/static/css/gradient-angle-360.svg" alt="漸層角度" title="" width="300" height="300">
            <figcaption>漸層角度</figcaption>
        </figure>
    </p>
<p>除了 <code>linear-gradient</code> 線性漸層以外還有圓形裡到外的漸層 <code>radial-gradient</code> 和旋轉放射漸 <code>conic-gradient</code>。詳細用法可以參考：<a href="https://developer.mozilla.org/en-US/docs/Web/CSS/Guides/Images/Using_gradients">MDN</a></p>
<h2 id="border-邊框">border 邊框</h2>
<p>可以個別指定或是使用 border 一次指定所有的：</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div><div class="ln">3</div><div class="ln">4</div><div class="ln">5</div><div class="ln">6</div><div class="ln">7</div><div class="ln">8</div><div class="ln">9</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-css hljs" data-lang="css"><span class="hljs-attribute">border-top</span>: solid <span class="hljs-number">10px</span> red;
<span class="hljs-attribute">border-bottom</span>: solid <span class="hljs-number">10px</span> red;
<span class="hljs-attribute">border-left</span>: solid <span class="hljs-number">10px</span> red;
<span class="hljs-attribute">border-right</span>: solid <span class="hljs-number">10px</span> red;

<span class="hljs-attribute">border-style</span>: solid; <span class="hljs-comment">/* 花邊，Solid 是預設的直線 */</span>
<span class="hljs-attribute">border-width</span>: <span class="hljs-number">10px</span>; <span class="hljs-comment">/* 寬度 */</span>
<span class="hljs-attribute">border-color</span>: <span class="hljs-number">#00ff00</span>; <span class="hljs-comment">/*邊框顏色 */</span>
<span class="hljs-attribute">border</span>: solid <span class="hljs-number">10px</span> red; <span class="hljs-comment">/* 縮寫，四邊都紅色的 */</span></code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  <input type="checkbox" class="code-toggle" id="code-toggle-284">
        <label for="code-toggle-284" class="code-toggle-label"></label>
</div>
<h2 id="border-radius-圓角">border-radius 圓角</h2>
<p>單位可以是半徑或著是百分比。如果有兩格值就是上下和左右，四個就是上右下左。</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div><div class="ln">3</div><div class="ln">4</div><div class="ln">5</div><div class="ln">6</div><div class="ln">7</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-css hljs" data-lang="css"><span class="hljs-attribute">border-radius</span>: <span class="hljs-number">50%</span>;
<span class="hljs-attribute">border-radius</span>: <span class="hljs-number">16px</span>;

<span class="hljs-attribute">border-radius</span>: 四個角;
<span class="hljs-attribute">border-radius</span>: 左上右下 右上左下;
<span class="hljs-attribute">border-radius</span>: 左上 右上 右下 左下;
<span class="hljs-attribute">border-top-left-radius</span>: <span class="hljs-number">10%</span>;</code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  <input type="checkbox" class="code-toggle" id="code-toggle-300">
        <label for="code-toggle-300" class="code-toggle-label"></label>
</div>
<p>例如：</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-html hljs" data-lang="html"><span class="hljs-tag">&lt;<span class="hljs-name">div</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span></code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div><div class="ln">3</div><div class="ln">4</div><div class="ln">5</div><div class="ln">6</div><div class="ln">7</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-css hljs" data-lang="css"><span class="hljs-selector-tag">div</span> {
	<span class="hljs-attribute">background-color</span>: burlywood;
	<span class="hljs-attribute">width</span>: <span class="hljs-number">200px</span>;
	<span class="hljs-attribute">height</span>: <span class="hljs-number">200px</span>;
	<span class="hljs-attribute">border-radius</span>: <span class="hljs-number">16px</span>;
	<span class="hljs-attribute">margin</span>: <span class="hljs-number">5rem</span>;
}</code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  <input type="checkbox" class="code-toggle" id="code-toggle-316">
        <label for="code-toggle-316" class="code-toggle-label"></label>
</div>
<p>
        <figure>
            <img src="/static/css/border-radius-wood-box.webp" alt="木頭重複利用，環保。" title="" width="542" height="530">
            <figcaption>木頭重複利用，環保。</figcaption>
        </figure>
    </p>
<p>木頭重複利用，環保。</p>
<p>如果你是一個正方形，寬高是 200，那麼給你每邊 100px 的圓角或是 50% 的圓角就會變成圓形：</p>
<p>
        <figure>
            <img src="/static/css/border-radius-circle.webp" alt="image.webp" title="" width="530" height="502">
            <figcaption>image.webp</figcaption>
        </figure>
    </p>
<blockquote>
<p>如果設定超過寬度一半的圓角，如 9999px，就會被設定成容器的一半最大能的圓角。</p>
</blockquote>
<h2 id="margin-外距">margin 外距</h2>
<p>兩個元素之間的距離。</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-html hljs" data-lang="html"><span class="hljs-tag">&lt;<span class="hljs-name">div</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">div</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span></code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div><div class="ln">3</div><div class="ln">4</div><div class="ln">5</div><div class="ln">6</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-css hljs" data-lang="css"><span class="hljs-selector-tag">div</span> {
	<span class="hljs-attribute">background-color</span>: burlywood;
	<span class="hljs-attribute">width</span>: <span class="hljs-number">100px</span>;
	<span class="hljs-attribute">height</span>: <span class="hljs-number">100px</span>;
	<span class="hljs-attribute">margin</span>: <span class="hljs-number">16px</span>;
}</code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  <input type="checkbox" class="code-toggle" id="code-toggle-345">
        <label for="code-toggle-345" class="code-toggle-label"></label>
</div>
<p>
        <figure>
            <img src="/static/css/margin-spacing-boxes.webp" alt="image.webp" title="" width="266" height="496">
            <figcaption>image.webp</figcaption>
        </figure>
    </p>
<p>同樣可以設定單邊或是多邊：</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div><div class="ln">3</div><div class="ln">4</div><div class="ln">5</div><div class="ln">6</div><div class="ln">7</div><div class="ln">8</div><div class="ln">9</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-css hljs" data-lang="css"><span class="hljs-selector-tag">div</span> {
	<span class="hljs-attribute">margin</span>: <span class="hljs-number">16px</span>; <span class="hljs-comment">/* 全部 16px */</span>
	<span class="hljs-attribute">margin</span>: <span class="hljs-number">16px</span> <span class="hljs-number">32px</span>; <span class="hljs-comment">/* 上下 16px，左右 32px */</span>
	<span class="hljs-attribute">margin</span>: <span class="hljs-number">16px</span> <span class="hljs-number">32px</span> <span class="hljs-number">24px</span>; <span class="hljs-comment">/* 上 16px，左右 32px，下 24px */</span>
	<span class="hljs-attribute">margin-top</span>: <span class="hljs-number">16px</span>;
	<span class="hljs-attribute">margin-bottom</span>: <span class="hljs-number">16px</span>;
	<span class="hljs-attribute">margin-left</span>: <span class="hljs-number">16px</span>;
	<span class="hljs-attribute">margin-right</span>: <span class="hljs-number">16px</span>;
}</code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  <input type="checkbox" class="code-toggle" id="code-toggle-358">
        <label for="code-toggle-358" class="code-toggle-label"></label>
</div>
<h2 id="padding-內距">padding 內距</h2>
<p>容器與裡面元素的距離。</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-html hljs" data-lang="html"><span class="hljs-tag">&lt;<span class="hljs-name">div</span>&gt;</span>DARLING🫂HOLD MY HAND💅🏻👋🏻🥵‼️<span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">id</span>=<span class="hljs-string">&quot;box&quot;</span>&gt;</span>📢NOTHING🚫BEATS A JET2✈️ HOLIDAY 🔥🔛🔝🔝<span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span></code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div><div class="ln">3</div><div class="ln">4</div><div class="ln">5</div><div class="ln">6</div><div class="ln">7</div><div class="ln">8</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-css hljs" data-lang="css"><span class="hljs-selector-tag">div</span> {
	<span class="hljs-attribute">background-color</span>: lightblue;
	<span class="hljs-attribute">margin</span>: <span class="hljs-number">32px</span> <span class="hljs-number">16px</span>;
}

<span class="hljs-selector-id">#box</span> {
	<span class="hljs-attribute">padding</span>: <span class="hljs-number">16px</span>;
}</code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  <input type="checkbox" class="code-toggle" id="code-toggle-379">
        <label for="code-toggle-379" class="code-toggle-label"></label>
</div>
<p>
        <figure>
            <img src="/static/css/padding-demo.webp" alt="加了 padding 很明顯好看且好閱讀很多" title="" width="970" height="342">
            <figcaption>加了 padding 很明顯好看且好閱讀很多</figcaption>
        </figure>
    </p>
<h2 id="box-sizing-地獄門有多大呢？">box-sizing 地獄門有多大呢？</h2>
<p>這是一個幾乘幾的地獄門呢？</p>
<p>
        <figure>
            <img src="minecraft-nether-portal.webp" alt="圖片來源：[Minecraft Wiki](https://minecraft.fandom.com/zh/wiki/%E4%B8%8B%E7%95%8C%E4%BC%A0%E9%80%81%E9%97%A8?variant=zh-tw)" title="" >
            <figcaption>圖片來源：[Minecraft Wiki](https://minecraft.fandom.com/zh/wiki/%E4%B8%8B%E7%95%8C%E4%BC%A0%E9%80%81%E9%97%A8?variant=zh-tw)</figcaption>
        </figure>
    </p>
<p>如果你覺得這是一個 2x3 的地獄門，恭喜你是一個合格的 CSS！我們來測試看看：</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div><div class="ln">3</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-html hljs" data-lang="html"><span class="hljs-tag">&lt;<span class="hljs-name">div</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">br</span> /&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">id</span>=<span class="hljs-string">&quot;box&quot;</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span></code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div><div class="ln">3</div><div class="ln">4</div><div class="ln">5</div><div class="ln">6</div><div class="ln">7</div><div class="ln">8</div><div class="ln">9</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-css hljs" data-lang="css"><span class="hljs-selector-tag">div</span> {
	<span class="hljs-attribute">width</span>: <span class="hljs-number">100px</span>;
	<span class="hljs-attribute">height</span>: <span class="hljs-number">100px</span>;
	<span class="hljs-attribute">background-color</span>: purple;
}

<span class="hljs-selector-id">#box</span> {
	<span class="hljs-attribute">border</span>: <span class="hljs-number">20px</span> solid black;
}</code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  <input type="checkbox" class="code-toggle" id="code-toggle-406">
        <label for="code-toggle-406" class="code-toggle-label"></label>
</div>
<p>
        <figure>
            <img src="/static/css/box-sizing-content-box.webp" alt="box-sizing: content-box" title="" width="724" height="1196">
            <figcaption>box-sizing: content-box</figcaption>
        </figure>
    </p>
<p>你可以看到明明兩個正方形都是長寬 100px。但是底下的正方形很明顯超出去了。原因是因為他沒把邊框算進去。這樣會讓我們在進行排版時很痛苦，很不直覺。所以我們通常會指定說「當你在算箱子的大小的時候請你把 border 也算進去」，具體語法是： <code>box-sizing:border-box</code>。</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-css hljs" data-lang="css"><span class="hljs-attribute">box-sizing</span>: content-box; <span class="hljs-comment">/* 只算內容 */</span>
<span class="hljs-attribute">box-sizing</span>: border-box; <span class="hljs-comment">/* 包含邊框 */</span></code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<p>
        <figure>
            <img src="/static/css/box-sizing-border-box.webp" alt="box-sizing: border-box" title="" width="564" height="1036">
            <figcaption>box-sizing: border-box</figcaption>
        </figure>
    </p>
<h3 id="outline">outline</h3>
<p>outline 位置在 border 的外面一圈，不佔用元素的任何空間。outline 不能設定單邊的樣式，它一定是圍繞整圈呈現的。</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div><div class="ln">3</div><div class="ln">4</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-html hljs" data-lang="html">AAAA
<span class="hljs-tag">&lt;<span class="hljs-name">br</span> /&gt;</span>
BBBB
<span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">id</span>=<span class="hljs-string">&quot;box&quot;</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span></code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div><div class="ln">3</div><div class="ln">4</div><div class="ln">5</div><div class="ln">6</div><div class="ln">7</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-css hljs" data-lang="css"><span class="hljs-selector-id">#box</span> {
	<span class="hljs-attribute">width</span>: <span class="hljs-number">100px</span>;
	<span class="hljs-attribute">height</span>: <span class="hljs-number">100px</span>;
	<span class="hljs-attribute">background-color</span>: lightblue;
	<span class="hljs-attribute">border</span>: <span class="hljs-number">20px</span> solid lightgreen;
	<span class="hljs-attribute">outline</span>: <span class="hljs-number">20px</span> solid lightcoral;
}</code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  <input type="checkbox" class="code-toggle" id="code-toggle-440">
        <label for="code-toggle-440" class="code-toggle-label"></label>
</div>
<p>
        <figure>
            <img src="/static/css/outline-overlap-demo.webp" alt="因為 outline 完全不佔任何空間所以把 BBBB 給蓋過去了" title="" width="864" height="916">
            <figcaption>因為 outline 完全不佔任何空間所以把 BBBB 給蓋過去了</figcaption>
        </figure>
    </p>
<h2 id="display-你要怎麼佈局">display 你要怎麼佈局</h2>
<p>Display 可以控制元素怎麼排。</p>
<h3 id="區塊元素與行內元素">區塊元素與行內元素</h3>
<p>HTML 元素可以分為兩種，一種是區塊元素，比如說 <code>&lt;h1&gt;</code>、 <code>&lt;p&gt;</code> 這種前後都會自動換行的，也有像是 <code>&lt;b&gt;</code>（粗體）、 <code>&lt;i&gt;</code> （斜體）這種放在文字之間不會換行的。前者叫做「區塊元素」、後者叫做「行內元素」。</p>
<p>不過我們可以更改元素的顯示方式。最常見的例子就是其實圖片 <code>&lt;img&gt;</code> 預設是一個行內元素，因此圖片會跟文字擠在一起。</p>
<p>
        <figure>
            <img src="/static/css/img-inline-element.webp" alt="圖片是行內元素，圖：凌汐 Jeffrey" title="" width="664" height="342">
            <figcaption>圖片是行內元素，圖：凌汐 Jeffrey</figcaption>
        </figure>
    </p>
<p>這時我們只需要設定 <code>display: block</code> 即可讓他自己佔滿一排。</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div><div class="ln">3</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-css hljs" data-lang="css"><span class="hljs-selector-tag">img</span> {
	<span class="hljs-attribute">display</span>: block;
}</code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<p>
        <figure>
            <img src="/static/css/img-block-element.webp" alt="image.webp" title="" width="468" height="376">
            <figcaption>image.webp</figcaption>
        </figure>
    </p>
<p><code>inline</code> 因為跟著文字左到右排，因此不能指定自己的長寬， <code>padding</code> 也只能設定左右。這時我們可以使用 <code>display: inline-block</code> 來保持像 block 一樣的特性，但一樣從左到右排。</p>
<p>整理一下：</p>
<ul>
<li><code>inline</code>: 像文字一樣左到右上到下，不能決定寬高</li>
<li><code>block</code>：佔滿<code>&lt;body&gt;</code>整排，下一個東西會換行</li>
<li><code>contents</code>: 只有 contents area 的 box，只顯示內容文字</li>
<li><code>inline-block</code>: 保持像 block 一樣的特性（可以設長寬等等）但一樣從左到右排</li>
<li><code>none</code>：整個東西隱藏不顯示，甚至空間都不佔用</li>
</ul>
<blockquote>
<p>如果使用 inline-block(像是 <code>a</code> 或 <code>li</code> )，標籤之間會有空白字元約 4~5px。</p>
</blockquote>
<p>我們也可以把一個元素設定成一個佈局的環境，控制裡面的東西要怎麼排。常見的如：</p>
<ul>
<li><code>display: flex</code>：裡面東西依序左到右或上到下排列。</li>
<li><code>display: grid</code>：裡面的東西像表格一樣整齊排列。</li>
</ul>
<h2 id="flexbox-超好用的容器">Flexbox 超好用的容器</h2>
<p>這是今天課程當中比較困難的部分。flexbox 非常強大，只要你學會他你幾乎就能排出任何版面。</p>
<p>我們先創個盒子裡面塞幾個 <code>&lt;div&gt;</code>。</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div><div class="ln">3</div><div class="ln">4</div><div class="ln">5</div><div class="ln">6</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-html hljs" data-lang="html"><span class="hljs-tag">&lt;<span class="hljs-name">section</span>&gt;</span>
	<span class="hljs-tag">&lt;<span class="hljs-name">div</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
	<span class="hljs-tag">&lt;<span class="hljs-name">div</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
	<span class="hljs-tag">&lt;<span class="hljs-name">div</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
	<span class="hljs-tag">&lt;<span class="hljs-name">div</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">section</span>&gt;</span></code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  <input type="checkbox" class="code-toggle" id="code-toggle-497">
        <label for="code-toggle-497" class="code-toggle-label"></label>
</div>
<div class="notice">
<p>emmet 語法</p>
<p>輸入 <code>section&gt;div*4</code> 然後點 <code>Tab</code>，底下註解也都是 emmet 縮寫</p>
</div>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div><div class="ln">3</div><div class="ln">4</div><div class="ln">5</div><div class="ln">6</div><div class="ln">7</div><div class="ln">8</div><div class="ln">9</div><div class="ln">10</div><div class="ln">11</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-css hljs" data-lang="css"><span class="hljs-selector-tag">section</span> {
	<span class="hljs-attribute">background</span>: <span class="hljs-number">#191d88</span>; <span class="hljs-comment">/* bg #191d88 */</span>
	<span class="hljs-attribute">padding</span>: <span class="hljs-number">5px</span>; <span class="hljs-comment">/* p5 */</span>
}

<span class="hljs-selector-tag">div</span> {
	<span class="hljs-attribute">width</span>: <span class="hljs-number">100px</span>; <span class="hljs-comment">/* w100 */</span>
	<span class="hljs-attribute">height</span>: <span class="hljs-number">100px</span>; <span class="hljs-comment">/* h100 */</span>
	<span class="hljs-attribute">background</span>: <span class="hljs-number">#ffc436</span>; <span class="hljs-comment">/* bg #ffc436 */</span>
	<span class="hljs-attribute">margin</span>: <span class="hljs-number">20px</span>; <span class="hljs-comment">/* m20 */</span>
}</code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  <input type="checkbox" class="code-toggle" id="code-toggle-516">
        <label for="code-toggle-516" class="code-toggle-label"></label>
</div>
<p>因為 <code>div</code> 是區塊元素 (<code>display: block</code>) 所以元素都會換行，而這很重要因為這樣我們才能設定他的寬高。</p>
<p>
        <figure>
            <img src="/static/css/flexbox-block-flow.webp" alt="image.webp" title="" width="1116" height="1020">
            <figcaption>image.webp</figcaption>
        </figure>
    </p>
<p>但如果我們在外容器加上 <code>display: flex</code> 就可以讓他們並排。</p>
<p>
        <figure>
            <img src="/static/css/flexbox-row.webp" alt="image.webp" title="" width="1556" height="300">
            <figcaption>image.webp</figcaption>
        </figure>
    </p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div><div class="ln">3</div><div class="ln">4</div><div class="ln">5</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-css hljs" data-lang="css"><span class="hljs-selector-tag">section</span> {
	<span class="hljs-attribute">background</span>: <span class="hljs-number">#191d88</span>; <span class="hljs-comment">/* bg #191d88 *
	padding: 5px; /* p5 */</span>
	<span class="hljs-attribute">display</span>: flex; <span class="hljs-comment">/* df */</span>
}</code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<p>我們把外面包著大家的藍色元素叫做外容器，裡面黃色正方形叫做內容器。我們可以在外容器的 CSS 設定裡面的東西怎麼排。</p>
<h3 id="排序方向-flex-direction">排序方向 <strong>flex-direction</strong></h3>
<p>方塊們預設是左到右，我們也可以改成右到左，或是垂直排列。比如說我設成 <code>row-reverse</code> 就會從右到左排。</p>
<blockquote>
<p><em>好啦講明確一點其實是跟著文字排，文字是左寫到右時就是左到右。</em></p>
</blockquote>
<p>
        <figure>
            <img src="/static/css/flex-direction-row-reverse.webp" alt="flex-direction: row-reverse;" title="" width="1556" height="300">
            <figcaption>flex-direction: row-reverse;</figcaption>
        </figure>
    </p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div><div class="ln">3</div><div class="ln">4</div><div class="ln">5</div><div class="ln">6</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-css hljs" data-lang="css"><span class="hljs-selector-tag">section</span> {
	<span class="hljs-attribute">flex-direction</span>: row; <span class="hljs-comment">/* 預設左到右 */</span>
	<span class="hljs-attribute">flex-direction</span>: row-reverse; <span class="hljs-comment">/* 右到左 */</span>
	<span class="hljs-attribute">flex-direction</span>: column; <span class="hljs-comment">/* 上到下 */</span>
	<span class="hljs-attribute">flex-direction</span>: column-reverse; <span class="hljs-comment">/* 下到上 */</span>
}</code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  <input type="checkbox" class="code-toggle" id="code-toggle-556">
        <label for="code-toggle-556" class="code-toggle-label"></label>
</div>
<h3 id="超過換行-flex-wrap">超過換行 <strong>flex-wrap</strong></h3>
<p>如果不設定的話瀏覽器會硬擠成一排。你看正方形都被壓成長方形了。</p>
<p>
        <figure>
            <img src="/static/css/flexbox-no-wrap.webp" alt="image.webp" title="" width="968" height="300">
            <figcaption>image.webp</figcaption>
        </figure>
    </p>
<p>你可以加上 <code>flex-wrap: wrap</code> 來解放他。</p>
<p>
        <figure>
            <img src="/static/css/flexbox-wrap.webp" alt="image.webp" title="" width="968" height="580">
            <figcaption>image.webp</figcaption>
        </figure>
    </p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div><div class="ln">3</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-css hljs" data-lang="css"><span class="hljs-attribute">flex-wrap</span>: nowrap; <span class="hljs-comment">/* 不換行 */</span>
<span class="hljs-attribute">flex-wrap</span>: wrap; <span class="hljs-comment">/* 太寬換行 */</span>
<span class="hljs-attribute">flex-wrap</span>: wrap-reverse; <span class="hljs-comment">/* 換行但從下到上排 */</span></code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<h3 id="flex-flow">flex-flow</h3>
<p>這是 <code>flex-direction</code> 和 <code>flex-wrap</code> 的縮寫。其實我從來不用。</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div><div class="ln">3</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-css hljs" data-lang="css"><span class="hljs-selector-class">.flex-container</span> {
	<span class="hljs-attribute">flex-flow</span>: &lt; <span class="hljs-string">&quot;flex-direction&quot;</span> &gt; || &lt; <span class="hljs-string">&quot;flex-wrap&quot;</span> &gt;;
}</code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<h3 id="水平對齊-justify-content">水平對齊 <strong>justify-content</strong></h3>
<p>元素要對齊哪裡。注意如果你設定 <code>flex-direction: column;</code> 就是垂直對齊方向。</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div><div class="ln">3</div><div class="ln">4</div><div class="ln">5</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-css hljs" data-lang="css"><span class="hljs-attribute">justify-content</span>: flex-start; <span class="hljs-comment">/* 靠左 */</span>
<span class="hljs-attribute">justify-content</span>: flex-end; <span class="hljs-comment">/* 靠右 */</span>
<span class="hljs-attribute">justify-content</span>: center; <span class="hljs-comment">/* 置中 */</span>
<span class="hljs-attribute">justify-content</span>: space-between; <span class="hljs-comment">/* 水平均分 */</span>
<span class="hljs-attribute">justify-content</span>: space-around; <span class="hljs-comment">/* 水平環繞均分 */</span></code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<p>
        <figure>
            <img src="/static/css/justify-content.svg" alt="圖：毛哥EM" title="" width="552" height="402">
            <figcaption>圖：毛哥EM</figcaption>
        </figure>
    </p>
<h3 id="垂直對齊-align-items">垂直對齊 <strong>align-items</strong></h3>
<p>和上面一樣只是變成垂直的。如果你設定 <code>flex-direction: column;</code> 就是水平方向。</p>
<p><code>flex-start</code> 靠開始位置、 <code>flex-end</code> 靠結束位置、 <code>center</code> 置中、 <code>strech</code> 延伸拉到一樣高、 <code>base-line</code> 會找文字的位置對齊。</p>
<h3 id="多行對齊-align-content"><strong>多行對齊 align-content</strong></h3>
<p>是上一個屬性的多行版本。</p>
<blockquote>
<p>注意 <code>stretch</code> 在元素高度被限制的情況下不會正常伸展。</p>
</blockquote>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-css hljs" data-lang="css"><span class="hljs-attribute">align-content</span>: flex-start | flex-end | center | space-between | space-around | stretch;</code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<p>
        <figure>
            <img src="/static/css/align-items.svg" alt="圖：毛哥EM" title="" width="550" height="354">
            <figcaption>圖：毛哥EM</figcaption>
        </figure>
    </p>
<p>圖：毛哥EM</p>
<h3 id="我不喜歡乖乖排隊-align-items">我不喜歡乖乖排隊 align-items</h3>
<p>我們可以使用 <strong><code>align-self</code></strong> 設定單獨一個元素的特別往另一邊靠。很少用的屬性。語法可以參考 MDN：https://developer.mozilla.org/zh-CN/docs/Web/CSS/Reference/Properties/align-self</p>
<h3 id="剩下的空間給誰？flex-grow">剩下的空間給誰？flex-grow</h3>
<p>我們也可以設定假設排完有多的空間要給誰。剩下空間方給他幾份，預設值為 <code>0</code>，如果設定為 0 則不會縮放，1 以上就是根據比例來平分。</p>
<p>
        <figure>
            <img src="/static/css/flex-grow.svg" alt="flex-grow.svg" title="" width="552" height="318">
            <figcaption>flex-grow.svg</figcaption>
        </figure>
    </p>
<h3 id="沒空間壓榨誰？flex-shink">沒空間壓榨誰？flex-shink</h3>
<p>flex-shrink 則反之，當空間分配還不足時的目前元件的收縮性，預設值為 <code>1</code>，所以才會遇到最前面不設定可以換行所有人都被擠爆的問題。如果設定為 0 則不會縮放。</p>
<h3 id="flex-basis-你怎麼看我">flex-basis 你怎麼看我</h3>
<p>剛才提到 <code>flex-shink</code> 跟 <code>flex-grow</code> 可以拿來分配剩餘的空間，但是我們要怎麼知道剩多少呢？要先扣掉已經用了的嘛。這時候當然是把大家的 <code>width</code> 扣一扣。但是我們可以使用 <code>flex-basis</code> 來說：</p>
<blockquote>
<p>「雖然我只有 5 公分，但請把我當作 30 公分來排。」</p>
</blockquote>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-css hljs" data-lang="css"><span class="hljs-attribute">flex-basis</span>: <span class="hljs-number">30cm</span>;</code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<blockquote>
<p>喔對了前面沒有提到你可以使用單位 cm 對吧？沒錯，不過大家螢幕畫質都很高會放大畫面，所以 1px 不一定是真的 1px。1cm 本質上其實只是 37.8px。這個單位通常在印刷時使用。</p>
</blockquote>
<h3 id="order">Order</h3>
<p>你可以使用 <strong><code>order</code></strong> 屬性來設定順序，前到後放入整數，支援負值。</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div><div class="ln">3</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-css hljs" data-lang="css"><span class="hljs-attribute">order</span>: -<span class="hljs-number">1</span> <span class="hljs-comment">/* 放到最前面 */</span>
order: <span class="hljs-number">1</span> <span class="hljs-comment">/* 放到最後面 */</span>
order: <span class="hljs-number">5</span> <span class="hljs-comment">/* 如果有 1 的話就是放到他後面 */</span></code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<p>如果你不熟悉 flex 的話你可以到 <a href="https://flexboxfroggy.com/#zh-tw"><strong>Flexbox Froggy</strong></a> 這個網站，用遊戲的方式了解 flex。(然後提示是可以直接按，不用慢慢輸入喔)</p>
<h2 id="中場練習">中場練習</h2>
<p>你也可以使用今天所學到的語法複製一個 Google 的網頁。重點在排版所以按鍵的陰影和顏色可以直接打開開發者工具查看喔。我先做了一個範例提供大家參考，也能實現搜尋功能。如果有任何問題也歡迎留言。</p>
<blockquote>
<p><a href="https://sysh-tech-volunteer.github.io/Web-Design-Camp/practice/google.html">範例網站</a> | <a href="https://github.com/SYSH-Tech-Volunteer/Web-Design-Camp/blob/main/practice/google.html">原檔 HTML</a> | <a href="https://github.com/SYSH-Tech-Volunteer/Web-Design-Camp/blob/main/practice/google.css">原檔 CSS</a></p>
</blockquote>
<h2 id="position-東西放哪">Position 東西放哪</h2>
<p>目前我們東西排放的都很整齊，根據我們設定的規則依序排列。不過有時候我們不希望東西好好排（in flow）。舉一個例子是我希望網站右下角隨時有一顆客服按鈕，或是上牌的選單永遠固定住。</p>
<p>
        <figure>
            <img src="/static/css/position-popups-ads.webp" alt="網站主要的內容我們都可以用 flex 來切，但是畫面中還有煩人的彈出式廣告和右下角的錨點廣告。" title="" width="3600" height="2036">
            <figcaption>網站主要的內容我們都可以用 flex 來切，但是畫面中還有煩人的彈出式廣告和右下角的錨點廣告。</figcaption>
        </figure>
    </p>
<p>這時候我們就可以設定東西要放在哪。既然是放在哪這個語法就叫做 <code>position</code>。</p>
<h2 id="語法">語法</h2>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-css hljs" data-lang="css"><span class="hljs-attribute">position</span>: 屬性;</code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<h2 id="static-該怎樣就怎樣">Static - 該怎樣就怎樣</h2>
<p>預設屬性，該在哪裡在哪裡，區塊元素佔整排，行內元素繼續往右。</p>
<p>通常不需要特別設定，除非我們有其他的 CSS 把 position 改成別的你想要改回來。</p>
<h2 id="relative-解鎖偏移">Relative - 解鎖偏移</h2>
<p>設定成 relative 的元素可以解鎖使用 top, bottom, left, right 屬性，讓它看起來往某個地方移動一點點。但是還是佔據原本的位置。</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-html hljs" data-lang="html"><span class="hljs-tag">&lt;<span class="hljs-name">div</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">id</span>=<span class="hljs-string">&quot;purple&quot;</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span></code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div><div class="ln">3</div><div class="ln">4</div><div class="ln">5</div><div class="ln">6</div><div class="ln">7</div><div class="ln">8</div><div class="ln">9</div><div class="ln">10</div><div class="ln">11</div><div class="ln">12</div><div class="ln">13</div><div class="ln">14</div><div class="ln">15</div><div class="ln">16</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-css hljs" data-lang="css"><span class="hljs-selector-tag">body</span> {
	<span class="hljs-attribute">margin</span>: <span class="hljs-number">0</span>;
	<span class="hljs-attribute">padding</span>: <span class="hljs-number">10px</span>;
}
<span class="hljs-selector-tag">div</span> {
	<span class="hljs-attribute">width</span>: <span class="hljs-number">100px</span>;
	<span class="hljs-attribute">height</span>: <span class="hljs-number">100px</span>;
	<span class="hljs-attribute">background</span>: <span class="hljs-number">#56949f</span>;
	<span class="hljs-attribute">margin</span>: <span class="hljs-number">10px</span>;
}
<span class="hljs-selector-id">#purple</span> {
	<span class="hljs-attribute">background</span>: <span class="hljs-number">#ebbcba</span>;
	<span class="hljs-attribute">position</span>: relative;
	<span class="hljs-attribute">left</span>: <span class="hljs-number">30px</span>;
	<span class="hljs-attribute">top</span>: -<span class="hljs-number">50px</span>;
}</code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  <input type="checkbox" class="code-toggle" id="code-toggle-698">
        <label for="code-toggle-698" class="code-toggle-label"></label>
</div>
<p>
        <figure>
            <img src="/static/css/position-relative-offset.webp" alt="方塊往左上角推了" title="" width="340" height="500">
            <figcaption>方塊往左上角推了</figcaption>
        </figure>
    </p>
<p>方塊往左上角推了</p>
<h2 id="absolute-在哪都行">Absolute - 在哪都行</h2>
<p>設定成 absolute 的元素你一樣可以使用 top, bottom, left, right 屬性來定位元素，但是會變成像是一張貼紙一樣貼在網頁上，原本的位置不在佔據。定位的參考點是外面最靠近的 <code>position: relative</code> 或是 <code>position:absolute</code> 元素。</p>
<p>有點難理解對吧，我們來看看這個範例：</p>
<p>比如說這樣：</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div><div class="ln">3</div><div class="ln">4</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-css hljs" data-lang="css">&lt;<span class="hljs-selector-tag">div</span> class=&quot;<span class="hljs-attribute">container</span>&quot;&gt;
	&lt;<span class="hljs-selector-tag">div</span> class=&quot;purple&quot;&gt;&lt;/<span class="hljs-selector-tag">div</span>&gt;
	&lt;<span class="hljs-selector-tag">div</span> class=&quot;green&quot;&gt;&lt;/<span class="hljs-selector-tag">div</span>&gt;
&lt;/<span class="hljs-selector-tag">div</span>&gt;</code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div><div class="ln">3</div><div class="ln">4</div><div class="ln">5</div><div class="ln">6</div><div class="ln">7</div><div class="ln">8</div><div class="ln">9</div><div class="ln">10</div><div class="ln">11</div><div class="ln">12</div><div class="ln">13</div><div class="ln">14</div><div class="ln">15</div><div class="ln">16</div><div class="ln">17</div><div class="ln">18</div><div class="ln">19</div><div class="ln">20</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-css hljs" data-lang="css"><span class="hljs-selector-tag">body</span> {
	<span class="hljs-attribute">margin</span>: <span class="hljs-number">0</span>;
}

<span class="hljs-selector-class">.container</span> {
	<span class="hljs-attribute">background-color</span>: <span class="hljs-number">#e0def4</span>;
	<span class="hljs-attribute">margin-top</span>: <span class="hljs-number">130px</span>;
}
<span class="hljs-selector-class">.green</span>,
<span class="hljs-selector-class">.purple</span> {
	<span class="hljs-attribute">width</span>: <span class="hljs-number">100px</span>;
	<span class="hljs-attribute">height</span>: <span class="hljs-number">100px</span>;
	<span class="hljs-attribute">background</span>: <span class="hljs-number">#56949f</span>;
}
<span class="hljs-selector-class">.purple</span> {
	<span class="hljs-attribute">background</span>: <span class="hljs-number">#ebbcba</span>;
	<span class="hljs-attribute">position</span>: absolute;
	<span class="hljs-attribute">left</span>: <span class="hljs-number">30px</span>;
	<span class="hljs-attribute">top</span>: -<span class="hljs-number">0px</span>;
}</code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  <input type="checkbox" class="code-toggle" id="code-toggle-736">
        <label for="code-toggle-736" class="code-toggle-label"></label>
</div>
<p>
        <figure>
            <img src="/static/css/position-absolute-body.webp" alt="image.webp" title="" width="1000" height="460">
            <figcaption>image.webp</figcaption>
        </figure>
    </p>
<p>可以觀察到幾件事：</p>
<ul>
<li>紫色 <code>&lt;div&gt;</code> 因為設定了 <code>margin-top</code> 所以上面有一些空白區域。</li>
<li>粉紅色方塊根據 HTML 在紫色方塊裡面，但是他因為 <code>position: absolute;</code> 所以逃到畫面最上面，左邊偏移 30px 了。</li>
</ul>
<p>所以你可以看到紅色現在的定位點是整個 <code>&lt;body&gt;</code> 畫面。如果我們幫 <code>.container</code> 加上 <code>position: relative</code> 呢？</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div><div class="ln">3</div><div class="ln">4</div><div class="ln">5</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-css hljs" data-lang="css"><span class="hljs-selector-class">.container</span> {
	<span class="hljs-attribute">background-color</span>: <span class="hljs-number">#e0def4</span>;
	<span class="hljs-attribute">margin-top</span>: <span class="hljs-number">130px</span>;
	<span class="hljs-attribute">position</span>: relative;
}</code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<p>
        <figure>
            <img src="/static/css/position-absolute-container.webp" alt="image.webp" title="" width="1000" height="460">
            <figcaption>image.webp</figcaption>
        </figure>
    </p>
<p>這時我們粉紅色的正方形就是以紫色 container 的左上角作為定位點開始做偏移了。</p>
<h2 id="fixed-卡在畫面上">Fixed - 卡在畫面上</h2>
<p>剛才的粉紅色方塊我們滾輪往下滾他就會跟著滾下去了，那如果我們希望能做一個固定在上面的選單呢？</p>
<p>設定 Fixed 的元素會直接以螢幕的左上角為定位點進行定位，並且無論怎麼滾動畫面都會待在哪裡。最常見的使用時機是網頁右下角回到最上面的按鈕，或者是煩人的分享按鈕。</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div><div class="ln">3</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-html hljs" data-lang="html"><span class="hljs-tag">&lt;<span class="hljs-name">nav</span>&gt;</span>
	<span class="hljs-tag">&lt;<span class="hljs-name">h1</span>&gt;</span>我的網站<span class="hljs-tag">&lt;/<span class="hljs-name">h1</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">nav</span>&gt;</span></code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div><div class="ln">3</div><div class="ln">4</div><div class="ln">5</div><div class="ln">6</div><div class="ln">7</div><div class="ln">8</div><div class="ln">9</div><div class="ln">10</div><div class="ln">11</div><div class="ln">12</div><div class="ln">13</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-css hljs" data-lang="css"><span class="hljs-selector-tag">body</span> {
	<span class="hljs-attribute">height</span>: <span class="hljs-number">200vh</span>;
	<span class="hljs-attribute">background</span>: <span class="hljs-number">#56949f</span>;
}

<span class="hljs-selector-tag">nav</span> {
	<span class="hljs-attribute">width</span>: <span class="hljs-number">100%</span>;
	<span class="hljs-attribute">height</span>: <span class="hljs-number">100px</span>;
	<span class="hljs-attribute">background</span>: <span class="hljs-number">#e0def4</span>;
	<span class="hljs-attribute">position</span>: fixed;
	<span class="hljs-attribute">top</span>: <span class="hljs-number">0</span>;
	<span class="hljs-attribute">left</span>: <span class="hljs-number">0</span>;
}</code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  <input type="checkbox" class="code-toggle" id="code-toggle-792">
        <label for="code-toggle-792" class="code-toggle-label"></label>
</div>
<p><a href="position-fixed-demo.webp">Screen Recording 2026-03-23 at 11.30.08 AM.webp</a></p>
<h2 id="sticky">Sticky</h2>
<p>我們有時候希望某些東西固定在一個地方，但是只有在那個 section。</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div><div class="ln">3</div><div class="ln">4</div><div class="ln">5</div><div class="ln">6</div><div class="ln">7</div><div class="ln">8</div><div class="ln">9</div><div class="ln">10</div><div class="ln">11</div><div class="ln">12</div><div class="ln">13</div><div class="ln">14</div><div class="ln">15</div><div class="ln">16</div><div class="ln">17</div><div class="ln">18</div><div class="ln">19</div><div class="ln">20</div><div class="ln">21</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-html hljs" data-lang="html"><span class="hljs-tag">&lt;<span class="hljs-name">h1</span>&gt;</span>我的網站<span class="hljs-tag">&lt;/<span class="hljs-name">h1</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">p</span>&gt;</span>
	Lorem, ipsum dolor sit amet consectetur adipisicing elit. Sequi doloribus maiores sunt, repudiandae voluptates illo. Rerum voluptas, minima repellat laudantium ducimus nostrum soluta veniam
	aspernatur maiores perspiciatis, ab, omnis vel!
<span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span>

<span class="hljs-tag">&lt;<span class="hljs-name">section</span>&gt;</span>
	<span class="hljs-tag">&lt;<span class="hljs-name">div</span>&gt;</span>
		<span class="hljs-tag">&lt;<span class="hljs-name">p</span>&gt;</span>
			Lorem, ipsum dolor sit amet consectetur adipisicing elit. Sequi doloribus maiores sunt, repudiandae voluptates illo. Rerum voluptas, minima repellat laudantium ducimus nostrum soluta veniam
			aspernatur maiores perspiciatis, ab, omnis vel!
		<span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span>
	<span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
	<span class="hljs-tag">&lt;<span class="hljs-name">ul</span>&gt;</span>
		<span class="hljs-tag">&lt;<span class="hljs-name">h2</span>&gt;</span>Section 1<span class="hljs-tag">&lt;/<span class="hljs-name">h2</span>&gt;</span>
	<span class="hljs-tag">&lt;/<span class="hljs-name">ul</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">section</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">p</span>&gt;</span>
	Lorem, ipsum dolor sit amet consectetur adipisicing elit. Sequi doloribus maiores sunt, repudiandae voluptates illo. Rerum voluptas, minima repellat laudantium ducimus nostrum soluta veniam
	aspernatur maiores perspiciatis, ab, omnis vel!
<span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span></code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  <input type="checkbox" class="code-toggle" id="code-toggle-814">
        <label for="code-toggle-814" class="code-toggle-label"></label>
</div>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div><div class="ln">3</div><div class="ln">4</div><div class="ln">5</div><div class="ln">6</div><div class="ln">7</div><div class="ln">8</div><div class="ln">9</div><div class="ln">10</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-css hljs" data-lang="css"><span class="hljs-selector-tag">section</span> {
	<span class="hljs-attribute">display</span>: flex;
	<span class="hljs-attribute">position</span>: relative;
}

<span class="hljs-selector-tag">h2</span> {
	<span class="hljs-attribute">flex-shrink</span>: <span class="hljs-number">0</span>;
	<span class="hljs-attribute">position</span>: sticky;
	<span class="hljs-attribute">top</span>: <span class="hljs-number">0</span>;
}</code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  <input type="checkbox" class="code-toggle" id="code-toggle-838">
        <label for="code-toggle-838" class="code-toggle-label"></label>
</div>
<p><a href="position-sticky-demo.webp">Screen Recording 2026-03-23 at 2.42.56 PM.webp</a></p>
<div class="notice">
<h3 id="lorem-ipsum-是什麼？">Lorem Ipsum 是什麼？</h3>
<p>這段咒語不是任何語言，是個方便進行平面設計和網頁開發的佔位符假文。字母頻率與現代英語接近，可以方便排版但是不會受內文影響。比如說我在裡面打一段笑話可能會讓你笑一下<s>誤以為</s>網頁開發是很快樂的事。</p>
</div>
<h2 id="範例">範例</h2>
<p>來一個範例讓大家分辨它們不同的效果</p>
<p><a href="https://codepen.io/elvismao/pen/rNoYOKZ">https://codepen.io/elvismao/pen/rNoYOKZ</a></p>
<p>
        <figure>
            <img src="/static/css/sunny.webp" alt="sunny.webp" title="" width="1397" height="760">
            <figcaption>sunny.webp</figcaption>
        </figure>
    </p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div><div class="ln">3</div><div class="ln">4</div><div class="ln">5</div><div class="ln">6</div><div class="ln">7</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-html hljs" data-lang="html"><span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;sun&quot;</span>&gt;</span>Fixed<span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;cloud&quot;</span>&gt;</span>Static<span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;cloud relative&quot;</span>&gt;</span>Relative<span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;building&quot;</span>&gt;</span>
	Relative
	<span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;roof&quot;</span>&gt;</span>Absolute<span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span></code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  <input type="checkbox" class="code-toggle" id="code-toggle-871">
        <label for="code-toggle-871" class="code-toggle-label"></label>
</div>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div><div class="ln">3</div><div class="ln">4</div><div class="ln">5</div><div class="ln">6</div><div class="ln">7</div><div class="ln">8</div><div class="ln">9</div><div class="ln">10</div><div class="ln">11</div><div class="ln">12</div><div class="ln">13</div><div class="ln">14</div><div class="ln">15</div><div class="ln">16</div><div class="ln">17</div><div class="ln">18</div><div class="ln">19</div><div class="ln">20</div><div class="ln">21</div><div class="ln">22</div><div class="ln">23</div><div class="ln">24</div><div class="ln">25</div><div class="ln">26</div><div class="ln">27</div><div class="ln">28</div><div class="ln">29</div><div class="ln">30</div><div class="ln">31</div><div class="ln">32</div><div class="ln">33</div><div class="ln">34</div><div class="ln">35</div><div class="ln">36</div><div class="ln">37</div><div class="ln">38</div><div class="ln">39</div><div class="ln">40</div><div class="ln">41</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-css hljs" data-lang="css"><span class="hljs-selector-tag">body</span> {
	<span class="hljs-attribute">background</span>: lightblue;
	<span class="hljs-attribute">text-align</span>: center;
	<span class="hljs-attribute">font-weight</span>: <span class="hljs-number">800</span>;
}
<span class="hljs-selector-class">.sun</span> {
	<span class="hljs-attribute">width</span>: <span class="hljs-number">100px</span>;
	<span class="hljs-attribute">height</span>: <span class="hljs-number">100px</span>;
	<span class="hljs-attribute">background</span>: yellow;
	<span class="hljs-attribute">border-radius</span>: <span class="hljs-number">50%</span>;
	<span class="hljs-attribute">position</span>: fixed;
	<span class="hljs-attribute">right</span>: <span class="hljs-number">30px</span>;
	<span class="hljs-attribute">top</span>: <span class="hljs-number">30px</span>;
}
<span class="hljs-selector-class">.cloud</span> {
	<span class="hljs-attribute">width</span>: <span class="hljs-number">300px</span>;
	<span class="hljs-attribute">height</span>: <span class="hljs-number">100px</span>;
	<span class="hljs-attribute">left</span>: <span class="hljs-number">20%</span>;
	<span class="hljs-attribute">background</span>: white;
	<span class="hljs-attribute">border-radius</span>: <span class="hljs-number">30px</span> <span class="hljs-number">20px</span> <span class="hljs-number">100px</span> <span class="hljs-number">50px</span>;
}
<span class="hljs-selector-class">.relative</span> {
	<span class="hljs-attribute">position</span>: relative;
}
<span class="hljs-selector-class">.building</span> {
	<span class="hljs-attribute">width</span>: <span class="hljs-number">300px</span>;
	<span class="hljs-attribute">height</span>: <span class="hljs-number">1000px</span>;
	<span class="hljs-attribute">background</span>: gray;
	<span class="hljs-attribute">position</span>: relative;
	<span class="hljs-attribute">left</span>: <span class="hljs-number">50%</span>;
}
<span class="hljs-selector-class">.roof</span> {
	<span class="hljs-attribute">position</span>: absolute;
	<span class="hljs-attribute">top</span>: <span class="hljs-number">0</span>;
	<span class="hljs-attribute">left</span>: <span class="hljs-number">50%</span>;
	<span class="hljs-attribute">width</span>: <span class="hljs-number">100px</span>;
	<span class="hljs-attribute">height</span>: <span class="hljs-number">70px</span>;
	<span class="hljs-attribute">background</span>: <span class="hljs-number">#000</span>;
	<span class="hljs-attribute">margin-top</span>: -<span class="hljs-number">70px</span>;
	<span class="hljs-attribute">color</span>: <span class="hljs-number">#fff</span>;
}</code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  <input type="checkbox" class="code-toggle" id="code-toggle-881">
        <label for="code-toggle-881" class="code-toggle-label"></label>
</div>
<p>在這裡你可以看到</p>
<ul>
<li>太陽設定為 <code>fixed</code>，所以就算滾輪滾動也不會改變位置。</li>
<li>第一朵雲因為沒有設定 <code>position</code>，所以就是預設的 <code>static</code>，所以它會在原本的位置。雖然他有設定 <code>left: 20%;</code> 但是因為他是 <code>static</code> 所以沒有效果。</li>
<li>第二朵雲設定為 <code>relative</code>，所以他會在原本的位置，但是可以使用 <code>top, bottom, left, right</code> 來偏移位置。</li>
<li>建築物設定為 <code>relative</code>，所以他會在原本的位置，我們使用 <code>right</code> 來偏移到正中間。可以看到它是元素左邊在最中間，因為對齊點是左上角。</li>
<li>裡面的黑色屋頂設定為 <code>absolute</code>，所以他會以外面的 <code>relative</code> 為對齊點，並且不佔據原本的位置。我們使用 <code>top: 0; left: 50%;</code> 來定位他，但這樣會讓他在建築物裡面，因此我們可以使用 <code>margin-top: -70px;</code> 來把他拉上去。</li>
</ul>
<p>
        <figure>
            <img src="/static/css/positions-title-placement.webp" alt="那麼 Ariana Granade 的 Positions 裡面的標題效果要怎麼定位在這裡呢？" title="" width="3018" height="1507">
            <figcaption>那麼 Ariana Granade 的 Positions 裡面的標題效果要怎麼定位在這裡呢？</figcaption>
        </figure>
    </p>
<h2 id="transform">Transform</h2>
<p>原本位置佔著，但是可以做出各種效果如 rotate 旋轉。</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-css hljs" data-lang="css"><span class="hljs-attribute">transform</span>: <span class="hljs-built_in">rotate</span>(<span class="hljs-number">90deg</span>);</code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<h3 id="transform-translate">Transform: translate</h3>
<p>可以把東西偏移。</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div><div class="ln">3</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-css hljs" data-lang="css"><span class="hljs-attribute">transform</span>: <span class="hljs-built_in">translate</span>(往右偏移多少, 往下偏移多少);
<span class="hljs-attribute">transform</span>: <span class="hljs-built_in">translateX</span>(往右偏移多少);
<span class="hljs-attribute">transform</span>: <span class="hljs-built_in">translateY</span>(往下偏移多少);</code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<p>單位值為多少就平移多少，然後 transform 支援負值：</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div><div class="ln">3</div><div class="ln">4</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-css hljs" data-lang="css"><span class="hljs-selector-class">.translate</span> {
	<span class="hljs-attribute">background-color</span>: pink;
	<span class="hljs-attribute">transform</span>: <span class="hljs-built_in">translate</span>(<span class="hljs-number">100px</span>, -<span class="hljs-number">50px</span>);
}</code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<p>
        <figure>
            <img src="/static/css/translate.svg" alt="transform: translate" title="" width="300" height="150">
            <figcaption>transform: translate</figcaption>
        </figure>
    </p>
<p>translate 的百分比基準是自己的 width 跟 height，可以改變元素定位的參考位置，最常見的是把參考點變成元素正中間，方便定位。</p>
<p>
        <figure>
            <img src="/static/css/translate-center.svg" alt="使用 transform 置中" title="" width="300" height="150">
            <figcaption>使用 transform 置中</figcaption>
        </figure>
    </p>
<p>來一個推方塊範例：</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div><div class="ln">3</div><div class="ln">4</div><div class="ln">5</div><div class="ln">6</div><div class="ln">7</div><div class="ln">8</div><div class="ln">9</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-css hljs" data-lang="css"><span class="hljs-selector-class">.outer</span> {
	<span class="hljs-attribute">position</span>: relative;
}

<span class="hljs-selector-tag">img</span> {
	<span class="hljs-attribute">position</span>: absolute;
	<span class="hljs-attribute">top</span>: <span class="hljs-number">50%</span>;
	<span class="hljs-attribute">left</span>: <span class="hljs-number">50%</span>;
}</code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  <input type="checkbox" class="code-toggle" id="code-toggle-970">
        <label for="code-toggle-970" class="code-toggle-label"></label>
</div>
<p>就做到水平跟垂直置中的效果啦（當然用 <code>display: flex</code> 也可以達到置中的效果。）</p>
<h2 id="hover-active">:hover &amp; :active</h2>
<p><code>:hover</code> 是當滑鼠滑過元素的時候會觸發的狀態，<code>:active</code> 是當元素被點擊的時候會觸發的狀態。比如說我們這裡設定超連結的顏色，當滑過的時候變紅色，點擊的時候變綠色。</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div><div class="ln">3</div><div class="ln">4</div><div class="ln">5</div><div class="ln">6</div><div class="ln">7</div><div class="ln">8</div><div class="ln">9</div><div class="ln">10</div><div class="ln">11</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-css hljs" data-lang="css"><span class="hljs-selector-tag">a</span> {
	<span class="hljs-attribute">color</span>: blue;
}

<span class="hljs-selector-tag">a</span><span class="hljs-selector-pseudo">:hover</span> {
	<span class="hljs-attribute">color</span>: red;
}

<span class="hljs-selector-tag">a</span><span class="hljs-selector-pseudo">:active</span> {
	<span class="hljs-attribute">color</span>: green;
}</code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  <input type="checkbox" class="code-toggle" id="code-toggle-988">
        <label for="code-toggle-988" class="code-toggle-label"></label>
</div>
<p><a href="#transition 轉場" id="myLink">這是一個超連結</a></p>
<style>
	#myLink {
		color: blue;
	}

	#myLink:hover {
		color: red;
	}

	#myLink:active {
		color: green;
	}
</style>
<h2 id="transition-轉場">transition 轉場</h2>
<p>當元素因為各種原因改變屬性質，比如說 JavaScript 改的或著是因為元素被點擊等等。會在指定時間平滑的切換過去，做出簡單的動畫。</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div><div class="ln">3</div><div class="ln">4</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-css hljs" data-lang="css"><span class="hljs-attribute">transition</span>: 屬性 轉換時間 延遲執行動畫的時間 速度;

<span class="hljs-attribute">transition</span>:all .<span class="hljs-number">3s</span> <span class="hljs-number">0s</span> ease; // 設定全部 <span class="hljs-number">0.3</span> 秒轉換 沒有延遲 ease 為預設值
<span class="hljs-attribute">transition</span>: padding .<span class="hljs-number">3s</span> <span class="hljs-number">0s</span>, background-color <span class="hljs-number">1s</span> <span class="hljs-number">1s</span>; // 可以各別設定，用逗號分開，並用延遲時間設定出現的先後順序</code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<p>任何屬性都可以設定 transition，比如說文字段落滑過要變色也可以。</p>
<h2 id="overflow">overflow</h2>
<p>假設元素超過了容器的大小，這時候我們可以使用 overflow 屬性來決定要怎麼處理。最常用的是 hidden 隱藏、auto 自動還有 scroll，也就是顯示滾動軸。</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div><div class="ln">3</div><div class="ln">4</div><div class="ln">5</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-css hljs" data-lang="css"><span class="hljs-attribute">overflow</span>: visible; <span class="hljs-comment">/* 可突出 */</span>
<span class="hljs-attribute">overflow</span>: hidden;
<span class="hljs-attribute">overflow</span>: scroll;
<span class="hljs-attribute">overflow</span>: auto;
<span class="hljs-attribute">overflow</span>: hidden visible; <span class="hljs-comment">/* 同時設定 x, y */</span></code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<h2 id="media">Media</h2>
<p>Media 可以告訴瀏覽器在不同的螢幕大小該如何呈現。這個是基本的語法。</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-css hljs" data-lang="css"><span class="hljs-keyword">@media</span> screen <span class="hljs-keyword">and</span> (條件) <span class="hljs-keyword">and</span> (條件) ... {
}</code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<p>語法有很多不同的寫法，最常見就是：</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div><div class="ln">3</div><div class="ln">4</div><div class="ln">5</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-css hljs" data-lang="css"><span class="hljs-keyword">@media</span> (<span class="hljs-attribute">max-width</span>: <span class="hljs-number">600px</span>) {
	<span class="hljs-selector-tag">h1</span> {
		<span class="hljs-attribute">font-size</span>: <span class="hljs-number">2rem</span>;
	}
}</code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<p>他的意思是說假設螢幕寬度小於 600 像素，那麼大標題就要以正常字體的兩倍大顯示。</p>
<hr>
<p>以上是一些常見的 CSS 語法。當然還有很多其他的屬性和用法，不過透過以上的語法已經能夠做出絕大部分的網頁了，歡迎大家繼續探索！</p>
]]></content:encoded>
    </item>
<item>
      <title>嫌 Google Forms 太醜？拿它當表單後端吧！</title>
      <link>https://emtech.cc/p/forms-backend</link>
      <description>Google 表單 API 不管資料來源，打開開發者工具複製參數，前端直接 fetch 即可。</description>
      <pubDate>Fri, 27 Mar 2026 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/forms-backend</guid>
      <media:thumbnail url="https://emtech.cc/static/forms-backend/thumbnail.webp" />
      <category>網頁開發</category>
     <content:encoded><![CDATA[<img src="/static/forms-backend/thumbnail.webp" />
<p>有時候你想在你的靜態網頁中放一個表單，但是如果為此你需要租個虛擬機、寫個後端、開個資料庫、還要擔心被網路攻擊...這實在是太麻煩了。但是放個 Google 表單又千篇壹律沒什麼品味。這時其實你可以把 Google Forms 當作表單的後端，回覆還可以自動儲存到 Google Sheets，只要在前端寫一點 JavaScript。網頁不管部署在 GitHub Pages、Netlify、Vercel、Zeabur、任何前端網頁都行。</p>
<h2 id="為什麼不用-google-forms？">為什麼不用 Google Forms？</h2>
<p>我最近會用到這個是因為我們今年 SITCON 的贊助徵求書是網頁版的，可以搜集有興趣的聯絡廠商的聯絡方式。</p>
<p>
        <figure>
            <img src="/static/forms-backend/SITCON.webp" alt="SITCON 2026 贊助徵求書" title="" width="1200" height="1036">
            <figcaption>SITCON 2026 贊助徵求書</figcaption>
        </figure>
    </p>
<h2 id="步驟一：建立-google-表單">步驟一：建立 Google 表單</h2>
<p><a href="https://docs.google.com/forms/u/0/create?usp=dot_new">新增一個空白 Google 表單</a>然後建立幾個問題，以我們的例子就是：</p>
<ul>
<li>單位名稱</li>
<li>部門</li>
<li>稱呼</li>
<li>聯絡方式</li>
<li>留言</li>
</ul>
<p>不用花時間選字體設計樣式描述，畢竟我們不會用 Google Forms 的前端介面，這些只是為了儲存資料的欄位而已。接著進行發布。</p>
<p>
        <figure>
            <img src="/static/forms-backend/publish.webp" alt="發布表單" title="" width="1200" height="696">
            <figcaption>發布表單</figcaption>
        </figure>
    </p>
<hr>
<h2 id="步驟二：找到欄位-id">步驟二：找到欄位 ID</h2>
<p>Google Form 的每個問題都有一個編號（<code>entry.XXXXXXXX</code>），這是送資料時要用的。</p>
<p>找法如下：</p>
<blockquote>
<p>不建議使用 Safari，因為它的開發者工具不太好用，也不好開。</p>
</blockquote>
<ol>
<li>
<p>打開開發者工具（<code>F12</code> 或是 <code>Ctrl</code>+<code>Shift</code>+<code>I</code>）開啟檢查器</p>
</li>
<li>
<p>填寫一些表單內容等一下方便好找。</p>
</li>
<li>
<p>在搜尋欄尋找 <code>input[name^=&quot;entry.&quot;]</code>，這樣就會列出所有 Google Form 的欄位了。</p>
</li>
<li>
<p>把這些欄位的 <code>entry.xxxxx</code> 編號抄下來</p>
</li>
</ol>
<p>例如：</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div><div class="ln">3</div><div class="ln">4</div><div class="ln">5</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class=" hljs" data-lang="code">單位名稱 → entry.1867519928
部門 → entry.363990418
稱呼 → entry.1660888396
聯絡方式 → entry.1209239304
留言 → entry.65159086</code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<p>
        <figure>
            <img src="/static/forms-backend/id.webp" alt="找到欄位 ID" title="" width="1200" height="889">
            <figcaption>找到欄位 ID</figcaption>
        </figure>
    </p>
<blockquote>
<p>Google Forms 會不定期更新網頁，所以 HTML 架構可能稍微不同。像是之前就是直接 <code>&lt;input type=&quot;text&quot; name=&quot;entry.1867519928&quot; /&gt;</code>。最簡單的方式其實是直接填一份表單，打開開發者工具查看 Network 的 POST 請求，裡面就會有送出的資料和對應的 <code>entry.xxxxx</code> 編號了。</p>
</blockquote>
<hr>
<h2 id="步驟三：撰寫-html-表單">步驟三：撰寫 HTML 表單</h2>
<p>在你的網站專案中建立一個檔案 <code>index.html</code>：</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div><div class="ln">3</div><div class="ln">4</div><div class="ln">5</div><div class="ln">6</div><div class="ln">7</div><div class="ln">8</div><div class="ln">9</div><div class="ln">10</div><div class="ln">11</div><div class="ln">12</div><div class="ln">13</div><div class="ln">14</div><div class="ln">15</div><div class="ln">16</div><div class="ln">17</div><div class="ln">18</div><div class="ln">19</div><div class="ln">20</div><div class="ln">21</div><div class="ln">22</div><div class="ln">23</div><div class="ln">24</div><div class="ln">25</div><div class="ln">26</div><div class="ln">27</div><div class="ln">28</div><div class="ln">29</div><div class="ln">30</div><div class="ln">31</div><div class="ln">32</div><div class="ln">33</div><div class="ln">34</div><div class="ln">35</div><div class="ln">36</div><div class="ln">37</div><div class="ln">38</div><div class="ln">39</div><div class="ln">40</div><div class="ln">41</div><div class="ln">42</div><div class="ln">43</div><div class="ln">44</div><div class="ln">45</div><div class="ln">46</div><div class="ln">47</div><div class="ln">48</div><div class="ln">49</div><div class="ln">50</div><div class="ln">51</div><div class="ln">52</div><div class="ln">53</div><div class="ln">54</div><div class="ln">55</div><div class="ln">56</div><div class="ln">57</div><div class="ln">58</div><div class="ln">59</div><div class="ln">60</div><div class="ln">61</div><div class="ln">62</div><div class="ln">63</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-html hljs" data-lang="html"><span class="hljs-meta">&lt;!DOCTYPE <span class="hljs-keyword">html</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">html</span> <span class="hljs-attr">lang</span>=<span class="hljs-string">&quot;zh-Hant&quot;</span>&gt;</span>
	<span class="hljs-tag">&lt;<span class="hljs-name">head</span>&gt;</span>
		<span class="hljs-tag">&lt;<span class="hljs-name">meta</span> <span class="hljs-attr">charset</span>=<span class="hljs-string">&quot;UTF-8&quot;</span> /&gt;</span>
		<span class="hljs-tag">&lt;<span class="hljs-name">title</span>&gt;</span>靜態表單示範<span class="hljs-tag">&lt;/<span class="hljs-name">title</span>&gt;</span>
		<span class="hljs-tag">&lt;<span class="hljs-name">style</span>&gt;</span><span class="language-css">
			<span class="hljs-selector-tag">body</span> {
				<span class="hljs-attribute">font-family</span>: sans-serif;
				<span class="hljs-attribute">max-width</span>: <span class="hljs-number">600px</span>;
				<span class="hljs-attribute">margin</span>: <span class="hljs-number">3rem</span> auto;
			}
			<span class="hljs-selector-tag">label</span> {
				<span class="hljs-attribute">display</span>: block;
				<span class="hljs-attribute">margin-top</span>: <span class="hljs-number">1rem</span>;
			}
			<span class="hljs-selector-tag">input</span>,
			<span class="hljs-selector-tag">textarea</span> {
				<span class="hljs-attribute">width</span>: <span class="hljs-number">100%</span>;
				<span class="hljs-attribute">padding</span>: <span class="hljs-number">0.5rem</span>;
			}
			<span class="hljs-selector-tag">button</span> {
				<span class="hljs-attribute">margin-top</span>: <span class="hljs-number">1rem</span>;
				<span class="hljs-attribute">padding</span>: <span class="hljs-number">0.5rem</span> <span class="hljs-number">1rem</span>;
			}
			<span class="hljs-selector-tag">span</span><span class="hljs-selector-id">#form-message</span> {
				<span class="hljs-attribute">display</span>: block;
				<span class="hljs-attribute">margin-top</span>: <span class="hljs-number">0.5rem</span>;
				<span class="hljs-attribute">color</span>: red;
			}
		</span><span class="hljs-tag">&lt;/<span class="hljs-name">style</span>&gt;</span>
	<span class="hljs-tag">&lt;/<span class="hljs-name">head</span>&gt;</span>
	<span class="hljs-tag">&lt;<span class="hljs-name">body</span>&gt;</span>
		<span class="hljs-tag">&lt;<span class="hljs-name">h1</span>&gt;</span>聯絡我們<span class="hljs-tag">&lt;/<span class="hljs-name">h1</span>&gt;</span>

		<span class="hljs-tag">&lt;<span class="hljs-name">form</span> <span class="hljs-attr">id</span>=<span class="hljs-string">&quot;contact-form&quot;</span>&gt;</span>
			<span class="hljs-tag">&lt;<span class="hljs-name">label</span>&gt;</span>
				單位名稱
				<span class="hljs-tag">&lt;<span class="hljs-name">input</span> <span class="hljs-attr">name</span>=<span class="hljs-string">&quot;organization&quot;</span> <span class="hljs-attr">required</span> /&gt;</span>
			<span class="hljs-tag">&lt;/<span class="hljs-name">label</span>&gt;</span>
			<span class="hljs-tag">&lt;<span class="hljs-name">label</span>&gt;</span>
				部門
				<span class="hljs-tag">&lt;<span class="hljs-name">input</span> <span class="hljs-attr">name</span>=<span class="hljs-string">&quot;department&quot;</span> /&gt;</span>
			<span class="hljs-tag">&lt;/<span class="hljs-name">label</span>&gt;</span>
			<span class="hljs-tag">&lt;<span class="hljs-name">label</span>&gt;</span>
				稱呼
				<span class="hljs-tag">&lt;<span class="hljs-name">input</span> <span class="hljs-attr">name</span>=<span class="hljs-string">&quot;name&quot;</span> <span class="hljs-attr">required</span> /&gt;</span>
			<span class="hljs-tag">&lt;/<span class="hljs-name">label</span>&gt;</span>
			<span class="hljs-tag">&lt;<span class="hljs-name">label</span>&gt;</span>
				聯絡方式
				<span class="hljs-tag">&lt;<span class="hljs-name">input</span> <span class="hljs-attr">name</span>=<span class="hljs-string">&quot;contact&quot;</span> <span class="hljs-attr">required</span> /&gt;</span>
			<span class="hljs-tag">&lt;/<span class="hljs-name">label</span>&gt;</span>
			<span class="hljs-tag">&lt;<span class="hljs-name">label</span>&gt;</span>
				留言
				<span class="hljs-tag">&lt;<span class="hljs-name">textarea</span> <span class="hljs-attr">name</span>=<span class="hljs-string">&quot;message&quot;</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">textarea</span>&gt;</span>
			<span class="hljs-tag">&lt;/<span class="hljs-name">label</span>&gt;</span>

			<span class="hljs-tag">&lt;<span class="hljs-name">button</span> <span class="hljs-attr">type</span>=<span class="hljs-string">&quot;submit&quot;</span> <span class="hljs-attr">id</span>=<span class="hljs-string">&quot;submit&quot;</span>&gt;</span>送出<span class="hljs-tag">&lt;/<span class="hljs-name">button</span>&gt;</span>
			<span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">id</span>=<span class="hljs-string">&quot;form-message&quot;</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span>
		<span class="hljs-tag">&lt;/<span class="hljs-name">form</span>&gt;</span>

		<span class="hljs-tag">&lt;<span class="hljs-name">script</span> <span class="hljs-attr">src</span>=<span class="hljs-string">&quot;form.js&quot;</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">script</span>&gt;</span>
	<span class="hljs-tag">&lt;/<span class="hljs-name">body</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">html</span>&gt;</span></code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  <input type="checkbox" class="code-toggle" id="code-toggle-61">
        <label for="code-toggle-61" class="code-toggle-label"></label>
</div>
<p>
        <figure>
            <img src="/static/forms-backend/form.png" alt="表單效果" title="" width="1614" height="1200">
            <figcaption>表單效果</figcaption>
        </figure>
    </p>
<hr>
<h2 id="步驟四：撰寫-formjs">步驟四：撰寫 <code>form.js</code></h2>
<p>建立 <code>form.js</code>（放同一資料夾），請你自行修改 <code>apiUrl</code> 和 <code>entryMap</code> 的內容：</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div><div class="ln">3</div><div class="ln">4</div><div class="ln">5</div><div class="ln">6</div><div class="ln">7</div><div class="ln">8</div><div class="ln">9</div><div class="ln">10</div><div class="ln">11</div><div class="ln">12</div><div class="ln">13</div><div class="ln">14</div><div class="ln">15</div><div class="ln">16</div><div class="ln">17</div><div class="ln">18</div><div class="ln">19</div><div class="ln">20</div><div class="ln">21</div><div class="ln">22</div><div class="ln">23</div><div class="ln">24</div><div class="ln">25</div><div class="ln">26</div><div class="ln">27</div><div class="ln">28</div><div class="ln">29</div><div class="ln">30</div><div class="ln">31</div><div class="ln">32</div><div class="ln">33</div><div class="ln">34</div><div class="ln">35</div><div class="ln">36</div><div class="ln">37</div><div class="ln">38</div><div class="ln">39</div><div class="ln">40</div><div class="ln">41</div><div class="ln">42</div><div class="ln">43</div><div class="ln">44</div><div class="ln">45</div><div class="ln">46</div><div class="ln">47</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-js hljs" data-lang="js"><span class="hljs-keyword">const</span> apiUrl = <span class="hljs-string">&quot;https://docs.google.com/forms/d/e/xxxx/formResponse&quot;</span>;

<span class="hljs-keyword">const</span> form = <span class="hljs-variable language_">document</span>.<span class="hljs-title function_">getElementById</span>(<span class="hljs-string">&quot;contact-form&quot;</span>);
<span class="hljs-keyword">const</span> submitButton = <span class="hljs-variable language_">document</span>.<span class="hljs-title function_">getElementById</span>(<span class="hljs-string">&quot;submit&quot;</span>);
<span class="hljs-keyword">const</span> messageElement = <span class="hljs-variable language_">document</span>.<span class="hljs-title function_">getElementById</span>(<span class="hljs-string">&quot;form-message&quot;</span>);

<span class="hljs-comment">// 對應 Google Form 欄位</span>
<span class="hljs-keyword">const</span> entryMap = {
	<span class="hljs-attr">organization</span>: <span class="hljs-string">&quot;entry.1867519928&quot;</span>,
	<span class="hljs-attr">department</span>: <span class="hljs-string">&quot;entry.363990418&quot;</span>,
	<span class="hljs-attr">name</span>: <span class="hljs-string">&quot;entry.1660888396&quot;</span>,
	<span class="hljs-attr">contact</span>: <span class="hljs-string">&quot;entry.1209239304&quot;</span>,
	<span class="hljs-attr">message</span>: <span class="hljs-string">&quot;entry.65159086&quot;</span>
};

form.<span class="hljs-title function_">addEventListener</span>(<span class="hljs-string">&quot;submit&quot;</span>, <span class="hljs-function"><span class="hljs-params">event</span> =&gt;</span> {
	event.<span class="hljs-title function_">preventDefault</span>();
	messageElement.<span class="hljs-property">textContent</span> = <span class="hljs-string">&quot;&quot;</span>;

	<span class="hljs-comment">// 組成 Google Form 的資料格式</span>
	<span class="hljs-keyword">const</span> formData = <span class="hljs-keyword">new</span> <span class="hljs-title class_">FormData</span>();
	<span class="hljs-title class_">Object</span>.<span class="hljs-title function_">entries</span>(entryMap).<span class="hljs-title function_">forEach</span>(<span class="hljs-function">(<span class="hljs-params">[key, entryKey]</span>) =&gt;</span> {
		<span class="hljs-keyword">const</span> value = form.<span class="hljs-title function_">querySelector</span>(<span class="hljs-string">`[name=&quot;<span class="hljs-subst">${key}</span>&quot;]`</span>).<span class="hljs-property">value</span>;
		formData.<span class="hljs-title function_">append</span>(entryKey, value);
	});

	submitButton.<span class="hljs-property">disabled</span> = <span class="hljs-literal">true</span>;
	submitButton.<span class="hljs-property">textContent</span> = <span class="hljs-string">&quot;送出中…&quot;</span>;

	<span class="hljs-title function_">fetch</span>(apiUrl, {
		<span class="hljs-attr">method</span>: <span class="hljs-string">&quot;POST&quot;</span>,
		<span class="hljs-attr">mode</span>: <span class="hljs-string">&quot;no-cors&quot;</span>, <span class="hljs-comment">// 避免 CORS 錯誤</span>
		<span class="hljs-attr">body</span>: formData
	})
		.<span class="hljs-title function_">then</span>(<span class="hljs-function">() =&gt;</span> {
			form.<span class="hljs-title function_">reset</span>();
			messageElement.<span class="hljs-property">textContent</span> = <span class="hljs-string">&quot;✅ 已成功送出，感謝您的填寫！&quot;</span>;
		})
		.<span class="hljs-title function_">catch</span>(<span class="hljs-function"><span class="hljs-params">err</span> =&gt;</span> {
			<span class="hljs-variable language_">console</span>.<span class="hljs-title function_">error</span>(<span class="hljs-string">&quot;Submit error:&quot;</span>, err);
			messageElement.<span class="hljs-property">textContent</span> = <span class="hljs-string">&quot;⚠️ 發生錯誤，請稍後再試。&quot;</span>;
		})
		.<span class="hljs-title function_">finally</span>(<span class="hljs-function">() =&gt;</span> {
			submitButton.<span class="hljs-property">disabled</span> = <span class="hljs-literal">false</span>;
			submitButton.<span class="hljs-property">textContent</span> = <span class="hljs-string">&quot;送出&quot;</span>;
		});
});</code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  <input type="checkbox" class="code-toggle" id="code-toggle-135">
        <label for="code-toggle-135" class="code-toggle-label"></label>
</div>
<p>邏輯相信你能看懂，Google 就只是收單純的表單格式而已。</p>
<hr>
<h2 id="步驟五：部署上去！">步驟五：部署上去！</h2>
<p>你可以把這個網頁：</p>
<ul>
<li>放在 GitHub Pages</li>
<li>或直接丟到 Netlify / Zeabur / Vercel</li>
</ul>
<p>開啟網址後測試：</p>
<ol>
<li>填寫表單</li>
<li>點送出</li>
<li>前往 Google 表單，回應頁就會看到資料進去了</li>
</ol>
<h2 id="總結">總結</h2>
<p>這種方式雖然簡單，但非常實用：</p>
<ul>
<li>不用架伺服器</li>
<li>不用額外帳號</li>
<li>送出的資料都進 Google Sheets，自動統計</li>
</ul>
<p>適合簡單的個人網站、社團報名頁、贊助表單、意見回饋。不過限制除了哪天 Google Forms 改版之外，也需要注意一下表單沒有任何填寫限制，可能需要注意垃圾訊息或是有人在裡面輸入 Excel 公式之類的。</p>
]]></content:encoded>
    </item>
<item>
      <title>環境建置與 HTML 完全指南</title>
      <link>https://emtech.cc/p/html</link>
      <description>HTML 是一種用來建立網頁的語言，透過 HTML 我們可以把文字、圖片、影片等等內容放到網頁上，讓使用者可以看到我們想要呈現的內容。這篇文章會介紹 HTML 的基本語法和常見的元素，讓你可以開始寫自己的網頁。</description>
      <pubDate>Thu, 26 Mar 2026 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/html</guid>
      <media:thumbnail url="https://emtech.cc/static/html/thumbnail.webp" />
      <category>程式教學</category>
     <content:encoded><![CDATA[<img src="/static/html/thumbnail.webp" />
<h1>環境建置</h1>
<p>在開始寫程式之前我們會需要先安裝寫程式的工具。我們目前為止寫網站至少需要三個東西：</p>
<ul>
<li>文字編輯器 - 打字的地方</li>
<li>終端機 - 黑底白字看起來像駭客的地方，也是把你的網頁程式跑起來的地方</li>
<li>瀏覽器 - 寫完網站要看吧</li>
</ul>
<p>你看這樣我們就至少需要三個 APP 了，如果你有需要其他的工具或套件還需要開一堆軟體，像是檔案總管、GitHub Desktop、<s>還有現代 Vibe Coder 必備的 Codex、Claude Code</s>。這樣實在需要太多東西太麻煩了，這時候如果有一個整合式的開發環境不是很好嗎？</p>
<p>所以我們要來安裝一個…整合式開發環境（英文叫 IDE），VS Code。</p>
<blockquote>
<p>VS Code 官網：<a href="https://code.visualstudio.com/">code.visualstudio.com</a></p>
</blockquote>
<p>就是下載…下一步…下一步…下一步…，Mac 就是拖過去，結束。</p>
<blockquote>
<p>有人會吵說 VS Code 是文字編輯器不是 IDE 因為你需要裝擴充功能才有更多功能 bluh bluh bluh 但就像咖啡是不是豆漿一樣，你開心就好，不爽不要用。</p>
</blockquote>
<blockquote>
<p>如果你有你自己習慣的編輯器（Vim、<a href="https://www.jetbrains.com/">噴射腦</a>的<a href="https://www.jetbrains.com/webstorm/">網路風暴</a>）可以繼續用你習慣的就好沒關係。</p>
</blockquote>
<h2 id="安裝擴充功能">安裝擴充功能</h2>
<p>按下 <code>Ctrl</code> + <code>Shfit</code> + <code>X</code> 或是左邊的四個正方形來安裝擴充功能，搜尋「live」來安裝 Live Server</p>
<p>
        <figure>
            <img src="/static/html/extension.webp" alt="安裝 Live Server" title="" width="1005" height="649">
            <figcaption>安裝 Live Server</figcaption>
        </figure>
    </p>
<p>安裝這個東西之後他就會幫你架設好一個靜態網頁，就是你打開網址跟他要檔案他就會給你，而且可以做到你點擊 <code>Ctrl</code> / <code>Cmd</code> + <code>S</code> 就自動完成儲存。</p>
<h2 id="安裝-git">安裝 Git</h2>
<p>這東西我們之後會用到，可以順手裝一下。</p>
<p>兩個方法，如果你平常有用兩個方法，如果你平常有用套件管理器的話推薦可以直接使用：</p>
<p>Windows Chocolatey:</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-bash hljs" data-lang="bash">choco install git.install -y</code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<p>macOS Brew:</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-bash hljs" data-lang="bash">brew install git</code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<blockquote>
<p>如果你 MacBook 沒安裝過 brew 的話可以使用以下指令安裝：</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-jsx hljs" data-lang="jsx">/bin/bash -c <span class="hljs-string">&quot;$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)&quot;</span></code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
</blockquote>
<p>推薦你可以使用上面或是類似的方式。如果不行的話跟 VS Code 一樣直接去官網下載下一步下一步下一步也是可以。</p>
<blockquote>
<p>Git 官網：https://git-scm.com/</p>
</blockquote>
<blockquote>
<p>如果你用的是 Linux 的話那應該不用我教吧。（需要的話再叫助教）</p>
</blockquote>
<blockquote>
<p>裝好 Git 之後 VS Code 需要重新打開才會出現他的工具，不過目錢都用不到。</p>
</blockquote>
<h2 id="開啟資料夾">開啟資料夾</h2>
<p>好啦我們準備好要開始寫程式了，請你先找一個地方建立一個資料夾，接下來我們練習的程式可以放在裡面。接著用 VS Code 打開資料夾。</p>
<blockquote>
<p>建議你可以創一個大資料夾，裡面有每堂課的資料夾，這樣就不會找不到或很亂了。</p>
</blockquote>
<p>
        <figure>
            <img src="/static/html/folder.webp" alt="開啟資料夾" title="" width="1512" height="982">
            <figcaption>開啟資料夾</figcaption>
        </figure>
    </p>
<h1>HTML</h1>
<p>HTML 叫做超文本標記語言 (Hyper Text Markup Language)。故名思義就是標記一下文字。HTML 主要功能不是為了裝飾，目的是讓<strong>瀏覽器／使用者知道這個是什麼</strong>。比如說 Google 想知道網站標題會去找裡面的 <code>&lt;h1&gt;</code> ；而給盲人用的語音閱讀器在看到 <code>&lt;strong&gt;</code> 會加重語氣。</p>
<p>這非常重要，裝飾文字是 CSS 的工作（下禮拜就來講）。</p>
<p>不過讓我們先來實際寫寫看 HTML 再來慢慢探討這些大道理。首先我們先創一個檔案（1）叫做 index.html（2）。</p>
<p>打開之後我們點擊 <code>!</code> 然後按下 <code>tab</code> 會給我們一個 HTML 的模板。先不用看懂沒關係，你只需要知道等一下我們都打在 <code>&lt;body&gt;</code> 跟 <code>&lt;/body&gt;</code> 之間就可以了。</p>
<p>
        <figure>
            <img src="/static/html/live.webp" alt="Go Live" title="" width="907" height="569">
            <figcaption>Go Live</figcaption>
        </figure>
    </p>
<p>我們先在 body 裡面打點東西（3），然後點擊右下角的 Go Live，你的網站就活起來了！</p>
<p>
        <figure>
            <img src="/static/html/live-preview.webp" alt="網站上線囉" title="" width="1814" height="1138">
            <figcaption>網站上線囉</figcaption>
        </figure>
    </p>
<h2 id="html-語法">HTML 語法</h2>
<p>首先這是一段文字。如果你想要讓它成為粗體的話請你在兩邊加入 <code>&lt;b&gt;</code> 和 <code>&lt;/b&gt;</code>。就像 word 一樣，B 代表了 bold。</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div><div class="ln">3</div><div class="ln">4</div><div class="ln">5</div><div class="ln">6</div><div class="ln">7</div><div class="ln">8</div><div class="ln">9</div><div class="ln">10</div><div class="ln">11</div><div class="ln">12</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-html hljs" data-lang="html"><span class="hljs-meta">&lt;!DOCTYPE <span class="hljs-keyword">html</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">html</span> <span class="hljs-attr">lang</span>=<span class="hljs-string">&quot;en&quot;</span>&gt;</span>
	<span class="hljs-tag">&lt;<span class="hljs-name">head</span>&gt;</span>
		<span class="hljs-tag">&lt;<span class="hljs-name">meta</span> <span class="hljs-attr">charset</span>=<span class="hljs-string">&quot;UTF-8&quot;</span> /&gt;</span>
		<span class="hljs-tag">&lt;<span class="hljs-name">meta</span> <span class="hljs-attr">name</span>=<span class="hljs-string">&quot;viewport&quot;</span> <span class="hljs-attr">content</span>=<span class="hljs-string">&quot;width=device-width, initial-scale=1.0&quot;</span> /&gt;</span>
		<span class="hljs-tag">&lt;<span class="hljs-name">title</span>&gt;</span>Document<span class="hljs-tag">&lt;/<span class="hljs-name">title</span>&gt;</span>
	<span class="hljs-tag">&lt;/<span class="hljs-name">head</span>&gt;</span>
	<span class="hljs-tag">&lt;<span class="hljs-name">body</span>&gt;</span>
		在這裡打點
		<span class="hljs-tag">&lt;<span class="hljs-name">b</span>&gt;</span>很粗的東西<span class="hljs-tag">&lt;/<span class="hljs-name">b</span>&gt;</span>
	<span class="hljs-tag">&lt;/<span class="hljs-name">body</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">html</span>&gt;</span></code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  <input type="checkbox" class="code-toggle" id="code-toggle-91">
        <label for="code-toggle-91" class="code-toggle-label"></label>
</div>
<p>為了方便操作我們把 VS Code 放到左邊，瀏覽器放到右邊，然後讓我們一次認識所有常見 HTML 吧！順帶一題我也會告訴你這些 HTML 語法原本的英文單字，可能會讓你比較好理解。</p>
<h2 id="標題-heading">標題 Heading</h2>
<p>首先是標題。標題有六種大小，分別是 <code>&lt;h1&gt;</code>、<code>&lt;h2&gt;</code>、<code>&lt;h3&gt;</code>、<code>&lt;h4&gt;</code>、<code>&lt;h5&gt;</code>、<code>&lt;h6&gt;</code>。</p>
<p>其實你不難可以發現，HTML 就是一個個的 <code>&lt;文字&gt;&lt;/文字&gt;</code>。前面是開頭，後面有個 <code>/</code> 就是結束。</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div><div class="ln">3</div><div class="ln">4</div><div class="ln">5</div><div class="ln">6</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-html hljs" data-lang="html"><span class="hljs-tag">&lt;<span class="hljs-name">h1</span>&gt;</span>Heading 1<span class="hljs-tag">&lt;/<span class="hljs-name">h1</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">h2</span>&gt;</span>Heading 2<span class="hljs-tag">&lt;/<span class="hljs-name">h2</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">h3</span>&gt;</span>Heading 3<span class="hljs-tag">&lt;/<span class="hljs-name">h3</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">h4</span>&gt;</span>Heading 4<span class="hljs-tag">&lt;/<span class="hljs-name">h4</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">h5</span>&gt;</span>Heading 5<span class="hljs-tag">&lt;/<span class="hljs-name">h5</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">h6</span>&gt;</span>Heading 6<span class="hljs-tag">&lt;/<span class="hljs-name">h6</span>&gt;</span></code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  <input type="checkbox" class="code-toggle" id="code-toggle-114">
        <label for="code-toggle-114" class="code-toggle-label"></label>
</div>
<blockquote>
<p>請從 <code>&lt;h1&gt;</code> 開始依序做使用，保持完整的架構。比如說 <code>&lt;h1&gt;</code> 底下一定會有 <code>&lt;h2&gt;</code> 然後才會有 <code>&lt;h3&gt;</code> 。</p>
</blockquote>
<h2 id="emmet">Emmet</h2>
<p>打到這裡你的手應該很酸了對吧（蛤你說你前面都複製貼上？）</p>
<p>你看我們每個元素都需要在那裡打小於、h、1、大於、標題、小於、斜線、大於。我的朋友甚至發現了一個偷吃步就是先打好一堆大於小於，然後再填空。</p>
<p>你知道工程師都是很懶的，所以 Сергей Чикуёнок 發明了 emmet。假如說你想建立一個 <code>&lt;h1&gt;</code> 元素你只需要打 <code>h1</code> 然後按 <code>tab</code> 就可以了。</p>
<p>emmet 還有很多語法我們之後遇到我會再提到。</p>
<p>
        <figure>
            <img src="/static/html/emmet.webp" alt="Сергей Чикуёнок" title="" width="399" height="399">
            <figcaption>Сергей Чикуёнок</figcaption>
        </figure>
    </p>
<p>Сергей Чикуёнок</p>
<h2 id="文字裝飾">文字裝飾</h2>
<p>以下是常的文字裝飾元素。</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div><div class="ln">3</div><div class="ln">4</div><div class="ln">5</div><div class="ln">6</div><div class="ln">7</div><div class="ln">8</div><div class="ln">9</div><div class="ln">10</div><div class="ln">11</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-html hljs" data-lang="html"><span class="hljs-tag">&lt;<span class="hljs-name">p</span>&gt;</span>
	段落
	<span class="hljs-tag">&lt;<span class="hljs-name">b</span>&gt;</span>粗體<span class="hljs-tag">&lt;/<span class="hljs-name">b</span>&gt;</span>
	<span class="hljs-tag">&lt;<span class="hljs-name">i</span>&gt;</span>斜體<span class="hljs-tag">&lt;/<span class="hljs-name">i</span>&gt;</span>
	<span class="hljs-tag">&lt;<span class="hljs-name">s</span>&gt;</span>刪除線<span class="hljs-tag">&lt;/<span class="hljs-name">s</span>&gt;</span>
	<span class="hljs-tag">&lt;<span class="hljs-name">u</span>&gt;</span>底線<span class="hljs-tag">&lt;/<span class="hljs-name">u</span>&gt;</span>
	H
	<span class="hljs-tag">&lt;<span class="hljs-name">sup</span>&gt;</span>+<span class="hljs-tag">&lt;/<span class="hljs-name">sup</span>&gt;</span>
	CO
	<span class="hljs-tag">&lt;<span class="hljs-name">sub</span>&gt;</span>2<span class="hljs-tag">&lt;/<span class="hljs-name">sub</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span></code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  <input type="checkbox" class="code-toggle" id="code-toggle-143">
        <label for="code-toggle-143" class="code-toggle-label"></label>
</div>
<ul>
<li><code>&lt;p&gt;</code> 元素代表段落區塊 (paragraph)</li>
<li><code>&lt;b&gt;</code> 是粗體 (bold)</li>
<li><code>&lt;i&gt;</code> 是斜體 (italic)</li>
<li><code>&lt;s&gt;</code> 是劃掉 (strike)</li>
<li><code>&lt;u&gt;</code> 是底線 (underline)</li>
<li><code>&lt;sup&gt;</code> 是上標 (superscript)</li>
<li><code>&lt;sub&gt;</code> 是下標 (subscript)</li>
</ul>
<p>你可以記 super 在上面，而訂閱按鈕 Subscribe 在影片下方等你去按。</p>
<p><strong>粗體</strong> <em>斜體</em> <s>刪除線</s> 底線 $H^+$ $CO_2$</p>
<h2 id="無序清單">無序清單</h2>
<p>無序清單是用 <code>&lt;ul&gt;</code> 元素建立的，而清單內的每一個項目都是 <code>&lt;li&gt;</code> 元素。</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div><div class="ln">3</div><div class="ln">4</div><div class="ln">5</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-html hljs" data-lang="html"><span class="hljs-tag">&lt;<span class="hljs-name">ul</span>&gt;</span>
	<span class="hljs-tag">&lt;<span class="hljs-name">li</span>&gt;</span>a<span class="hljs-tag">&lt;/<span class="hljs-name">li</span>&gt;</span>
	<span class="hljs-tag">&lt;<span class="hljs-name">li</span>&gt;</span>b<span class="hljs-tag">&lt;/<span class="hljs-name">li</span>&gt;</span>
	<span class="hljs-tag">&lt;<span class="hljs-name">li</span>&gt;</span>c<span class="hljs-tag">&lt;/<span class="hljs-name">li</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">ul</span>&gt;</span></code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<ul>
<li>a</li>
<li>b</li>
<li>c</li>
</ul>
<div class="notice">
 💡
<p>這裡我們想要 ul 裡面有三個 li 可以打 <code>ul&gt;li*3</code> 然後點 <code>Tab</code> 即可一次完成。</p>
</div>
<h2 id="有序清單">有序清單</h2>
<p>有序清單是用 <code>&lt;ol&gt;</code> 元素建立的，而清單內的每一個項目都是 <code>&lt;li&gt;</code> 元素。</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div><div class="ln">3</div><div class="ln">4</div><div class="ln">5</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-html hljs" data-lang="html"><span class="hljs-tag">&lt;<span class="hljs-name">ol</span>&gt;</span>
	<span class="hljs-tag">&lt;<span class="hljs-name">li</span>&gt;</span>a<span class="hljs-tag">&lt;/<span class="hljs-name">li</span>&gt;</span>
	<span class="hljs-tag">&lt;<span class="hljs-name">li</span>&gt;</span>b<span class="hljs-tag">&lt;/<span class="hljs-name">li</span>&gt;</span>
	<span class="hljs-tag">&lt;<span class="hljs-name">li</span>&gt;</span>c<span class="hljs-tag">&lt;/<span class="hljs-name">li</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">ol</span>&gt;</span></code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<ol>
<li>a</li>
<li>b</li>
<li>c</li>
</ol>
<h2 id="巢狀清單">巢狀清單</h2>
<p>清單裡可以有清單，只要把清單放在 <code>&lt;li&gt;</code> 元素裡就可以了。</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div><div class="ln">3</div><div class="ln">4</div><div class="ln">5</div><div class="ln">6</div><div class="ln">7</div><div class="ln">8</div><div class="ln">9</div><div class="ln">10</div><div class="ln">11</div><div class="ln">12</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-html hljs" data-lang="html"><span class="hljs-tag">&lt;<span class="hljs-name">ul</span>&gt;</span>
	<span class="hljs-tag">&lt;<span class="hljs-name">li</span>&gt;</span>玉米濃湯<span class="hljs-tag">&lt;/<span class="hljs-name">li</span>&gt;</span>
	<span class="hljs-tag">&lt;<span class="hljs-name">li</span>&gt;</span>鮪魚吐司<span class="hljs-tag">&lt;/<span class="hljs-name">li</span>&gt;</span>
	<span class="hljs-tag">&lt;<span class="hljs-name">li</span>&gt;</span>
		薯條
		<span class="hljs-tag">&lt;<span class="hljs-name">ul</span>&gt;</span>
			<span class="hljs-tag">&lt;<span class="hljs-name">li</span>&gt;</span>鹽味<span class="hljs-tag">&lt;/<span class="hljs-name">li</span>&gt;</span>
			<span class="hljs-tag">&lt;<span class="hljs-name">li</span>&gt;</span>胡椒鹽<span class="hljs-tag">&lt;/<span class="hljs-name">li</span>&gt;</span>
			<span class="hljs-tag">&lt;<span class="hljs-name">li</span>&gt;</span>番茄醬<span class="hljs-tag">&lt;/<span class="hljs-name">li</span>&gt;</span>
		<span class="hljs-tag">&lt;/<span class="hljs-name">ul</span>&gt;</span>
	<span class="hljs-tag">&lt;/<span class="hljs-name">li</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">ul</span>&gt;</span></code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  <input type="checkbox" class="code-toggle" id="code-toggle-213">
        <label for="code-toggle-213" class="code-toggle-label"></label>
</div>
<ul>
<li>玉米濃湯</li>
<li>鮪魚吐司</li>
<li>薯條
<ul>
<li>鹽味</li>
<li>胡椒鹽</li>
<li>番茄醬</li>
</ul>
</li>
</ul>
<h2 id="空白與換行">空白與換行</h2>
<p>也許你有發現，在 HTML 中一個以上的 tab、空格、換行都視為一個空格，因此你想按幾個 enter 幾個空白都行，來保持程式的簡潔。但是如果你想要換行的話，你可以使用 `` 元素換行，<code>&lt;hr&gt;</code> 插入分隔線 (Horizontal Rule)。</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div><div class="ln">3</div><div class="ln">4</div><div class="ln">5</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-html hljs" data-lang="html">橫線
<span class="hljs-tag">&lt;<span class="hljs-name">hr</span> /&gt;</span>
換行
<span class="hljs-tag">&lt;<span class="hljs-name">br</span> /&gt;</span>
文字</code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<p>這兩個是插入一個元素而不是指定範圍，因此習慣後面會用 <code>/&gt;</code> 結尾，但如果你要打 ``或<code>&lt;hr&gt;</code> 瀏覽器也看得懂。HTML 是一種「好啦隨便，我看得懂就好」的語言，因此你就算用大寫，或著是屬性引號不加也沒關係，但是為了你以後不會被同學或同事暗殺我還是建議你遵守慣例。</p>
<h2 id="格式化程式碼">格式化程式碼</h2>
<p>對了既然講到維持程式碼的簡潔，通常放在裡面的東西會按一個 tab，除非是 <code>&lt;b&gt;</code> 這種在段落文字中間的（這種不會換行的元素叫行內元素）。比如說前面的 <code>&lt;ul&gt;</code>、<code>&lt;li&gt;</code> 之間有一格 tab。</p>
<p>而你的 VS Code 很聰明的可以幫你自己加上。你只需要按 <code>Alt</code> + <code>Shift</code> + <code>F</code> （macOS：<code>Option</code> + <code>Shift</code> + <code>F</code> ）就可以自動完成格式化囉！</p>
<h2 id="超連結">超連結</h2>
<p>假設你想要連結到某個網站，你可以使用 <code>&lt;a&gt;</code> (anchor) 元素，並在 <code>href</code> (hypertext reference) 屬性中指定連結的網址，而在 <code>&lt;a&gt;</code> 元素中間的文字就是連結的文字。</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-html hljs" data-lang="html"><span class="hljs-tag">&lt;<span class="hljs-name">a</span> <span class="hljs-attr">href</span>=<span class="hljs-string">&quot;連結&quot;</span>&gt;</span>顯示文字<span class="hljs-tag">&lt;/<span class="hljs-name">a</span>&gt;</span></code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<p>哦出現新語法了！我們講到了屬性。這是 HTML 唯一的一個 feature。格式是：</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-html hljs" data-lang="html"><span class="hljs-tag">&lt;<span class="hljs-name">元素名稱</span> <span class="hljs-attr">屬性</span>=<span class="hljs-string">&quot;屬性值&quot;</span>&gt;</span></code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<p>比如說我們要連結到 Google 首頁，我們可以這樣寫：</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-html hljs" data-lang="html"><span class="hljs-tag">&lt;<span class="hljs-name">a</span> <span class="hljs-attr">href</span>=<span class="hljs-string">&quot;https://www.google.com&quot;</span>&gt;</span>Goolge<span class="hljs-tag">&lt;/<span class="hljs-name">a</span>&gt;</span></code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<p><a href="https://www.google.com/">Google</a></p>
<h3 id="id">ID</h3>
<p>連結也可以連結到同一個網頁的某個位置。我們可以幫元素建立 id 並只要在 <code>href</code> 屬性中指定位置的 id 就可以了，而在 <code>&lt;a&gt;</code> 元素中間的文字就是連結的文字。</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div><div class="ln">3</div><div class="ln">4</div><div class="ln">5</div><div class="ln">6</div><div class="ln">7</div><div class="ln">8</div><div class="ln">9</div><div class="ln">10</div><div class="ln">11</div><div class="ln">12</div><div class="ln">13</div><div class="ln">14</div><div class="ln">15</div><div class="ln">16</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-html hljs" data-lang="html"><span class="hljs-tag">&lt;<span class="hljs-name">a</span> <span class="hljs-attr">href</span>=<span class="hljs-string">&quot;#image&quot;</span>&gt;</span>跑去圖片<span class="hljs-tag">&lt;/<span class="hljs-name">a</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">br</span> /&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">br</span> /&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">br</span> /&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">br</span> /&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">br</span> /&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">br</span> /&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">br</span> /&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">br</span> /&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">br</span> /&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">br</span> /&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">br</span> /&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">br</span> /&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">br</span> /&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">br</span> /&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">h3</span> <span class="hljs-attr">id</span>=<span class="hljs-string">&quot;image&quot;</span>&gt;</span>圖片<span class="hljs-tag">&lt;/<span class="hljs-name">h3</span>&gt;</span></code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  <input type="checkbox" class="code-toggle" id="code-toggle-281">
        <label for="code-toggle-281" class="code-toggle-label"></label>
</div>
<p><a href="https://www.notion.so/1-2-03-16-HTML-3257dadd804080e48762de2878c93ef1?pvs=21">跑去圖片</a></p>
<h2 id="圖片">圖片</h2>
<p>如果你想要插入圖片，你可以使用 <code>&lt;img&gt;</code> (image) 元素，並在 <code>src</code> (source) 屬性中指定圖片的來源，<code>alt</code> ( alternative text) 屬性中填入圖片的敘述。如果圖片無法顯示時就會使用這個替代文字，而 Google 也會透過這個文字了解圖片內容。</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-html hljs" data-lang="html"><span class="hljs-tag">&lt;<span class="hljs-name">img</span> <span class="hljs-attr">src</span>=<span class="hljs-string">&quot;來源&quot;</span> <span class="hljs-attr">alt</span>=<span class="hljs-string">&quot;文字敘述&quot;</span> /&gt;</span></code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<p>比如說這個是從 Google 首頁抓下來的圖片，我們可以這樣寫：</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-html hljs" data-lang="html"><span class="hljs-tag">&lt;<span class="hljs-name">img</span> <span class="hljs-attr">src</span>=<span class="hljs-string">&quot;&lt;https://www.google.com/images/branding/googlelogo/1x/googlelogo_color_272x92dp.png&gt;&quot;</span> <span class="hljs-attr">alt</span>=<span class="hljs-string">&quot;Google&quot;</span> /&gt;</span></code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<p>
        <figure>
            <img src="https://www.google.com/images/branding/googlelogo/1x/googlelogo_color_272x92dp.png" alt="" title="" >
            
        </figure>
    </p>
<h2 id="相對路徑與絕對路徑">相對路徑與絕對路徑</h2>
<p>在程式中要放入圖片等素材或是放網址的時候都可以使用相對路徑或是絕對路徑。</p>
<p>絕對路徑就是 https:// 開頭這種網址，而相對路徑就是「請你往外一個資料夾，然後去某個資料夾找某個檔案」這種像是導航的指示路徑。</p>
<p>比如說我的檔案結構如下：</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div><div class="ln">3</div><div class="ln">4</div><div class="ln">5</div><div class="ln">6</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-css hljs" data-lang="css">├── about
│   └── index<span class="hljs-selector-class">.html</span>
├── <span class="hljs-selector-tag">img</span>
│   └── <span class="hljs-selector-tag">image</span><span class="hljs-selector-class">.png</span>
├── index<span class="hljs-selector-class">.html</span>
└── logo<span class="hljs-selector-class">.png</span></code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  <input type="checkbox" class="code-toggle" id="code-toggle-326">
        <label for="code-toggle-326" class="code-toggle-label"></label>
</div>
<p>我現在在首頁的 <code>index.html</code> 想要讀 <code>logo.png</code>，我可以直接這樣寫。</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-html hljs" data-lang="html"><span class="hljs-tag">&lt;<span class="hljs-name">img</span> <span class="hljs-attr">src</span>=<span class="hljs-string">&quot;./logo.png&quot;</span> /&gt;</span>
同個資料夾裡面的 logo.png</code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<p>而如果我想要的是 <code>img/image.png</code> 我可以這樣寫：</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-html hljs" data-lang="html"><span class="hljs-tag">&lt;<span class="hljs-name">img</span> <span class="hljs-attr">src</span>=<span class="hljs-string">&quot;./img/logo.png&quot;</span> /&gt;</span>
img 資料夾裡面的 logo.png</code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<p>如果我現在在分頁 <code>about/index.html</code> 想要讀放在外面的 <code>logo.png</code> 可以寫說請你往外一個資料夾： <code>../</code> 。</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-html hljs" data-lang="html"><span class="hljs-tag">&lt;<span class="hljs-name">img</span> <span class="hljs-attr">src</span>=<span class="hljs-string">&quot;../logo.png&quot;</span> /&gt;</span>
外面一個資料夾的 logo.png</code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<p>如果你很很深的分頁要讀很外面的東西就是：</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-html hljs" data-lang="html"><span class="hljs-tag">&lt;<span class="hljs-name">img</span> <span class="hljs-attr">src</span>=<span class="hljs-string">&quot;../../../../../../../logo.png&quot;</span> /&gt;</span>
好幾層資料夾外面的 logo.png</code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<p>但這樣就很醜很難搞清楚有多少個，所以你也可以從網站根頁面（首頁）開始算：</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-html hljs" data-lang="html"><span class="hljs-tag">&lt;<span class="hljs-name">img</span> <span class="hljs-attr">src</span>=<span class="hljs-string">&quot;/logo.png&quot;</span> /&gt;</span>
最外面往裡面的 logo.png</code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<hr>
<p>東西大多都可以包在連結裡面，比如說一張圖片，只要把 <code>&lt;img&gt;</code> 元素放在 <code>&lt;a&gt;</code> 元素裡就可以了。</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div><div class="ln">3</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-html hljs" data-lang="html"><span class="hljs-tag">&lt;<span class="hljs-name">a</span> <span class="hljs-attr">href</span>=<span class="hljs-string">&quot;&lt;https://www.google.com/&gt;&quot;</span>&gt;</span>
	<span class="hljs-tag">&lt;<span class="hljs-name">img</span> <span class="hljs-attr">src</span>=<span class="hljs-string">&quot;&lt;https://www.google.com/images/branding/googlelogo/1x/googlelogo_color_272x92dp.png&gt;&quot;</span> <span class="hljs-attr">alt</span>=<span class="hljs-string">&quot;Google&quot;</span> /&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">a</span>&gt;</span></code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<h2 id="表格">表格</h2>
<p>表格是用 <code>&lt;table&gt;</code> 元素建立的，而表格內的每一排都是 <code>&lt;tr&gt;</code> (table row) 元素，而每一個格子都是 <code>&lt;td&gt;</code> (table data) 元素，而表格的標題則是 <code>&lt;th&gt;</code> (table header) 元素。</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div><div class="ln">3</div><div class="ln">4</div><div class="ln">5</div><div class="ln">6</div><div class="ln">7</div><div class="ln">8</div><div class="ln">9</div><div class="ln">10</div><div class="ln">11</div><div class="ln">12</div><div class="ln">13</div><div class="ln">14</div><div class="ln">15</div><div class="ln">16</div><div class="ln">17</div><div class="ln">18</div><div class="ln">19</div><div class="ln">20</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-html hljs" data-lang="html"><span class="hljs-tag">&lt;<span class="hljs-name">table</span>&gt;</span>
	<span class="hljs-tag">&lt;<span class="hljs-name">tr</span>&gt;</span>
		<span class="hljs-tag">&lt;<span class="hljs-name">th</span>&gt;</span>國家<span class="hljs-tag">&lt;/<span class="hljs-name">th</span>&gt;</span>
		<span class="hljs-tag">&lt;<span class="hljs-name">th</span>&gt;</span>首都<span class="hljs-tag">&lt;/<span class="hljs-name">th</span>&gt;</span>
		<span class="hljs-tag">&lt;<span class="hljs-name">th</span>&gt;</span>人口<span class="hljs-tag">&lt;/<span class="hljs-name">th</span>&gt;</span>
		<span class="hljs-tag">&lt;<span class="hljs-name">th</span>&gt;</span>語言<span class="hljs-tag">&lt;/<span class="hljs-name">th</span>&gt;</span>
	<span class="hljs-tag">&lt;/<span class="hljs-name">tr</span>&gt;</span>
	<span class="hljs-tag">&lt;<span class="hljs-name">tr</span>&gt;</span>
		<span class="hljs-tag">&lt;<span class="hljs-name">td</span>&gt;</span>USA<span class="hljs-tag">&lt;/<span class="hljs-name">td</span>&gt;</span>
		<span class="hljs-tag">&lt;<span class="hljs-name">td</span>&gt;</span>Washington D.C.<span class="hljs-tag">&lt;/<span class="hljs-name">td</span>&gt;</span>
		<span class="hljs-tag">&lt;<span class="hljs-name">td</span>&gt;</span>309 million<span class="hljs-tag">&lt;/<span class="hljs-name">td</span>&gt;</span>
		<span class="hljs-tag">&lt;<span class="hljs-name">td</span>&gt;</span>English<span class="hljs-tag">&lt;/<span class="hljs-name">td</span>&gt;</span>
	<span class="hljs-tag">&lt;/<span class="hljs-name">tr</span>&gt;</span>
	<span class="hljs-tag">&lt;<span class="hljs-name">tr</span>&gt;</span>
		<span class="hljs-tag">&lt;<span class="hljs-name">td</span>&gt;</span>Sweden<span class="hljs-tag">&lt;/<span class="hljs-name">td</span>&gt;</span>
		<span class="hljs-tag">&lt;<span class="hljs-name">td</span>&gt;</span>Stockholm<span class="hljs-tag">&lt;/<span class="hljs-name">td</span>&gt;</span>
		<span class="hljs-tag">&lt;<span class="hljs-name">td</span>&gt;</span>9 million<span class="hljs-tag">&lt;/<span class="hljs-name">td</span>&gt;</span>
		<span class="hljs-tag">&lt;<span class="hljs-name">td</span>&gt;</span>Swedish<span class="hljs-tag">&lt;/<span class="hljs-name">td</span>&gt;</span>
	<span class="hljs-tag">&lt;/<span class="hljs-name">tr</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">table</span>&gt;</span></code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  <input type="checkbox" class="code-toggle" id="code-toggle-384">
        <label for="code-toggle-384" class="code-toggle-label"></label>
</div>
<div class='table-wrapper'><table><thead>
<tr>
<th>國家</th>
<th>首都</th>
<th>人口</th>
<th>語言</th>
</tr>
</thead>
<tbody>
<tr>
<td>USA</td>
<td>Washington D.C.</td>
<td>309 million</td>
<td>English</td>
</tr>
<tr>
<td>Sweden</td>
<td>Stockholm</td>
<td>9 million</td>
<td>Swedish</td>
</tr>
</tbody>
</table></div><p>你可以使用 <code>&lt;thead&gt;</code> (table header), <code>&lt;tbody&gt;</code> (table body) 和 <code>&lt;tfoot&gt;</code> (table footer) 元素來區分表格的不同部分，這樣有助於瀏覽器和搜尋引擎了解表格的結構。</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div><div class="ln">3</div><div class="ln">4</div><div class="ln">5</div><div class="ln">6</div><div class="ln">7</div><div class="ln">8</div><div class="ln">9</div><div class="ln">10</div><div class="ln">11</div><div class="ln">12</div><div class="ln">13</div><div class="ln">14</div><div class="ln">15</div><div class="ln">16</div><div class="ln">17</div><div class="ln">18</div><div class="ln">19</div><div class="ln">20</div><div class="ln">21</div><div class="ln">22</div><div class="ln">23</div><div class="ln">24</div><div class="ln">25</div><div class="ln">26</div><div class="ln">27</div><div class="ln">28</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-html hljs" data-lang="html"><span class="hljs-tag">&lt;<span class="hljs-name">table</span>&gt;</span>
	<span class="hljs-tag">&lt;<span class="hljs-name">thead</span>&gt;</span>
		<span class="hljs-tag">&lt;<span class="hljs-name">tr</span>&gt;</span>
			<span class="hljs-tag">&lt;<span class="hljs-name">th</span>&gt;</span>項目<span class="hljs-tag">&lt;/<span class="hljs-name">th</span>&gt;</span>
			<span class="hljs-tag">&lt;<span class="hljs-name">th</span>&gt;</span>金額<span class="hljs-tag">&lt;/<span class="hljs-name">th</span>&gt;</span>
		<span class="hljs-tag">&lt;/<span class="hljs-name">tr</span>&gt;</span>
	<span class="hljs-tag">&lt;/<span class="hljs-name">thead</span>&gt;</span>
	<span class="hljs-tag">&lt;<span class="hljs-name">tbody</span>&gt;</span>
		<span class="hljs-tag">&lt;<span class="hljs-name">tr</span>&gt;</span>
			<span class="hljs-tag">&lt;<span class="hljs-name">td</span>&gt;</span>iPhone 11<span class="hljs-tag">&lt;/<span class="hljs-name">td</span>&gt;</span>
			<span class="hljs-tag">&lt;<span class="hljs-name">td</span>&gt;</span>$24,900<span class="hljs-tag">&lt;/<span class="hljs-name">td</span>&gt;</span>
		<span class="hljs-tag">&lt;/<span class="hljs-name">tr</span>&gt;</span>
		<span class="hljs-tag">&lt;<span class="hljs-name">tr</span>&gt;</span>
			<span class="hljs-tag">&lt;<span class="hljs-name">td</span>&gt;</span>AirPods<span class="hljs-tag">&lt;/<span class="hljs-name">td</span>&gt;</span>
			<span class="hljs-tag">&lt;<span class="hljs-name">td</span>&gt;</span>$6,490<span class="hljs-tag">&lt;/<span class="hljs-name">td</span>&gt;</span>
		<span class="hljs-tag">&lt;/<span class="hljs-name">tr</span>&gt;</span>
		<span class="hljs-tag">&lt;<span class="hljs-name">tr</span>&gt;</span>
			<span class="hljs-tag">&lt;<span class="hljs-name">td</span>&gt;</span>iPad Pro<span class="hljs-tag">&lt;/<span class="hljs-name">td</span>&gt;</span>
			<span class="hljs-tag">&lt;<span class="hljs-name">td</span>&gt;</span>$25,900<span class="hljs-tag">&lt;/<span class="hljs-name">td</span>&gt;</span>
		<span class="hljs-tag">&lt;/<span class="hljs-name">tr</span>&gt;</span>
	<span class="hljs-tag">&lt;/<span class="hljs-name">tbody</span>&gt;</span>
	<span class="hljs-tag">&lt;<span class="hljs-name">tfoot</span>&gt;</span>
		<span class="hljs-tag">&lt;<span class="hljs-name">tr</span>&gt;</span>
			<span class="hljs-tag">&lt;<span class="hljs-name">th</span>&gt;</span>總金額<span class="hljs-tag">&lt;/<span class="hljs-name">th</span>&gt;</span>
			<span class="hljs-tag">&lt;<span class="hljs-name">td</span>&gt;</span>$57,290<span class="hljs-tag">&lt;/<span class="hljs-name">td</span>&gt;</span>
		<span class="hljs-tag">&lt;/<span class="hljs-name">tr</span>&gt;</span>
	<span class="hljs-tag">&lt;/<span class="hljs-name">tfoot</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">table</span>&gt;</span></code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  <input type="checkbox" class="code-toggle" id="code-toggle-414">
        <label for="code-toggle-414" class="code-toggle-label"></label>
</div>
<div class='table-wrapper'><table><thead>
<tr>
<th>項目</th>
<th>金額</th>
</tr>
</thead>
<tbody>
<tr>
<td>iPhone 11</td>
<td>$24,900</td>
</tr>
<tr>
<td>AirPods</td>
<td>$6,490</td>
</tr>
<tr>
<td>iPad Pro</td>
<td>$25,900</td>
</tr>
<tr>
<td><strong>總金額</strong></td>
<td>$57,290</td>
</tr>
</tbody>
</table></div><h3 id="合併儲存格：colspan-和-rowspan-屬性">合併儲存格：colspan 和 rowspan 屬性</h3>
<p>合併表格可以利用 <code>&lt;td&gt;</code> 和 <code>&lt;th&gt;</code> 標籤上的 colspan 和 rowspan 屬性，colspan 是用來水平合併多行 (column) 的儲存格，rowspan 則用來垂直合併多列 (row) 的儲存格。</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div><div class="ln">3</div><div class="ln">4</div><div class="ln">5</div><div class="ln">6</div><div class="ln">7</div><div class="ln">8</div><div class="ln">9</div><div class="ln">10</div><div class="ln">11</div><div class="ln">12</div><div class="ln">13</div><div class="ln">14</div><div class="ln">15</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-html hljs" data-lang="html"><span class="hljs-tag">&lt;<span class="hljs-name">table</span>&gt;</span>
	<span class="hljs-tag">&lt;<span class="hljs-name">tr</span>&gt;</span>
		<span class="hljs-tag">&lt;<span class="hljs-name">th</span>&gt;</span>1<span class="hljs-tag">&lt;/<span class="hljs-name">th</span>&gt;</span>
		<span class="hljs-tag">&lt;<span class="hljs-name">th</span>&gt;</span>2<span class="hljs-tag">&lt;/<span class="hljs-name">th</span>&gt;</span>
		<span class="hljs-tag">&lt;<span class="hljs-name">th</span>&gt;</span>3<span class="hljs-tag">&lt;/<span class="hljs-name">th</span>&gt;</span>
	<span class="hljs-tag">&lt;/<span class="hljs-name">tr</span>&gt;</span>
	<span class="hljs-tag">&lt;<span class="hljs-name">tr</span>&gt;</span>
		<span class="hljs-tag">&lt;<span class="hljs-name">td</span>&gt;</span>4<span class="hljs-tag">&lt;/<span class="hljs-name">td</span>&gt;</span>
		<span class="hljs-tag">&lt;<span class="hljs-name">td</span>&gt;</span>5<span class="hljs-tag">&lt;/<span class="hljs-name">td</span>&gt;</span>
		<span class="hljs-tag">&lt;<span class="hljs-name">td</span> <span class="hljs-attr">rowspan</span>=<span class="hljs-string">&quot;2&quot;</span>&gt;</span>6<span class="hljs-tag">&lt;/<span class="hljs-name">td</span>&gt;</span>
	<span class="hljs-tag">&lt;/<span class="hljs-name">tr</span>&gt;</span>
	<span class="hljs-tag">&lt;<span class="hljs-name">tr</span>&gt;</span>
		<span class="hljs-tag">&lt;<span class="hljs-name">td</span> <span class="hljs-attr">colspan</span>=<span class="hljs-string">&quot;2&quot;</span>&gt;</span>7<span class="hljs-tag">&lt;/<span class="hljs-name">td</span>&gt;</span>
	<span class="hljs-tag">&lt;/<span class="hljs-name">tr</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">table</span>&gt;</span></code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  <input type="checkbox" class="code-toggle" id="code-toggle-456">
        <label for="code-toggle-456" class="code-toggle-label"></label>
</div>
<p>效果大概長這樣，右邊是我加了一點點 CSS 添加 border 邊框的版本：</p>
<table>
	<tr>
		<th>1</th>
		<th>2</th>
		<th>3</th>
	</tr>
	<tr>
		<td>4</td>
		<td>5</td>
		<td rowspan="2">6</td>
	</tr>
	<tr>
		<td colspan="2">7</td>
	</tr>
</table>
<h2 id="輸入框">輸入框</h2>
<p>接下來是輸入框，輸入框是用 <code>&lt;input&gt;</code> 元素建立的，而 <code>&lt;input&gt;</code> 元素有很多種類，我們可以用 <code>type</code> 屬性來指定，比如說我們要建立一個文字輸入框，我們可以這樣寫：</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-html hljs" data-lang="html"><span class="hljs-tag">&lt;<span class="hljs-name">input</span> <span class="hljs-attr">type</span>=<span class="hljs-string">&quot;text&quot;</span> /&gt;</span></code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<input type="text" />
<p>如果給他加入 <code>value</code> 屬性，就可以預設輸入框的內容了：</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-html hljs" data-lang="html"><span class="hljs-tag">&lt;<span class="hljs-name">input</span> <span class="hljs-attr">type</span>=<span class="hljs-string">&quot;text&quot;</span> <span class="hljs-attr">value</span>=<span class="hljs-string">&quot;Hello World!&quot;</span> /&gt;</span></code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<input type="text" value="Hello World!" />
<p>而如果我們要建立一個密碼輸入框，我們可以這樣寫：</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-html hljs" data-lang="html"><span class="hljs-tag">&lt;<span class="hljs-name">input</span> <span class="hljs-attr">type</span>=<span class="hljs-string">&quot;password&quot;</span> /&gt;</span></code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<input type="password" />
<p>輸入的內容會被隱藏，而且會用星號或圓點代替。</p>
<p>如果我們要建立一個勾選框，我們可以這樣寫：</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-html hljs" data-lang="html"><span class="hljs-tag">&lt;<span class="hljs-name">input</span> <span class="hljs-attr">type</span>=<span class="hljs-string">&quot;checkbox&quot;</span> /&gt;</span>
To-do</code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<ul>
<li>[ ] To-do</li>
</ul>
<p>如果我們要建立一個單選框，我們可以這樣寫：</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div><div class="ln">3</div><div class="ln">4</div><div class="ln">5</div><div class="ln">6</div><div class="ln">7</div><div class="ln">8</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-html hljs" data-lang="html"><span class="hljs-tag">&lt;<span class="hljs-name">input</span> <span class="hljs-attr">type</span>=<span class="hljs-string">&quot;radio&quot;</span> <span class="hljs-attr">name</span>=<span class="hljs-string">&quot;color&quot;</span> <span class="hljs-attr">value</span>=<span class="hljs-string">&quot;red&quot;</span> /&gt;</span>
red
<span class="hljs-tag">&lt;<span class="hljs-name">br</span> /&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">input</span> <span class="hljs-attr">type</span>=<span class="hljs-string">&quot;radio&quot;</span> <span class="hljs-attr">name</span>=<span class="hljs-string">&quot;color&quot;</span> <span class="hljs-attr">value</span>=<span class="hljs-string">&quot;green&quot;</span> /&gt;</span>
green
<span class="hljs-tag">&lt;<span class="hljs-name">br</span> /&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">input</span> <span class="hljs-attr">type</span>=<span class="hljs-string">&quot;radio&quot;</span> <span class="hljs-attr">name</span>=<span class="hljs-string">&quot;color&quot;</span> <span class="hljs-attr">value</span>=<span class="hljs-string">&quot;blue&quot;</span> /&gt;</span>
blue</code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  <input type="checkbox" class="code-toggle" id="code-toggle-531">
        <label for="code-toggle-531" class="code-toggle-label"></label>
</div>
<input type="radio" name="color" value="red" />
red
<br />
<input type="radio" name="color" value="green" />
green
<br />
<input type="radio" name="color" value="blue" />
blue
<p>記住，radio 是只能選一個的，就想你的收音機一樣，你一次只能聽一個頻道。</p>
<p>我們在 HTML 裡面會使用 <code>name</code> 屬性來指定一組單選框，這樣瀏覽器才知道這些單選框是一組的。而 value 代表了選擇他的值，比如說我們選擇了 red，那麼瀏覽器就會把 red 的值傳給伺服器。</p>
<p>HTML 還有很多種輸入框，比如說日期、時間、檔案、顏色等等，有興趣可以參考 MDN。</p>
<blockquote>
<p>延伸閱讀：https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/input</p>
</blockquote>
<h2 id="互動元素">互動元素</h2>
<p>最後我們來介紹幾個有趣的互動元素：</p>
<h3 id="按鈕">按鈕</h3>
<p>按鈕是用 <code>&lt;button&gt;</code> 元素建立的。</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-html hljs" data-lang="html"><span class="hljs-tag">&lt;<span class="hljs-name">button</span>&gt;</span>Click me!<span class="hljs-tag">&lt;/<span class="hljs-name">button</span>&gt;</span></code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<p><button>Click me!</button></p>
<p>現在我們不會寫 JavaScript 所以就把它當作舒壓玩具吧。</p>
<h3 id="iframe">iframe</h3>
<p>iframe 是用來嵌入網頁的，比如說我們要嵌入 YouTube 影片，你可以到 YouTube 影片的分享裡面，點選嵌入，然後複製貼上到你的網頁裡面：</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-html hljs" data-lang="html"><span class="hljs-tag">&lt;<span class="hljs-name">iframe</span> <span class="hljs-attr">width</span>=<span class="hljs-string">&quot;560&quot;</span> <span class="hljs-attr">height</span>=<span class="hljs-string">&quot;315&quot;</span> <span class="hljs-attr">src</span>=<span class="hljs-string">&quot;https://www.youtube-nocookie.com/embed/IxX_QHay02M?si=deCPLpJ2e9ZAZu2F&quot;</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">iframe</span>&gt;</span></code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<iframe width="560" height="315" src="https://www.youtube-nocookie.com/embed/IxX_QHay02M?si=deCPLpJ2e9ZAZu2F"></iframe>
<h3 id="audio">audio</h3>
<p>Audio 是用來播放音樂的，我們可以用 <code>&lt;audio&gt;</code> 元素建立，然後用 <code>src</code> 屬性指定音樂的網址：</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-html hljs" data-lang="html"><span class="hljs-tag">&lt;<span class="hljs-name">audio</span> <span class="hljs-attr">src</span>=<span class="hljs-string">&quot;https://www.soundhelix.com/examples/mp3/SoundHelix-Song-1.mp3&quot;</span> <span class="hljs-attr">controls</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">audio</span>&gt;</span></code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<p><audio src="https://www.soundhelix.com/examples/mp3/SoundHelix-Song-1.mp3" controls></audio></p>
<p>如果加入 <code>controls</code> 屬性，就會顯示播放器，讓使用者可以控制音樂的播放。</p>
<h3 id="video">video</h3>
<p>Video 是用來播放影片的，我們可以用 <code>&lt;video&gt;</code> 元素建立，然後用 <code>src</code> 屬性指定影片的網址：</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-html hljs" data-lang="html"><span class="hljs-tag">&lt;<span class="hljs-name">video</span> <span class="hljs-attr">src</span>=<span class="hljs-string">&quot;https://cdn.emtech.cc/spinning-fish.mp4&quot;</span> <span class="hljs-attr">controls</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">video</span>&gt;</span></code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<p><video src="https://cdn.emtech.cc/spinning-fish.mp4" controls></video></p>
<p>如果加入 <code>controls</code> 屬性就可以讓使用者控制影片的播放。</p>
<h3 id="div">div</h3>
<p>我們在建立網站時，通常會把網站分成幾個區塊，比如說標題、導覽列、內容、側邊欄、頁尾等等來方便我們做排版。這時我們可以使用 <code>&lt;div&gt;</code> 元素來建立這些區塊，比如說你想建立一個提示框你可以這樣寫：</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div><div class="ln">3</div><div class="ln">4</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-html hljs" data-lang="html"><span class="hljs-tag">&lt;<span class="hljs-name">div</span>&gt;</span>
	<span class="hljs-tag">&lt;<span class="hljs-name">h2</span>&gt;</span>注意<span class="hljs-tag">&lt;/<span class="hljs-name">h2</span>&gt;</span>
	<span class="hljs-tag">&lt;<span class="hljs-name">p</span>&gt;</span>感謝你的注意<span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span></code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  
</div>
<p>再加上一點點 CSS 就可以做到</p>
<div class="notice">
<p><strong>注意</strong></p>
<p>感謝你的注意</p>
</div>
<h3 id="html5-版面">HTML5 版面</h3>
<p>但是 <code>div</code> 元素只是一個區塊，並沒有說明這個區塊是什麼，因此我們可以使用 HTML5 的版面來建立這些區塊。HTML5 新增了 <code>&lt;header&gt;</code>、<code>&lt;nav&gt;</code>、<code>&lt;main&gt;</code>、<code>&lt;section&gt;</code>、<code>&lt;article&gt;</code>、<code>&lt;aside&gt;</code>、<code>&lt;footer&gt;</code> 這些元素（其實還有更多並且持續增加中…），我們可以用這些元素來建立版面。比如說我們要建立一個網站的版面，我們可以這樣寫：</p>
<div class="code-block emfont-FiraMono">
  <div class="highlight">
    <div class="code-wrapper">
      <div class="line-numbers">
        <div class="ln">1</div><div class="ln">2</div><div class="ln">3</div><div class="ln">4</div><div class="ln">5</div><div class="ln">6</div><div class="ln">7</div><div class="ln">8</div><div class="ln">9</div><div class="ln">10</div><div class="ln">11</div><div class="ln">12</div><div class="ln">13</div><div class="ln">14</div><div class="ln">15</div><div class="ln">16</div><div class="ln">17</div><div class="ln">18</div><div class="ln">19</div><div class="ln">20</div><div class="ln">21</div><div class="ln">22</div><div class="ln">23</div><div class="ln">24</div><div class="ln">25</div><div class="ln">26</div>
      </div>
      <div class="code-content" tabindex="0">
        <pre class="chroma"><code class="language-html hljs" data-lang="html"><span class="hljs-tag">&lt;<span class="hljs-name">header</span>&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-name">h1</span>&gt;</span>網站標題<span class="hljs-tag">&lt;/<span class="hljs-name">h1</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">header</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">nav</span>&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-name">a</span> <span class="hljs-attr">href</span>=<span class="hljs-string">&quot;#&quot;</span>&gt;</span>連結 1<span class="hljs-tag">&lt;/<span class="hljs-name">a</span>&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-name">a</span> <span class="hljs-attr">href</span>=<span class="hljs-string">&quot;#&quot;</span>&gt;</span>連結 2<span class="hljs-tag">&lt;/<span class="hljs-name">a</span>&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-name">a</span> <span class="hljs-attr">href</span>=<span class="hljs-string">&quot;#&quot;</span>&gt;</span>連結 3<span class="hljs-tag">&lt;/<span class="hljs-name">a</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">nav</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">main</span>&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-name">section</span>&gt;</span>
   <span class="hljs-tag">&lt;<span class="hljs-name">article</span>&gt;</span>
      <span class="hljs-tag">&lt;<span class="hljs-name">h2</span>&gt;</span>第一篇文章<span class="hljs-tag">&lt;/<span class="hljs-name">h2</span>&gt;</span>
      <span class="hljs-tag">&lt;<span class="hljs-name">p</span>&gt;</span>文章內容<span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">article</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">article</span>&gt;</span>
      <span class="hljs-tag">&lt;<span class="hljs-name">h2</span>&gt;</span>第二篇文章<span class="hljs-tag">&lt;/<span class="hljs-name">h2</span>&gt;</span>
      <span class="hljs-tag">&lt;<span class="hljs-name">p</span>&gt;</span>文章內容<span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span>
  <span class="hljs-tag">&lt;/<span class="hljs-name">section</span>&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-name">aside</span>&gt;</span>
      <span class="hljs-tag">&lt;<span class="hljs-name">h2</span>&gt;</span>側邊欄<span class="hljs-tag">&lt;/<span class="hljs-name">h2</span>&gt;</span>
      <span class="hljs-tag">&lt;<span class="hljs-name">p</span>&gt;</span>側邊欄內容<span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">aside</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">main</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">footer</span>&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-name">p</span>&gt;</span>網站頁尾<span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">footer</span>&gt;</span></code></pre>
      </div>
    </div>
  </div>
  <button class="code-copy" onclick="copyCode(this)">Copy</button>
  <input type="checkbox" class="code-toggle" id="code-toggle-636">
        <label for="code-toggle-636" class="code-toggle-label"></label>
</div>
<p>這些元素本身都和 <code>div</code> 一樣只是把元素群組起來，不會有任何視覺效果。但是可以幫入瀏覽器和搜尋引擎了解這些區塊的用途。盲人跟 Google 會愛你。</p>
<h3 id="總結">總結</h3>
<p>好啦，今天我們介紹了許多不同的 HTML 元素。這些已經是最常用的元素了，如果你想知道更多的元素，可以到 <a href="https://developer.mozilla.org/zh-TW/docs/Web/HTML/Element">MDN</a> 查詢。下一週我們要來介紹 CSS 來裝飾我們的網頁。</p>
]]></content:encoded>
    </item>
<item>
      <title>什麼是網站？網頁基本原理</title>
      <link>https://emtech.cc/p/what-is-website</link>
      <description>這是前端網頁開發入門的第一堂課。首先我們要來聊聊網站的基本原理。網站是由哪些東西組成的？網站是如何傳遞資料的？這些都是我們在學習網頁開發之前需要先了解的基本概念。</description>
      <pubDate>Thu, 26 Mar 2026 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/what-is-website</guid>
      <media:thumbnail url="https://emtech.cc/static/what-is-website/thumbnail.webp" />
      <category>程式教學</category>
     <content:encoded><![CDATA[<img src="/static/what-is-website/thumbnail.webp" />
<p>如果你修過計算機網路概論或是有使用過 Google（備註：一個搜尋引擎）的話請聽我男性說教一下。</p>
<p>相信大家看過 Word 檔對吧，Word 檔是要用 Microsoft Word 打開的文件，副檔名是 <code>.docx</code>。</p>
<p>而網頁是一個要透過「瀏覽器」開啟的文件，副檔名通常是 <code>.html</code>。</p>
<p>讓我們來做一個實驗。請你建立一個文字檔案並輸入一些內容，接著把這個檔案的附檔名改成<code>html</code>（比如說<code>a.html</code>）。雙擊打開之後你看，一個網頁就做好了。</p>
<p>
        <figure>
            <img src="/static/what-is-website/html.webp" alt="建立一個 .html 檔裡面隨便打東西" title="" width="1200" height="465">
            <figcaption>建立一個 .html 檔裡面隨便打東西</figcaption>
        </figure>
    </p>
<p>沒錯就是這麼簡單。但是如果只有純文字的話實在是太無聊了，因此一個網頁通常會使用多個檔案及不同的程式語言組成。</p>
<p>和 Word 不一樣的地方是 word 會把所有的圖片、文字格式設定等資料全部包在一個資料夾並且包裝成一個.docx 檔，而網站會把這些檔案們分開存放好讓你可以輕鬆編輯每個項目。</p>
<h2 id="網站架構">網站架構</h2>
<p>一個網頁通常是由 HTML、CSS 和 JavaScript 所組成，它們分別有著不同的工作。</p>
<p>假設網頁是一個人的話，</p>
<ul>
<li>💀 HTML 就是他的骨架</li>
<li>👕 CSS 就是他的皮膚和衣服</li>
<li>🧠 而 JavaScript 就是他的大腦</li>
</ul>
<p>或是用房子來比喻就是</p>
<ul>
<li>🏗️ HTML 是房子的結構</li>
<li>🎨 CSS 是房子的裝潢</li>
<li>💡 而 JavaScript 就是房子裡的電器</li>
</ul>
<p>以我的這個部落格<a href="https://emtech.cc/">毛哥EM資訊密技</a>為例，如果把網頁的 JavaScript 拿掉，就不能使用複製按鈕了，如果把 CSS 拿掉，整個網頁就會變得很單調且難以閱讀，而如果把 HTML 拿掉，網頁就會整個空白。</p>
<p>
        <figure>
            <img src="/static/what-is-website/css.webp" alt="沒有 CSS 的 emtech.cc" title="" width="3600" height="2036">
            <figcaption>沒有 CSS 的 emtech.cc</figcaption>
        </figure>
    </p>
<p>而網站中所有的檔案都會放在一個資料夾中，你可以到 <a href="https://github.com/elvisdragonmao/emtech/tree/main">GitHub</a> 上面查看毛哥EM資訊密技的根目錄，裡面有著許多的檔案，而最後生成出來的 <code>index.html</code> 就是這個網站的首頁。</p>
<p>然而這個資料夾如果只是在你自己的電腦裡別人是無法取得的，因此你需要一個人一直站在一個地方，當有人來想要拿檔案的時候就遞給他，而這個人就叫做「伺服器」。</p>
<p>額不是這個東西</p>
<p>
        <figure>
            <img src="serve.webp" alt="圖片來源：[IC Shop](https://www.icshop.com.tw/products/368040600064)" title="" >
            <figcaption>圖片來源：[IC Shop](https://www.icshop.com.tw/products/368040600064)</figcaption>
        </figure>
    </p>
<p>伺服器其實也就只是一台電腦，平常你也能拿他看 YouTube 玩 Minecraft，他的工作就是當使用者提出請求（Request）的時候給予回應（Response）。記住在網路上伺服器只要你找他他都會回應你（不像你的前男友）。</p>
<p>
        <figure>
            <img src="/static/what-is-website/request.webp" alt="Request & Response" title="" width="1920" height="1080">
            <figcaption>Request & Response</figcaption>
        </figure>
    </p>
<p>除了回應檔案或是文字以外伺服器也會回應一個狀態碼。比如說 200 代表成功 (OK)，含有常見的 404 代表找不到頁面 (Not Found)，403 代表不允許 (Forbidden)。除此之外還有很多很多狀態碼。你可以在 <a href="https://http.cat/">http.cat</a> 或 <a href="https://http.dog/">http.dog</a> 看看這些程式代表的意義。</p>
<p>
        <figure>
            <img src="/static/what-is-website/404.webp" alt="狀態碼可以讓瀏覽器和工程師輕鬆的知道頁面為什麼壞了。四開頭的你基本上都不會想看到。" title="" width="816" height="670">
            <figcaption>狀態碼可以讓瀏覽器和工程師輕鬆的知道頁面為什麼壞了。四開頭的你基本上都不會想看到。</figcaption>
        </figure>
    </p>
<h2 id="網站是如何傳遞資料的？">網站是如何傳遞資料的？</h2>
<p>接下來我們來看一下網站是如何傳遞資料的。我喜歡把網路比喻成在寄包裹。今天你想把你的請求傳給伺服器之前，你有幾個東西需要做選擇。</p>
<h3 id="交通工具：http-method">交通工具：HTTP Method</h3>
<p>首先是你要使用什麼交通工具，不同的交通工具有不同的特性。當我們輸入網址載入網站時使用的交通工具叫做「GET」，我喜歡叫他腳踏車。</p>
<p>
        <figure>
            <img src="/static/what-is-website/get.webp" alt="Get" title="" width="1920" height="1080">
            <figcaption>Get</figcaption>
        </figure>
    </p>
<p>腳踏車的特點是他很簡單。你可以什麼都不帶就騎他去找朋友，也可以帶點小東西，資料會放在網址中。以 Google 為例，網址 <code>google.com/search?q=毛哥EM</code> 裡面就傳了 q=毛哥EM。也就是我要找（query=）毛哥EM 的意思，而 Google 也把對應的搜尋結果檔案給回傳回來。而且回傳的 HTML 不一定是本來就存在的，也有可能是剛才才建立出來的。</p>
<p>網址技術上可以無限量的傳遞資料，就像腳踏車原則上可以無限往上堆東西，但是我們通常在傳一比較大的資料的時候不會這麼做反之我們會選擇使用 POST 這個交通工具，而我喜歡叫他貨車。</p>
<p>
        <figure>
            <img src="/static/what-is-website/boxes.webp" alt="物理上我可以疊無限高" title="" width="1920" height="1080">
            <figcaption>物理上我可以疊無限高</figcaption>
        </figure>
    </p>
<blockquote>
<p>除了資料都在網址以外，主流瀏覽器和伺服器都會限制網址的長度，避免額…怕太長你手打太酸？<em>（開玩笑的 Chrome 支援 2MB、但 Nginx 伺服器那邊預設 8KB ~ 16KB。不然你太長了會把伺服器記憶體灌爆。）</em></p>
</blockquote>
<p>貨車最棒的地方式是他可以把東西存放在 Body，也就是後面的貨櫃。這樣經過的人除非把你的箱子撬開，不然不會知道裡面裝了些什麼。不會看到你搜尋紀錄就露餡了。</p>
<p>
        <figure>
            <img src="/static/what-is-website/post.webp" alt="貨車 POST" title="" width="1920" height="1080">
            <figcaption>貨車 POST</figcaption>
        </figure>
    </p>
<p>不過其實最主要的是語意問題。GET 是要東西、POST 是建立或給東西、PUT 是整筆資料更新、PATCH 是局部更新、DELETE 是刪除資源。就像你技術上也可以每天開殯儀車上學但使用者、瀏覽器、還有遇到 bug 時的你也都會很問號。</p>
<h3 id="交通規則">交通規則</h3>
<p>而接下來我們要來選擇的是我們要走哪一條道路（<s>廢話當然是網路</s>）。不同的道路有不同的交通規則，而常見的交通規則有 HTTP、FTP、SSH 等等。我們目前最常見的是 HTTPS（就是你網址最前面那個），他是加密過的 HTTP 協定，可以確保傳輸過程中你的貨櫃不會被撬開。</p>
<h3 id="送到哪裡？ip、網域、與-dns">送到哪裡？IP、網域、與 DNS</h3>
<p>經過這一番努力我們已經準備好要出發了，但是我們要送到哪裡呢？網路上的地址叫做 IP 位址。目前有 IPV4 還有因為地址不夠用了而被發明有英數混合的 IPV6。</p>
<p>比如說 120.126.32.0 就是一個交大的 IP。</p>
<p>但是這一大串數字實在太難記了，因此你可以購買一個網域。這個網域就像是臺北市信義區西村里 8 鄰信義路五段 7 號太難記了，但台北 101 就好記很多。因此會有一個類似電話簿的東西叫做 DNS，他會紀錄所有不同網域對應的 IP 位址。而當我們輸入網址想要去找伺服器之前我們的瀏覽器都會先去 DNS 找看看這個網站實際的地址。</p>
<p>
        <figure>
            <img src="/static/what-is-website/dns.webp" alt="DNS" title="" width="1920" height="1080">
            <figcaption>DNS</figcaption>
        </figure>
    </p>
<p>DNS 是大家都可以建立的。比如說中華電信或是 Google 都有他們的 DNS 伺服器可以讓你做使用。</p>
<p>網址的最後會有一個<code>.com</code>或<code>.net</code>等等的頂級域名，沒什麼意義，你爽就好。</p>
<p>
        <figure>
            <img src="/static/what-is-website/christmas.png" alt="你現在就可以去買個 nycu.christmas！" title="" width="3600" height="588">
            <figcaption>你現在就可以去買個 nycu.christmas！</figcaption>
        </figure>
    </p>
<h3 id="伺服器">伺服器</h3>
<p>就像前面說的，當伺服器收到你的請求時，他會根據你的請求去進行處理，並且把處理結果回傳給你，包括狀態碼和各種資料。由此你可以發現要製作一個網頁不只需要有人設計好看的網頁，還需要有人設計伺服器的邏輯，並且把資料存放在伺服器上。前面編寫我們可以直接看到結果的工程師我們叫做<strong>前端工程師</strong>，而編寫後面我們看不到的伺服器的工程師我們叫<strong>做後端工程師</strong>。</p>
<p>我們會從前端開始學習。但是你不用擔心，因為現在已經有很多平台幫你架設好後端，你只需要把你的 HTML, CSS, JavaScript 以及其他檔案上傳到這些平台上，你的網頁就部屬好了。</p>
<hr>
<p>既然現在你已經知道網頁最基本的運作原理了，那我們現在來開始寫 HTML 吧！</p>
<blockquote>
<p>下一篇：<a href="https://emtech.cc/p/html">環境建置與 HTML 完全指南</a></p>
</blockquote>
]]></content:encoded>
    </item>
<item>
      <title>難道只有我在把桌面當桌面嗎？</title>
      <link>https://emtech.cc/p/hmmm-4</link>
      <description>我把桌面當成「正在處理的工作區」：下載先丟桌面、用完立刻歸檔清空，並把同步改成以 Nextcloud 為主來讓檔案管理更快更穩。</description>
      <pubDate>Sat, 28 Feb 2026 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/hmmm-4</guid>
      <media:thumbnail url="https://emtech.cc/static/hmmm-4/thumbnail.webp" />
      <category>hmmm</category>
     <content:encoded><![CDATA[<img src="/static/hmmm-4/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>Husky 教學 - 逼你的團隊給我 Format 完再 Commit</title>
      <link>https://emtech.cc/p/husky</link>
      <description>Husky 是一個 Git hooks 工具，可以幫助你在提交程式碼之前自動執行一些腳本，比如格式化、測試運行等以遵守一定的規範。</description>
      <pubDate>Sun, 18 Jan 2026 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/husky</guid>
      <media:thumbnail url="https://emtech.cc/static/husky/thumbnail.webp" />
      <category>軟體開發</category>
     <content:encoded><![CDATA[<img src="/static/husky/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>馬斯克要我們一起畫色圖？今年我買了哪些怪東西</title>
      <link>https://emtech.cc/p/hmmm-3</link>
      <description>X 的 AI 改圖為什麼讓創作者爆炸，2025 我到底買了哪些東西（含信用卡迷惑行為）</description>
      <pubDate>Wed, 31 Dec 2025 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/hmmm-3</guid>
      <media:thumbnail url="https://emtech.cc/static/hmmm-3/thumbnail.webp" />
      <category>hmmm</category>
     <content:encoded><![CDATA[<img src="/static/hmmm-3/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>如何優雅的抵達交大</title>
      <link>https://emtech.cc/p/nycu-traffic</link>
      <description>陽明交大交通指南</description>
      <pubDate>Sat, 13 Dec 2025 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/nycu-traffic</guid>
      <media:thumbnail url="https://emtech.cc/static/nycu-traffic/thumbnail.webp" />
      <category>生活駭客,特殊選才</category>
     <content:encoded><![CDATA[<img src="/static/nycu-traffic/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>我該繼續買大便化的 Spotify 嗎？</title>
      <link>https://emtech.cc/p/hmmm-2</link>
      <description>該。</description>
      <pubDate>Mon, 01 Dec 2025 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/hmmm-2</guid>
      <media:thumbnail url="https://emtech.cc/static/hmmm-2/thumbnail.webp" />
      <category>hmmm</category>
     <content:encoded><![CDATA[<img src="/static/hmmm-2/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>Stock Issue - 從辯論到職場，任何計畫缺一不可的關鍵要素</title>
      <link>https://emtech.cc/p/debate-stock-issue</link>
      <description>在辯論場上，要讓一項政策主張站得住腳，我們必須回答幾個關鍵問題：為什麼需要改變？、現況有什麼障礙？、方案如何解決問題？、計畫本身是否符合辯題？以及這麼做值不值得？這些問題就是所謂的 Stock Issues（核心議題）。</description>
      <pubDate>Thu, 06 Nov 2025 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/debate-stock-issue</guid>
      <media:thumbnail url="https://emtech.cc/static/debate-stock-issue/thumbnail.webp" />
      <category>英文辯論</category>
     <content:encoded><![CDATA[<img src="/static/debate-stock-issue/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>test 123</title>
      <link>https://emtech.cc/p/hmmm-1</link>
      <description>這封信應該有發出去對吧。</description>
      <pubDate>Fri, 31 Oct 2025 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/hmmm-1</guid>
      <media:thumbnail url="https://emtech.cc/static/hmmm-1/thumbnail.webp" />
      <category>hmmm</category>
     <content:encoded><![CDATA[<img src="/static/hmmm-1/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>如何在 PowerPoint／Keynote 設定置中快捷鍵？</title>
      <link>https://emtech.cc/p/deck-center</link>
      <description>在 Windows Powerpoint 中設定自訂功能區，在 macOS 中設定 app 快捷鍵。</description>
      <pubDate>Thu, 30 Oct 2025 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/deck-center</guid>
      <media:thumbnail url="https://emtech.cc/static/deck-center/thumbnail.webp" />
      <category>生活駭客</category>
     <content:encoded><![CDATA[<img src="/static/deck-center/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>特選完半年的暑假在幹嘛？</title>
      <link>https://emtech.cc/p/srecruited</link>
      <description>2025 上半年 Rewind。</description>
      <pubDate>Wed, 24 Sep 2025 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/srecruited</guid>
      <media:thumbnail url="https://emtech.cc/static/srecruited/thumbnail.webp" />
      <category>生活雜談</category>
     <content:encoded><![CDATA[<img src="/static/srecruited/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>來用網址放跑馬燈吧！</title>
      <link>https://emtech.cc/p/url-marquee</link>
      <description>等客運時突然想到的，想說來實作看看。果然跟我想的一樣不知道幹嘛。</description>
      <pubDate>Fri, 19 Sep 2025 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/url-marquee</guid>
      <media:thumbnail url="https://emtech.cc/static/url-marquee/thumbnail.webp" />
      <category>網頁開發</category>
     <content:encoded><![CDATA[<img src="/static/url-marquee/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>SITCON Camp 2025 - 連續五天的黑客松，我們搞出了一套股票博弈系統！</title>
      <link>https://emtech.cc/p/SITCON-camp-2025</link>
      <description>在 SITCON Camp 2025 中，我們資訊組做了很酷的網站和點數系統，並和學員一起度過了五天的黑客松。</description>
      <pubDate>Thu, 24 Jul 2025 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/SITCON-camp-2025</guid>
      <media:thumbnail url="https://emtech.cc/static/SITCON-camp-2025/thumbnail.webp" />
      <category>生活雜談,網頁開發</category>
     <content:encoded><![CDATA[<img src="/static/SITCON-camp-2025/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>去美國辯論差點發生槍擊案？NSDA 2025 心得</title>
      <link>https://emtech.cc/p/nsda2025</link>
      <description>不是去派對，是去吵架。拓展視野，體驗國際級的辯論。</description>
      <pubDate>Sun, 20 Jul 2025 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/nsda2025</guid>
      <media:thumbnail url="https://emtech.cc/static/nsda2025/thumbnail.webp" />
      <category>英文辯論</category>
     <content:encoded><![CDATA[<img src="/static/nsda2025/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>毛哥EM 的快捷鍵：如何正確使用鍵盤跟觸控板</title>
      <link>https://emtech.cc/p/hotkey</link>
      <description>如果一顆按鈕你常會按，或是一個指令你常會打，那你就應該看看有沒有快捷鍵。沒有的話你就自己做一個。</description>
      <pubDate>Sat, 05 Jul 2025 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/hotkey</guid>
      <media:thumbnail url="https://emtech.cc/static/hotkey/thumbnail.webp" />
      <category>生活駭客</category>
     <content:encoded><![CDATA[<img src="/static/hotkey/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>World Schools Debate: 不只要證據，我要你解釋為什麼</title>
      <link>https://emtech.cc/p/debate-wsd</link>
      <description>World Schools Debate 是一種結合國際議題與即席思辨的高中英文辯論賽制，強調邏輯、互動與價值衝突，而不只是堆砌證據。</description>
      <pubDate>Sat, 28 Jun 2025 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/debate-wsd</guid>
      <media:thumbnail url="https://emtech.cc/static/debate-wsd/thumbnail.webp" />
      <category>英文辯論</category>
     <content:encoded><![CDATA[<img src="/static/debate-wsd/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>Extemporaneous Debate - 台上兩分鐘，台下半小時</title>
      <link>https://emtech.cc/p/debate-extemp</link>
      <description>Extemporaneous Debate (簡稱 Extemp) 是一種節奏十分快速的英文辯論賽制。一對一單人辯論，選手在比賽前三十分鐘才知道辯題，並由系統隨機指定正反方。這是 NSDA（美國全國中學生演講與辯論聯賽）設計的補充賽制，就是當你原本比的被淘汰了就可以來玩這個。而我們今年在美國...很幸運可以體驗到這個特別的賽制。</description>
      <pubDate>Fri, 27 Jun 2025 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/debate-extemp</guid>
      <media:thumbnail url="https://emtech.cc/static/debate-extemp/thumbnail.webp" />
      <category>英文辯論</category>
     <content:encoded><![CDATA[<img src="/static/debate-extemp/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>支持毛哥EM 的方式</title>
      <link>https://emtech.cc/p/donate</link>
      <description>多年來我投入了大量的時間與熱情打造實用、有趣且自由的工具與專案。如果你覺得我的作品對你有幫助，或是你想支持我繼續投入開源、教育與技術創作，甚至是想進行委託，這裡列出你可以選擇的幾種方式。</description>
      <pubDate>Thu, 19 Jun 2025 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/donate</guid>
      <media:thumbnail url="https://emtech.cc/static/donate/thumbnail.webp" />
      <category>關於</category>
     <content:encoded><![CDATA[<img src="/static/donate/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>我的近況</title>
      <link>https://emtech.cc/p/now</link>
      <description>毛哥EM 的近況。</description>
      <pubDate>Wed, 18 Jun 2025 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/now</guid>
      <media:thumbnail url="https://emtech.cc/static/now/thumbnail.webp" />
      <category>精選,生活雜談,關於</category>
     <content:encoded><![CDATA[<img src="/static/now/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>你應該開始使用 RSS！Zeabur + FreshRSS 架設教學</title>
      <link>https://emtech.cc/p/rss</link>
      <description>使用 RSS 讓你奪回資訊的掌控權，讓你決定你要看到什麼。</description>
      <pubDate>Sat, 07 Jun 2025 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/rss</guid>
      <media:thumbnail url="https://emtech.cc/static/rss/thumbnail.webp" />
      <category>生活駭客</category>
     <content:encoded><![CDATA[<img src="/static/rss/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>用 Discord 的線上國際辯論比賽？Taiwan WSDC 心得</title>
      <link>https://emtech.cc/p/debate-twwsdc</link>
      <description>沒贏，但好玩。</description>
      <pubDate>Fri, 06 Jun 2025 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/debate-twwsdc</guid>
      <media:thumbnail url="https://emtech.cc/static/debate-twwsdc/thumbnail.webp" />
      <category>英文辯論</category>
     <content:encoded><![CDATA[<img src="/static/debate-twwsdc/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>打了三年師大英辯的心得</title>
      <link>https://emtech.cc/p/debate-ntnu</link>
      <description>這是一個充滿師大魔法的比賽。你不能保證你有好的成績，但你能做到讓自己盡量成為一個好的辯士。</description>
      <pubDate>Mon, 26 May 2025 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/debate-ntnu</guid>
      <media:thumbnail url="https://emtech.cc/static/debate-ntnu/thumbnail.webp" />
      <category>英文辯論</category>
     <content:encoded><![CDATA[<img src="/static/debate-ntnu/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>辯論技巧：搞懂裁判類型，讓你比賽場上少走冤枉路</title>
      <link>https://emtech.cc/p/debate-judgeAdaptation</link>
      <description>見人說人話，見鬼說鬼話才是從好辯士邁向勝利者的關鍵。</description>
      <pubDate>Sun, 25 May 2025 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/debate-judgeAdaptation</guid>
      <media:thumbnail url="https://emtech.cc/static/debate-judgeAdaptation/thumbnail.webp" />
      <category>英文辯論</category>
     <content:encoded><![CDATA[<img src="/static/debate-judgeAdaptation/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>辯論中禁用的黑魔法 Kritik - 這個辯題根本不該被討論</title>
      <link>https://emtech.cc/p/debate-kritik</link>
      <description>「我不跟你玩你設定的遊戲規則，我要挑戰你那套規則本身」</description>
      <pubDate>Sun, 25 May 2025 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/debate-kritik</guid>
      <media:thumbnail url="https://emtech.cc/static/debate-kritik/thumbnail.webp" />
      <category>英文辯論</category>
     <content:encoded><![CDATA[<img src="/static/debate-kritik/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>2025 忠信英文辯論邀請賽心得</title>
      <link>https://emtech.cc/p/debate-chungHsin</link>
      <description>很好玩的比賽，很好吃的午餐。</description>
      <pubDate>Wed, 21 May 2025 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/debate-chungHsin</guid>
      <media:thumbnail url="https://emtech.cc/static/debate-chungHsin/thumbnail.webp" />
      <category>英文辯論,生活雜談</category>
     <content:encoded><![CDATA[<img src="/static/debate-chungHsin/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>高中生英文辯論在幹嘛？</title>
      <link>https://emtech.cc/p/debate-intro</link>
      <description>在用有腦的方式吵架。</description>
      <pubDate>Tue, 20 May 2025 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/debate-intro</guid>
      <media:thumbnail url="https://emtech.cc/static/debate-intro/thumbnail.webp" />
      <category>英文辯論</category>
     <content:encoded><![CDATA[<img src="/static/debate-intro/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>金絲雀聲明</title>
      <link>https://emtech.cc/p/canary-statement</link>
      <description>當你看到這裡有東西不見，你就知道發生甚麼事了。</description>
      <pubDate>Mon, 19 May 2025 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/canary-statement</guid>
      <media:thumbnail url="https://emtech.cc/static/canary-statement/thumbnail.webp" />
      <category>關於</category>
     <content:encoded><![CDATA[<img src="/static/canary-statement/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>用 CSS repeating-linear-gradient 實現警示條</title>
      <link>https://emtech.cc/p/css-warning-bar</link>
      <description>用 CSS repeating-linear-gradient 實現警示條。</description>
      <pubDate>Mon, 12 May 2025 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/css-warning-bar</guid>
      <media:thumbnail url="https://emtech.cc/static/css-warning-bar/thumbnail.webp" />
      <category>網頁開發</category>
     <content:encoded><![CDATA[<img src="/static/css-warning-bar/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>如果在 .gitignore ignore .gitignore 那 .gitignore 會被 git 因為 .gitignore ignore 了 .gitignore 而被 ignore 嗎？</title>
      <link>https://emtech.cc/p/git-ignore-gitignore</link>
      <description>`.gitignore` 能不能 ignore 自己？可以。</description>
      <pubDate>Sun, 11 May 2025 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/git-ignore-gitignore</guid>
      <media:thumbnail url="https://emtech.cc/static/git-ignore-gitignore/thumbnail.webp" />
      <category>軟體開發</category>
     <content:encoded><![CDATA[<img src="/static/git-ignore-gitignore/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>Git force push orphan branch 其他人不能 pull 怎麼辦？</title>
      <link>https://emtech.cc/p/git-pull-orphan</link>
      <description>當我們 force push 了一個孤兒（orphan）分支到 GitHub，結果換電腦以後 Git 提示我分支出現偏離，拉不下來也推不上去。今天我們要來討論這個問題發生的原因，還有應該怎麼安全地處理。</description>
      <pubDate>Sun, 04 May 2025 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/git-pull-orphan</guid>
      <media:thumbnail url="https://emtech.cc/static/git-pull-orphan/thumbnail.webp" />
      <category>軟體開發</category>
     <content:encoded><![CDATA[<img src="/static/git-pull-orphan/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>如何更改已經 push 的 commit message</title>
      <link>https://emtech.cc/p/git-reword</link>
      <description>有時候，我們在 git commit 後才發現 commit message 打錯字，或著是你有一個每個都每個 commit 都寫 &quot;fix bug&quot; 的好朋友。因此這篇文章我們要來討論如何修改已經 push 上去的 commit message。</description>
      <pubDate>Sun, 04 May 2025 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/git-reword</guid>
      <media:thumbnail url="https://emtech.cc/static/git-reword/thumbnail.webp" />
      <category>軟體開發</category>
     <content:encoded><![CDATA[<img src="/static/git-reword/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>如何把 Merge 地獄整理成乾淨的 Commit</title>
      <link>https://emtech.cc/p/git-merge-clean</link>
      <description>把除了 merge 以外的 commit 接上去，讓 commit 紀錄變得乾淨。</description>
      <pubDate>Sat, 03 May 2025 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/git-merge-clean</guid>
      <media:thumbnail url="https://emtech.cc/static/git-merge-clean/thumbnail.webp" />
      <category>軟體開發</category>
     <content:encoded><![CDATA[<img src="/static/git-merge-clean/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>自製 Line Bot 轉發群組訊息給自己</title>
      <link>https://emtech.cc/p/line-forward</link>
      <description>你是否有群組充滿著垃圾訊息？或是你是否想同步兩個群組的訊息？今天我要帶你一步步製作一個簡單的 Line Bot 來轉發群組重要訊息給自己或任意聊天室。不用程式經驗，複製貼上就好了。</description>
      <pubDate>Mon, 28 Apr 2025 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/line-forward</guid>
      <media:thumbnail url="https://emtech.cc/static/line-forward/thumbnail.webp" />
      <category>生活駭客</category>
     <content:encoded><![CDATA[<img src="/static/line-forward/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>使用 Notion 來準備辯論</title>
      <link>https://emtech.cc/p/notion-debate</link>
      <description>帶你快速入門 Notion</description>
      <pubDate>Thu, 24 Apr 2025 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/notion-debate</guid>
      <media:thumbnail url="https://emtech.cc/static/notion-debate/thumbnail.webp" />
      <category>生活駭客,英文辯論</category>
     <content:encoded><![CDATA[<img src="/static/notion-debate/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>如何在 DataGrip 中匯入 CSV 到資料庫？</title>
      <link>https://emtech.cc/p/datagrip-csv</link>
      <description>右鍵點擊選擇 Import/Export、Import Data from File。選擇要匯入的 CSV 檔案，然後點擊 OK 即可。</description>
      <pubDate>Sat, 05 Apr 2025 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/datagrip-csv</guid>
      <media:thumbnail url="https://emtech.cc/static/datagrip-csv/thumbnail.webp" />
      <category>軟體開發</category>
     <content:encoded><![CDATA[<img src="/static/datagrip-csv/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>你們為什麼就不能全域 .gitignore .DS_Store 呢？</title>
      <link>https://emtech.cc/p/git-dsstore</link>
      <description>用 `git rm --cached .DS_Store` 刪除紀錄，然後設定全域的 `.gitignore` 檔案。</description>
      <pubDate>Fri, 04 Apr 2025 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/git-dsstore</guid>
      <media:thumbnail url="https://emtech.cc/static/git-dsstore/thumbnail.webp" />
      <category>軟體開發</category>
     <content:encoded><![CDATA[<img src="/static/git-dsstore/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>中文字體標示解析：字體中的 TC、TW、GB、P 是什麼意思？</title>
      <link>https://emtech.cc/p/font-suffix</link>
      <description>看看哪個好看選哪個。不知道怎麼選就選 TW，沒有就選 TC。</description>
      <pubDate>Wed, 02 Apr 2025 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/font-suffix</guid>
      <media:thumbnail url="https://emtech.cc/static/font-suffix/thumbnail.webp" />
      <category>生活駭客</category>
     <content:encoded><![CDATA[<img src="/static/font-suffix/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>我最喜歡的名言：有朋自遠方來，不亦樂乎？</title>
      <link>https://emtech.cc/p/confucius-uwu</link>
      <description>孔子叫你不要當 i 人。</description>
      <pubDate>Thu, 20 Mar 2025 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/confucius-uwu</guid>
      <media:thumbnail url="https://emtech.cc/static/confucius-uwu/thumbnail.webp" />
      <category>生活雜談</category>
     <content:encoded><![CDATA[<img src="/static/confucius-uwu/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>如何設定 VSCode Git pull 使用 rebase 而不是 merge</title>
      <link>https://emtech.cc/p/vscode-git-pull</link>
      <description>在 Git 中，pull 指令可以讓你下載專案最新的版本，並且將遠端分支的提交歷史合併到本地分支中。這可以分成兩種策略：merge 和 rebase。</description>
      <pubDate>Thu, 20 Mar 2025 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/vscode-git-pull</guid>
      <media:thumbnail url="https://emtech.cc/static/vscode-git-pull/thumbnail.webp" />
      <category>軟體開發</category>
     <content:encoded><![CDATA[<img src="/static/vscode-git-pull/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>GitHub 如何更改預設分支 (default branch)</title>
      <link>https://emtech.cc/p/git-default-branch</link>
      <description>到 GitHub 專案設定改，然後本地重置就可以了。</description>
      <pubDate>Mon, 17 Mar 2025 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/git-default-branch</guid>
      <media:thumbnail url="https://emtech.cc/static/git-default-branch/thumbnail.webp" />
      <category>軟體開發</category>
     <content:encoded><![CDATA[<img src="/static/git-default-branch/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>SITCON 2025 心得與 Q&amp;A</title>
      <link>https://emtech.cc/p/SITCON-2025</link>
      <description>今年 SITCON 一樣很讚。</description>
      <pubDate>Tue, 11 Mar 2025 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/SITCON-2025</guid>
      <media:thumbnail url="https://emtech.cc/static/SITCON-2025/thumbnail.webp" />
      <category>生活雜談,網頁開發</category>
     <content:encoded><![CDATA[<img src="/static/SITCON-2025/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>macOS 快速把圖片轉成 WebP、影片轉成 GIF</title>
      <link>https://emtech.cc/p/mac-2webp</link>
      <description>在 macOS 的右鍵選單加上一個項目，快速把圖片轉成 WebP、影片轉成 GIF。</description>
      <pubDate>Tue, 11 Mar 2025 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/mac-2webp</guid>
      <media:thumbnail url="https://emtech.cc/static/mac-2webp/thumbnail.webp" />
      <category>軟體開發,生活駭客</category>
     <content:encoded><![CDATA[<img src="/static/mac-2webp/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>如何連上校園免費 Wi-Fi eduroam？</title>
      <link>https://emtech.cc/p/eduroam</link>
      <description>註冊教育雲帳號，然後連接 Wi-Fi 即可。</description>
      <pubDate>Fri, 07 Mar 2025 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/eduroam</guid>
      <media:thumbnail url="https://emtech.cc/static/eduroam/thumbnail.webp" />
      <category>精選,生活駭客</category>
     <content:encoded><![CDATA[<img src="/static/eduroam/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>WSL 無法更新？如何在 Windows 安裝 Docker</title>
      <link>https://emtech.cc/p/win-docker</link>
      <description>直接去官方 GitHub Release 安裝下載 WSL，然後安裝 Docker Desktop 即可。</description>
      <pubDate>Thu, 06 Mar 2025 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/win-docker</guid>
      <media:thumbnail url="https://emtech.cc/static/win-docker/thumbnail.webp" />
      <category>軟體開發</category>
     <content:encoded><![CDATA[<img src="/static/win-docker/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>什麼是宣告式程式設計 Declarative Programming？</title>
      <link>https://emtech.cc/p/declarative-programming</link>
      <description>宣告式程式設計（Declarative Programming）是一種描述「要做什麼」而不是「怎麼做」的程式設計方式。</description>
      <pubDate>Sun, 02 Mar 2025 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/declarative-programming</guid>
      <media:thumbnail url="https://emtech.cc/static/declarative-programming/thumbnail.webp" />
      <category>軟體開發</category>
     <content:encoded><![CDATA[<img src="/static/declarative-programming/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>從 Windows 轉到 MacBook 的心得</title>
      <link>https://emtech.cc/p/win-macbook</link>
      <description>非常貴，非常好，只有蘋果做得到。蘋果做不到的軟體給。</description>
      <pubDate>Tue, 25 Feb 2025 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/win-macbook</guid>
      <media:thumbnail url="https://emtech.cc/static/win-macbook/thumbnail.webp" />
      <category>生活雜談</category>
     <content:encoded><![CDATA[<img src="/static/win-macbook/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>特殊選才備審資料／學習歷程檔案怎麼做？</title>
      <link>https://emtech.cc/p/srecruit-cv</link>
      <description>好的備審能讓你的努力和特質被看見，甚至錄取超出你預期的學校。</description>
      <pubDate>Sun, 23 Feb 2025 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/srecruit-cv</guid>
      <media:thumbnail url="https://emtech.cc/static/srecruit-cv/thumbnail.webp" />
      <category>生活雜談</category>
     <content:encoded><![CDATA[<img src="/static/srecruit-cv/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>交大百川特選心得 - 如何錄取？百川資工怎麼選？</title>
      <link>https://emtech.cc/p/srecruit-nycu-aretehp</link>
      <description>手寫自傳，強調跨領域整合與創新能力。一半是競賽及技術厲害的，另一半是華德福等實驗高中。</description>
      <pubDate>Mon, 17 Feb 2025 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/srecruit-nycu-aretehp</guid>
      <media:thumbnail url="https://emtech.cc/static/srecruit-nycu-aretehp/thumbnail.webp" />
      <category>生活雜談</category>
     <content:encoded><![CDATA[<img src="/static/srecruit-nycu-aretehp/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>不自殺聲明</title>
      <link>https://emtech.cc/p/no-suicide</link>
      <description>不要自殺，自殺會讓你死掉</description>
      <pubDate>Sat, 01 Feb 2025 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/no-suicide</guid>
      <media:thumbnail url="https://emtech.cc/static/no-suicide/thumbnail.webp" />
      <category>生活雜談</category>
     <content:encoded><![CDATA[<img src="/static/no-suicide/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>2024 成大資工特選乙組 上機考考題及心得</title>
      <link>https://emtech.cc/p/srecruit-ncku-quiz</link>
      <description>很難，很累。從早上九點寫到下午四點，中間排隊被帶去進食半小時再關回去寫。但挺有趣的。</description>
      <pubDate>Thu, 16 Jan 2025 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/srecruit-ncku-quiz</guid>
      <media:thumbnail url="https://emtech.cc/static/srecruit-ncku-quiz/thumbnail.webp" />
      <category>生活雜談</category>
     <content:encoded><![CDATA[<img src="/static/srecruit-ncku-quiz/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>交大資工資安組 特選面試心得</title>
      <link>https://emtech.cc/p/srecruit-nycu2</link>
      <description>交大資安</description>
      <pubDate>Wed, 15 Jan 2025 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/srecruit-nycu2</guid>
      <media:thumbnail url="https://emtech.cc/static/srecruit-nycu2/thumbnail.webp" />
      <category>生活雜談</category>
     <content:encoded><![CDATA[<img src="/static/srecruit-nycu2/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>專案仔上交大？2025 資工特殊選才完全指南</title>
      <link>https://emtech.cc/p/srecruit</link>
      <description>特選可以讓你提早上大學。很累，但很好玩。無論你的專業是甚麼，不管是比賽、專案、檢定，只要你能證明你的能力和熱誠，你就有機會被錄取。</description>
      <pubDate>Mon, 13 Jan 2025 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/srecruit</guid>
      <media:thumbnail url="https://emtech.cc/static/srecruit/thumbnail.webp" />
      <category>生活雜談,精選</category>
     <content:encoded><![CDATA[<img src="/static/srecruit/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>如何快速取得 GitHub 成就 Pair Extraordinaire 金色徽章</title>
      <link>https://emtech.cc/p/github-achievement-pair-extraordinaire</link>
      <description>用 bash 腳本自動化提交有 co-author 的 commit、建立 Pull Request、並自動合併。</description>
      <pubDate>Tue, 31 Dec 2024 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/github-achievement-pair-extraordinaire</guid>
      <media:thumbnail url="https://emtech.cc/static/github-achievement-pair-extraordinaire/thumbnail.webp" />
      <category>軟體開發</category>
     <content:encoded><![CDATA[<img src="/static/github-achievement-pair-extraordinaire/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>中原資工 特選面試心得</title>
      <link>https://emtech.cc/p/srecruit-cycu</link>
      <description>教授都蠻和善的，滑鼠滾很快。結果為正取 1。</description>
      <pubDate>Fri, 06 Dec 2024 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/srecruit-cycu</guid>
      <media:thumbnail url="https://emtech.cc/static/srecruit-cycu/thumbnail.webp" />
      <category>生活雜談</category>
     <content:encoded><![CDATA[<img src="/static/srecruit-cycu/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>逢甲資工/資安 特選面試心得</title>
      <link>https://emtech.cc/p/srecruit-fcu</link>
      <description>教授很嗨，面對好學生都很歡迎，但問的問題是精準有深度的。</description>
      <pubDate>Fri, 06 Dec 2024 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/srecruit-fcu</guid>
      <media:thumbnail url="https://emtech.cc/static/srecruit-fcu/thumbnail.webp" />
      <category>生活雜談</category>
     <content:encoded><![CDATA[<img src="/static/srecruit-fcu/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>暨南資工 特選面試心得</title>
      <link>https://emtech.cc/p/srecruit-ncnu</link>
      <description>兩段面試，一段簡報自我介紹，一段問答。教授很和善，且會認真問專案細節。</description>
      <pubDate>Fri, 06 Dec 2024 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/srecruit-ncnu</guid>
      <media:thumbnail url="https://emtech.cc/static/srecruit-ncnu/thumbnail.webp" />
      <category>生活雜談</category>
     <content:encoded><![CDATA[<img src="/static/srecruit-ncnu/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>台大資工資安組 特選面試心得</title>
      <link>https://emtech.cc/p/srecruit-ntu</link>
      <description>教授很專業，雖然都很淡定但明顯有很認真看備審資料，問的問題都很完整且都是根據你的經歷來問。</description>
      <pubDate>Fri, 06 Dec 2024 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/srecruit-ntu</guid>
      <media:thumbnail url="https://emtech.cc/static/srecruit-ntu/thumbnail.webp" />
      <category>生活雜談</category>
     <content:encoded><![CDATA[<img src="/static/srecruit-ntu/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>全部猜 C 分數會比較高嗎？考試猜題策略用程式跑給你看！</title>
      <link>https://emtech.cc/p/c-strategy</link>
      <description>簡單來說好好去讀書吧。無論你全部猜 C、平均猜 ABCD 還是完全亂猜，你的平均分數都一樣爛。</description>
      <pubDate>Tue, 26 Nov 2024 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/c-strategy</guid>
      <media:thumbnail url="https://emtech.cc/static/c-strategy/thumbnail.webp" />
      <category>程式跑給你看</category>
     <content:encoded><![CDATA[<img src="/static/c-strategy/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>必輸策略：馬丁格爾投注法，用程式證明給你看！</title>
      <link>https://emtech.cc/p/martingale</link>
      <description>馬丁格爾策略的規則是：在每一輪遊戲中，你下注的金額是上一輪遊戲中輸掉的金額的兩倍。用程式模擬和數學證明這個策略一定會虧錢，因為玩多局贏的機率不會提升，提升的只有你投入的資金。</description>
      <pubDate>Tue, 05 Nov 2024 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/martingale</guid>
      <media:thumbnail url="https://emtech.cc/static/martingale/thumbnail.webp" />
      <category>程式跑給你看</category>
     <content:encoded><![CDATA[<img src="/static/martingale/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>輔仁資工資安組 特選面試心得</title>
      <link>https://emtech.cc/p/srecruit-fju</link>
      <description>輔仁大學面試教授手上不會拿你的備審，問題圍繞在當下你的自介和分享的專案。結果為備取 1。</description>
      <pubDate>Sat, 02 Nov 2024 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/srecruit-fju</guid>
      <media:thumbnail url="https://emtech.cc/static/srecruit-fju/thumbnail.webp" />
      <category>生活雜談</category>
     <content:encoded><![CDATA[<img src="/static/srecruit-fju/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>關於本站</title>
      <link>https://emtech.cc/p/about</link>
      <description>毛哥EM資訊密技是毛哥EM 的資訊密技</description>
      <pubDate>Thu, 17 Oct 2024 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/about</guid>
      <media:thumbnail url="https://emtech.cc/static/img/og.webp" />
      <category>關於</category>
     <content:encoded><![CDATA[<img src="/static/img/og.webp" />]]></content:encoded>
    </item>
<item>
      <title>友情連結</title>
      <link>https://emtech.cc/p/friends</link>
      <description>有朋自遠方來，不亦悅乎？</description>
      <pubDate>Thu, 17 Oct 2024 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/friends</guid>
      <media:thumbnail url="https://emtech.cc/static/friends/thumbnail.webp" />
      <category>關於</category>
     <content:encoded><![CDATA[<img src="/static/friends/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>emblog - 一個不一樣的部落格生成器</title>
      <link>https://emtech.cc/p/emblog</link>
      <description>emblog 是一個十分特別且強大的部落格框架，專為毛哥EM資訊密技設計。可以在幾秒內生成出漂亮的靜態單頁式部落格。</description>
      <pubDate>Wed, 16 Oct 2024 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/emblog</guid>
      <media:thumbnail url="https://emtech.cc/static/emblog/thumbnail.webp" />
      <category>軟體開發,精選</category>
     <content:encoded><![CDATA[<img src="/static/emblog/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>是時候 Action 了。</title>
      <link>https://emtech.cc/p/2024ironman-30</link>
      <description>愛爾蘭詩人葉慈：「學習不是注滿一桶水，而是點燃一把火。</description>
      <pubDate>Sun, 13 Oct 2024 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/2024ironman-30</guid>
      <media:thumbnail url="https://emtech.cc/static/2024ironman-30/thumbnail.webp" />
      <category>自動化</category>
     <content:encoded><![CDATA[<img src="/static/2024ironman-30/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>鐵人賽怕忘記發文？讓 GitHub Actions 每小時提醒你！</title>
      <link>https://emtech.cc/p/2024ironman-29</link>
      <description>倒數第二天了，各位今年有參加鐵人賽嗎？記得去年寫【不用庫 也能酷 - 玩轉 CSS &amp; Js 特效】的時候緊張到好幾天晚上做惡夢夢到忘記發文，不過今天我心裡特別平安，因為我寫了一個 GitHub Actions 來提醒我每小時發文。</description>
      <pubDate>Sat, 12 Oct 2024 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/2024ironman-29</guid>
      <media:thumbnail url="https://emtech.cc/static/2024ironman-29/thumbnail.webp" />
      <category>自動化</category>
     <content:encoded><![CDATA[<img src="/static/2024ironman-29/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>無國界倉庫 - 管理多倉庫的自動化工作流程</title>
      <link>https://emtech.cc/p/2024ironman-28</link>
      <description>《荀子 ─ 勸學》：「不積跬步，無以致千里；不積小流，無以成江海。」</description>
      <pubDate>Fri, 11 Oct 2024 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/2024ironman-28</guid>
      <media:thumbnail url="https://emtech.cc/static/2024ironman-28/thumbnail.webp" />
      <category>自動化</category>
     <content:encoded><![CDATA[<img src="/static/2024ironman-28/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>最佳化工作流程運行時間：使用 GitHub Actions 快取來加速構建</title>
      <link>https://emtech.cc/p/2024ironman-27</link>
      <description>王貞白曾感嘆「一寸光陰一寸金」，可見最佳化工作流程運行時間的重要性。畢竟 GitHub Actions 在私人倉庫中可不是無限免費的！</description>
      <pubDate>Thu, 10 Oct 2024 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/2024ironman-27</guid>
      <media:thumbnail url="https://emtech.cc/static/2024ironman-27/thumbnail.webp" />
      <category>自動化</category>
     <content:encoded><![CDATA[<img src="/static/2024ironman-27/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>整合通知服務 - 在 GitHub Actions 中配置 Slack 通知和生成報告文件</title>
      <link>https://emtech.cc/p/2024ironman-26</link>
      <description>雅典軍隊如果有 Slack 通知，斐迪庇得斯就不用趕著從馬拉松跑回雅典了。</description>
      <pubDate>Wed, 09 Oct 2024 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/2024ironman-26</guid>
      <media:thumbnail url="https://emtech.cc/static/2024ironman-26/thumbnail.webp" />
      <category>自動化</category>
     <content:encoded><![CDATA[<img src="/static/2024ironman-26/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>自動化安全掃描與漏洞檢查 - 使用 Dependabot 和 GitHub Actions</title>
      <link>https://emtech.cc/p/2024ironman-25</link>
      <description>《山河頌》：「外賊易擋，家賊難防」套件的漏洞常常難以發現，還好有 Dependabot 可以定期檢查。</description>
      <pubDate>Tue, 08 Oct 2024 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/2024ironman-25</guid>
      <media:thumbnail url="https://emtech.cc/static/2024ironman-25/thumbnail.webp" />
      <category>自動化</category>
     <content:encoded><![CDATA[<img src="/static/2024ironman-25/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>自動化性能測試 - 使用 GitHub Actions 進行負載測試與生成性能報告</title>
      <link>https://emtech.cc/p/2024ironman-24</link>
      <description>嬌娘對王安石進行心理上的壓力負載測試後寫下了性能報告：「宰相肚裡能撐船」</description>
      <pubDate>Mon, 07 Oct 2024 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/2024ironman-24</guid>
      <media:thumbnail url="https://emtech.cc/static/2024ironman-24/thumbnail.webp" />
      <category>自動化</category>
     <content:encoded><![CDATA[<img src="/static/2024ironman-24/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>不在其位，不謀其政 - 多階段 CI/CD 流程</title>
      <link>https://emtech.cc/p/2024ironman-23</link>
      <description>子曰：「不在其位，不謀其政。」說明了多階段工作流程的重要性。</description>
      <pubDate>Sun, 06 Oct 2024 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/2024ironman-23</guid>
      <media:thumbnail url="https://emtech.cc/static/2024ironman-23/thumbnail.webp" />
      <category>自動化</category>
     <content:encoded><![CDATA[<img src="/static/2024ironman-23/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>特選簡章 Discord 通知 - 爬蟲腳本與資料處理</title>
      <link>https://emtech.cc/p/2024ironman-22</link>
      <description>「讀書人的事，能算偷麼？」孔乙己如果是使用 GitHub Actions 運行爬蟲腳本，就不會被人發現還打斷腳了。</description>
      <pubDate>Sat, 05 Oct 2024 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/2024ironman-22</guid>
      <media:thumbnail url="https://emtech.cc/static/2024ironman-22/thumbnail.webp" />
      <category>自動化</category>
     <content:encoded><![CDATA[<img src="/static/2024ironman-22/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>我沒錢買 MacBook - 自動化多平台 Python 應用打包</title>
      <link>https://emtech.cc/p/2024ironman-21</link>
      <description>不如虎穴，焉得虎子，說明了 pyinstaller 要打包 macOS 的執行檔一定要在 macOS 環境運行。</description>
      <pubDate>Fri, 04 Oct 2024 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/2024ironman-21</guid>
      <media:thumbnail url="https://emtech.cc/static/2024ironman-21/thumbnail.webp" />
      <category>自動化</category>
     <content:encoded><![CDATA[<img src="/static/2024ironman-21/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>渲染 Markdown 文件 - 自動生成和更新項目說明文件</title>
      <link>https://emtech.cc/p/2024ironman-20</link>
      <description>司馬遷如果使用 GitHub Actions 就可以自動更新《史記》了。</description>
      <pubDate>Thu, 03 Oct 2024 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/2024ironman-20</guid>
      <media:thumbnail url="https://emtech.cc/static/2024ironman-20/thumbnail.webp" />
      <category>自動化</category>
     <content:encoded><![CDATA[<img src="/static/2024ironman-20/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>萬籟聚集 - 自動化 Issue 管理與整合第三方服務</title>
      <link>https://emtech.cc/p/2024ironman-19</link>
      <description>戰國時期張儀遊說各國開放 API 給秦整合，才能夠瓦解合縱聯盟。</description>
      <pubDate>Wed, 02 Oct 2024 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/2024ironman-19</guid>
      <media:thumbnail url="https://emtech.cc/static/2024ironman-19/thumbnail.webp" />
      <category>自動化</category>
     <content:encoded><![CDATA[<img src="/static/2024ironman-19/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>用 GitHub Actions 把 Issue 同步到 Notion</title>
      <link>https://emtech.cc/p/2024ironman-18</link>
      <description>白居易在看到滿滿的 issue 後不經感嘆：「野火燒不盡，春風吹又生。」然後毅然決然地把 issue 同步到 Notion，這樣就不會忘記了。</description>
      <pubDate>Tue, 01 Oct 2024 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/2024ironman-18</guid>
      <media:thumbnail url="https://emtech.cc/static/2024ironman-18/thumbnail.webp" />
      <category>自動化</category>
     <content:encoded><![CDATA[<img src="/static/2024ironman-18/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>有人在水 - 統計 Notion 待辦事項放到 Discord 頻道</title>
      <link>https://emtech.cc/p/2024ironman-17</link>
      <description>孔子能從心所欲不逾矩。正是因為他已經掌握 GitHub Actions，能夠根據自己的需求自動化操作。</description>
      <pubDate>Mon, 30 Sep 2024 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/2024ironman-17</guid>
      <media:thumbnail url="https://emtech.cc/static/2024ironman-17/thumbnail.webp" />
      <category>自動化</category>
     <content:encoded><![CDATA[<img src="/static/2024ironman-17/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>解放你的 Release - 自動化版本控制與發布</title>
      <link>https://emtech.cc/p/2024ironman-16</link>
      <description>秦始皇焚書坑儒時可以 force push 刪除紀錄，但誰知道有沒有人本地 .git 還留著呢！</description>
      <pubDate>Sun, 29 Sep 2024 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/2024ironman-16</guid>
      <media:thumbnail url="https://emtech.cc/static/2024ironman-16/thumbnail.webp" />
      <category>自動化</category>
     <content:encoded><![CDATA[<img src="/static/2024ironman-16/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>這是我家鑰匙 - SSH 自動化部署</title>
      <link>https://emtech.cc/p/2024ironman-15</link>
      <description>《史記》「以貌取人，失之子羽」說明了 SSH 身分驗證的重要性。</description>
      <pubDate>Sat, 28 Sep 2024 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/2024ironman-15</guid>
      <media:thumbnail url="https://emtech.cc/static/2024ironman-15/thumbnail.webp" />
      <category>自動化</category>
     <content:encoded><![CDATA[<img src="/static/2024ironman-15/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>直上天雲 - 自動化部屬</title>
      <link>https://emtech.cc/p/2024ironman-14</link>
      <description>老子能夠無為而治，正是因為他掌握了 GitHub Actions 自動化部屬。</description>
      <pubDate>Fri, 27 Sep 2024 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/2024ironman-14</guid>
      <media:thumbnail url="https://emtech.cc/static/2024ironman-14/thumbnail.webp" />
      <category>自動化</category>
     <content:encoded><![CDATA[<img src="/static/2024ironman-14/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>在碼頭等你 - 自動化 Docker 構建</title>
      <link>https://emtech.cc/p/2024ironman-13</link>
      <description>司馬遷敢說：「人固有一死，或重於泰山，或輕於鴻毛。」正是因為他已經把服務打包成 Docker 映像了，就算服務掛了也不怕。</description>
      <pubDate>Thu, 26 Sep 2024 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/2024ironman-13</guid>
      <media:thumbnail url="https://emtech.cc/static/2024ironman-13/thumbnail.webp" />
      <category>自動化</category>
     <content:encoded><![CDATA[<img src="/static/2024ironman-13/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>一切都是有條件的 - 環境變數和條件運行</title>
      <link>https://emtech.cc/p/2024ironman-12</link>
      <description>甚麼是條件運行？孟子說：「生，事之以禮；死，葬之以禮；祭，事之以禮。」</description>
      <pubDate>Wed, 25 Sep 2024 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/2024ironman-12</guid>
      <media:thumbnail url="https://emtech.cc/static/2024ironman-12/thumbnail.webp" />
      <category>自動化</category>
     <content:encoded><![CDATA[<img src="/static/2024ironman-12/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>告訴你一個大秘密 - 如何在 GitHub Actions 中使用 Secrets</title>
      <link>https://emtech.cc/p/2024ironman-11</link>
      <description>水果冰淇淋喜歡你，GitHub Secrets 在這裡。</description>
      <pubDate>Tue, 24 Sep 2024 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/2024ironman-11</guid>
      <media:thumbnail url="https://emtech.cc/static/2024ironman-11/thumbnail.webp" />
      <category>自動化</category>
     <content:encoded><![CDATA[<img src="/static/2024ironman-11/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>啊我就怕不相容 - 多平台測試</title>
      <link>https://emtech.cc/p/2024ironman-10</link>
      <description>從孟母三遷的故事可以看出孟子在不同環境的相容性都不錯，但結果不一定和預期相同。</description>
      <pubDate>Mon, 23 Sep 2024 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/2024ironman-10</guid>
      <media:thumbnail url="https://emtech.cc/static/2024ironman-10/thumbnail.webp" />
      <category>自動化</category>
     <content:encoded><![CDATA[<img src="/static/2024ironman-10/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>Jest Do It - 運行單元測試</title>
      <link>https://emtech.cc/p/2024ironman-9</link>
      <description>《論語．公冶長》：「聽其言而觀其行。」說明了 unit test 的重要性。</description>
      <pubDate>Sun, 22 Sep 2024 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/2024ironman-9</guid>
      <media:thumbnail url="https://emtech.cc/static/2024ironman-9/thumbnail.webp" />
      <category>自動化</category>
     <content:encoded><![CDATA[<img src="/static/2024ironman-9/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>今天不講 DVD，來談談 CI/CD - eslint 與 pylint</title>
      <link>https://emtech.cc/p/2024ironman-8</link>
      <description>「知者不惑，仁者不憂，勇者不懼。」因為他們都有使用 eslint。</description>
      <pubDate>Sat, 21 Sep 2024 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/2024ironman-8</guid>
      <media:thumbnail url="https://emtech.cc/static/2024ironman-8/thumbnail.webp" />
      <category>自動化</category>
     <content:encoded><![CDATA[<img src="/static/2024ironman-8/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>時間差不多囉 - 事件觸發器</title>
      <link>https://emtech.cc/p/2024ironman-7</link>
      <description>《禮記·中庸》「凡事預則立，不預則廢。」說明了如果沒有預先設定事件觸發器，需要時 Action 也不會執行。</description>
      <pubDate>Fri, 20 Sep 2024 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/2024ironman-7</guid>
      <media:thumbnail url="https://emtech.cc/static/2024ironman-7/thumbnail.webp" />
      <category>自動化</category>
     <content:encoded><![CDATA[<img src="/static/2024ironman-7/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>有意見就說 - 編輯後自動提 Pull Request</title>
      <link>https://emtech.cc/p/2024ironman-6</link>
      <description>《三國演義》第六 ○ 回：「竊聞：『 良藥苦口利於病，忠言逆耳利於行。』」處理 Issue 和 PR 很煩但十分重要。</description>
      <pubDate>Thu, 19 Sep 2024 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/2024ironman-6</guid>
      <media:thumbnail url="https://emtech.cc/static/2024ironman-6/thumbnail.webp" />
      <category>自動化</category>
     <content:encoded><![CDATA[<img src="/static/2024ironman-6/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>用 Prettier 統一天下 - 讓程式碼格式一致</title>
      <link>https://emtech.cc/p/2024ironman-5</link>
      <description>《史記·秦始皇本紀》：「書同文，車同軌。」秦始皇做專案一定會設定會用 Prettier，讓程式格式一致。</description>
      <pubDate>Wed, 18 Sep 2024 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/2024ironman-5</guid>
      <media:thumbnail url="https://emtech.cc/static/2024ironman-5/thumbnail.webp" />
      <category>自動化</category>
     <content:encoded><![CDATA[<img src="/static/2024ironman-5/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>弄好了給你 - 上傳與下載工件（artifact）</title>
      <link>https://emtech.cc/p/2024ironman-4</link>
      <description>宋·張端義《貴耳集》上卷：「言簡理盡，遂成王言。」可見檔案壓縮十分重要。</description>
      <pubDate>Tue, 17 Sep 2024 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/2024ironman-4</guid>
      <media:thumbnail url="https://emtech.cc/static/2024ironman-4/thumbnail.webp" />
      <category>自動化</category>
     <content:encoded><![CDATA[<img src="/static/2024ironman-4/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>幫我結帳 - 自動化 Git 操作</title>
      <link>https://emtech.cc/p/2024ironman-3</link>
      <description>GitHub Actions 如同九方皋相馬，見其所見，不見其所不見；視其所視，而遺其所不視。預設環境是讀不到 Code 的，要使用 actions/checkout 才能讀取 repo 內容。</description>
      <pubDate>Mon, 16 Sep 2024 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/2024ironman-3</guid>
      <media:thumbnail url="https://emtech.cc/static/2024ironman-3/thumbnail.webp" />
      <category>自動化</category>
     <content:encoded><![CDATA[<img src="/static/2024ironman-3/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>Hello World - 運行 Shell 指令</title>
      <link>https://emtech.cc/p/2024ironman-2</link>
      <description>「有朋自遠方來，不亦樂乎」應該算是孔子的 Hello World 吧。</description>
      <pubDate>Sun, 15 Sep 2024 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/2024ironman-2</guid>
      <media:thumbnail url="https://emtech.cc/static/2024ironman-2/thumbnail.webp" />
      <category>自動化</category>
     <content:encoded><![CDATA[<img src="/static/2024ironman-2/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>靠著那 GitHub Actions，凡事都能做</title>
      <link>https://emtech.cc/p/2024ironman-1</link>
      <description>腓立比書 4 章 13 節「我靠著那加給我力量的 (ymal)，凡事都能做」</description>
      <pubDate>Sat, 14 Sep 2024 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/2024ironman-1</guid>
      <media:thumbnail url="https://emtech.cc/static/2024ironman-1/thumbnail.webp" />
      <category>自動化</category>
     <content:encoded><![CDATA[<img src="/static/2024ironman-1/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>甚麼是獸迷文化 (Furry)？認識不獸控制的獸圈</title>
      <link>https://emtech.cc/p/furry-intro</link>
      <description>本文將帶你深入探討獸迷文化，介紹福瑞（獸人）的定義、獸圈的生活、以及文化的多樣性。</description>
      <pubDate>Fri, 30 Aug 2024 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/furry-intro</guid>
      <media:thumbnail url="https://emtech.cc/static/furry-intro/thumbnail.webp" />
      <category>精選</category>
     <content:encoded><![CDATA[<img src="/static/furry-intro/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>你不知道的 git add -A</title>
      <link>https://emtech.cc/p/git-add</link>
      <description>在使用 Git 的過程中，我偶然發現了一個指令，徹底改變了我處理檔案變更的方式——這就是 git add -A。</description>
      <pubDate>Tue, 27 Aug 2024 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/git-add</guid>
      <media:thumbnail url="https://emtech.cc/static/git-add/thumbnail.webp" />
      <category>軟體開發</category>
     <content:encoded><![CDATA[<img src="/static/git-add/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>解決 Certbot SSL 更新失敗 - The manual plugin is not working</title>
      <link>https://emtech.cc/p/certbot-renew</link>
      <description>當你的 Certbot SSL 過期時，更新過程可能會出現各種問題，尤其是在使用手動插件時。這篇文章將介紹如何解決 Certbot 手動插件更新失敗的問題，並提供一個完整的解決方案，幫助你順利更新 SSL 憑證。</description>
      <pubDate>Sun, 30 Jun 2024 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/certbot-renew</guid>
      <media:thumbnail url="https://emtech.cc/static/certbot-renew/thumbnail.webp" />
      <category>軟體開發</category>
     <content:encoded><![CDATA[<img src="/static/certbot-renew/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>如何更改 SSH 預設埠</title>
      <link>https://emtech.cc/p/ssh-port</link>
      <description>在某些情況下，例如學校或公司網路封鎖了 SSH 預設的 22 埠，你可能需要更改 SSH 伺服器的埠號來確保連接。更改埠號還可以增加一層安全性，因為攻擊者通常會針對常見的 22 埠進行掃描和攻擊。</description>
      <pubDate>Mon, 24 Jun 2024 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/ssh-port</guid>
      <media:thumbnail url="https://emtech.cc/static/ssh-port/thumbnail.webp" />
      <category>軟體開發</category>
     <content:encoded><![CDATA[<img src="/static/ssh-port/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>啊我剛才 push 錯了！如何在 Git 中撤銷提交</title>
      <link>https://emtech.cc/p/git-revert</link>
      <description>在使用 Git 管理項目的過程中難免會腦霧，push 完了之後才發現有錯誤，或是不小心推送了不應該存在的分支。</description>
      <pubDate>Mon, 17 Jun 2024 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/git-revert</guid>
      <media:thumbnail url="https://emtech.cc/static/git-revert/thumbnail.webp" />
      <category>軟體開發</category>
     <content:encoded><![CDATA[<img src="/static/git-revert/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>如何在 Linux 中使用 7z 壓縮和解壓縮檔案：完整簡單的教學</title>
      <link>https://emtech.cc/p/7zip</link>
      <description>在傳輸大量檔案時，壓縮和解壓縮檔案簡直是必備的救命技能。而其中我最喜歡的軟體就是 7z（7-Zip），因為使用起來非常簡單，且壓縮出來的檔案真的是有夠小。今天我要來和你分享如何在 Linux 終端機使用 7z 壓縮和解壓縮檔案。</description>
      <pubDate>Fri, 31 May 2024 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/7zip</guid>
      <media:thumbnail url="https://emtech.cc/static/7zip/thumbnail.webp" />
      <category>生活駭客,軟體開發</category>
     <content:encoded><![CDATA[<img src="/static/7zip/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>部署 Node.js 專案到虛擬機上 - pm2, nginx 一次上手</title>
      <link>https://emtech.cc/p/nodejs-deploy-vm</link>
      <description>今天我們寫完了一個 Node.js 專案，接下來要部屬到虛擬機上。這篇文章將會教你如何使用 pm2 來管理 Node.js 專案，nginx 來轉發 HTTP 請求，最後使用 Cloudflare 來設定 DNS 和 SSL。</description>
      <pubDate>Fri, 31 May 2024 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/nodejs-deploy-vm</guid>
      <media:thumbnail url="https://emtech.cc/static/nodejs-deploy-vm/thumbnail.webp" />
      <category>軟體開發</category>
     <content:encoded><![CDATA[<img src="/static/nodejs-deploy-vm/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>Line bot 新 API! Messaging API 顯示思考中動畫</title>
      <link>https://emtech.cc/p/line-loading</link>
      <description>Line 在 2024/04/17 推出了新的 Messaging API，其中一個功能是可以顯示思考中動畫。讓使用者知道機器人正在思考中，並不是已讀不回。對於現在許多機器人會串接 LLM API 的應用來說，這個功能非常實用。為了讓大家更好理解，今天我們先不要急著串接生成式 AI，我們來使用 Google Apps Script 做一個簡單的 Demo 吧！</description>
      <pubDate>Thu, 16 May 2024 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/line-loading</guid>
      <media:thumbnail url="https://emtech.cc/static/line-loading/thumbnail.webp" />
      <category>軟體開發,科技趨勢</category>
     <content:encoded><![CDATA[<img src="/static/line-loading/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>Gemini API 快速入門：來用 Js 做一個線上聊天吧</title>
      <link>https://emtech.cc/p/gemini-api</link>
      <description>Google 的 Gemini 推出了幾個月，雖然我個人覺得能力不及 GPT-4 但是每分鐘免費 60 次呼叫也太大方了吧！還不趕快來玩一波。今天我們就來使用純 HTML 和 JavaScript 製作一個簡單的線上對話網站來與 Gemini 聊天吧！</description>
      <pubDate>Wed, 15 May 2024 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/gemini-api</guid>
      <media:thumbnail url="https://emtech.cc/static/gemini-api/thumbnail.webp" />
      <category>軟體開發</category>
     <content:encoded><![CDATA[<img src="/static/gemini-api/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>Tampermonkey 腳本 - 一鍵複製 GitHub 倉庫名</title>
      <link>https://emtech.cc/p/greasy-copy-github-repo-name</link>
      <description>這個腳本能在 GitHub 頁面上添加一個按鈕，點擊後即可複製倉庫名（owner/repo）</description>
      <pubDate>Mon, 13 May 2024 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/greasy-copy-github-repo-name</guid>
      <media:thumbnail url="https://emtech.cc" />
      <category>生活駭客</category>
     <content:encoded><![CDATA[<img src="" />]]></content:encoded>
    </item>
<item>
      <title>蘋果 2024 5 月發布會懶人包 - Apple Pencil Pro 有陀螺儀還會震動，iPad Pro 減掉瀏海</title>
      <link>https://emtech.cc/p/apple-event-2024-may</link>
      <description>在今天 2024 年 5 月 7 日的蘋果發布會 Apple Events 上，他們帶來全新的 iPad Pro、更大的 iPad Air，以及全新的 Apple Pencil Pro。讓我們來看看這次的發布會有哪些亮點，以及沒有在影片中提到的重點。</description>
      <pubDate>Tue, 07 May 2024 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/apple-event-2024-may</guid>
      <media:thumbnail url="https://emtech.cc" />
      <category>科技趨勢</category>
     <content:encoded><![CDATA[<img src="" />]]></content:encoded>
    </item>
<item>
      <title>2024 仰望盃心得</title>
      <link>https://emtech.cc/p/2024-phys5</link>
      <description>仰望盃全國科學 HomeRun 實作大賽是科學實驗競賽，不是黑克松那種專題開發競賽。</description>
      <pubDate>Sun, 05 May 2024 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/2024-phys5</guid>
      <media:thumbnail url="https://emtech.cc/static/2024-phys5/thumbnail.webp" />
      <category>生活雜談</category>
     <content:encoded><![CDATA[<img src="/static/2024-phys5/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>如何在 Raspberry Pi 上安裝 Tensorflow? (含 Jupyter Notebook)</title>
      <link>https://emtech.cc/p/rp-tensorflow</link>
      <description>本文將教你如何在 Raspberry Pi (樹莓派) 上安裝 Tensorflow 以及 Jupyter Notebook。</description>
      <pubDate>Wed, 01 May 2024 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/rp-tensorflow</guid>
      <media:thumbnail url="https://emtech.cc/static/rp-tensorflow/thumbnail.webp" />
      <category>軟體開發</category>
     <content:encoded><![CDATA[<img src="/static/rp-tensorflow/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>停更通知</title>
      <link>https://emtech.cc/p/2024-stop-updating</link>
      <description>毛哥EM資訊密技自 2020 開始於網路上分享資訊，至今已經有 4 年的時間。在這段時間裡，我嘗試利用身為學生有限的時間和精力，分享近期的專案與我認為實用的技巧。然而，由於個人原因，我決定停更一段時間。</description>
      <pubDate>Mon, 01 Apr 2024 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/2024-stop-updating</guid>
      <media:thumbnail url="https://emtech.cc" />
      <category></category>
     <content:encoded><![CDATA[<img src="" />]]></content:encoded>
    </item>
<item>
      <title>如何自製 GitHub Actions 並上架至 Marketplace</title>
      <link>https://emtech.cc/p/create-github-action</link>
      <description>GitHub Actions 是 GitHub 提供的一個 CI/CD 服務，可以讓你在 GitHub 上自動化你的工作流程，幫你生成文件、測試安全性、部署應用程式等等。而 GitHub Marketplace 則是一個整合了 GitHub Actions 的地方，你可以在這裡找到各種各樣的 Action 來幫助你的專案。在這篇文章中，我將教你如何自製 GitHub Actions 並上架至 Marketplace。</description>
      <pubDate>Mon, 01 Apr 2024 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/create-github-action</guid>
      <media:thumbnail url="https://emtech.cc/static/create-github-action/thumbnail.webp" />
      <category>軟體開發</category>
     <content:encoded><![CDATA[<img src="/static/create-github-action/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>如何設定全球通用頭像 Gravatar？以 Jitsi 為例</title>
      <link>https://emtech.cc/p/gravatar</link>
      <description>你是否常常煩惱每次更換頭像每個社群平台都需要一個個更換？或著是你是一位程式發者想要自動獲的頭像不用一個個抓？今天我要來和你分享 Gravatar（全球通用頭像），以及介紹他的使用方式。</description>
      <pubDate>Fri, 15 Mar 2024 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/gravatar</guid>
      <media:thumbnail url="https://emtech.cc/static/gravatar/thumbnail.webp" />
      <category>生活駭客</category>
     <content:encoded><![CDATA[<img src="/static/gravatar/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>如何使用 Certbot 申請免費的 SSL 憑證，並使用 DNS 驗證？</title>
      <link>https://emtech.cc/p/certbot</link>
      <description>最近我一直在玩我的樹莓派，想要在上面架設一個檔案下載網站。但是沒有 SSL 憑證每次都會被瀏覽器警告說網站不安全，所以我決定使用 Certbot 申請一個免費的 SSL 憑證。在這篇文章中，我將分享如何使用 Certbot 申請免費的 SSL 憑證，並使用 DNS 驗證。</description>
      <pubDate>Sun, 10 Mar 2024 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/certbot</guid>
      <media:thumbnail url="https://emtech.cc/static/certbot/thumbnail.webp" />
      <category>軟體開發</category>
     <content:encoded><![CDATA[<img src="/static/certbot/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>Notion 資料庫如何免費批量輸出 PDF，並且合併？</title>
      <link>https://emtech.cc/p/notion-database</link>
      <description>Notion 是一個出色的筆記軟體，但是有一個問題是它的資料庫即使是教育方案依舊無法批量輸出 PDF。這對於我來說非常不方便，因為每次打辯論都需要輸出六七十份頁面，每頁都要花個 15 秒才能下載，還要解壓縮，合併 PDF，實在有夠麻煩！因此我花了幾天的時間使用 python 寫了一簡單的小工具。只需要給連結就能一次輸出整個資料庫的所有文件，並合併成一份 PDF。過程中使用 Google Colab 的雲端計算，因此不會消耗你的電腦資源及網路。</description>
      <pubDate>Thu, 22 Feb 2024 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/notion-database</guid>
      <media:thumbnail url="https://emtech.cc/static/notion-database/thumbnail.webp" />
      <category>生活駭客,軟體開發</category>
     <content:encoded><![CDATA[<img src="/static/notion-database/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>教學：將學校行事曆輕鬆加入 Apple 日曆</title>
      <link>https://emtech.cc/p/subscribe-calendar</link>
      <description>在這篇文章中，我要教你如何將 Google 行事曆輕鬆加入你的 Apple 日曆中，方便你隨時掌握校園或者活動動態。讓我們開始吧！</description>
      <pubDate>Fri, 12 Jan 2024 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/subscribe-calendar</guid>
      <media:thumbnail url="https://emtech.cc/static/subscribe-calendar/thumbnail.webp" />
      <category>生活駭客</category>
     <content:encoded><![CDATA[<img src="/static/subscribe-calendar/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>用 iPhone 開機電腦和查看狀態 - 使用 ESP32 加入 Homekit</title>
      <link>https://emtech.cc/p/Homekit-PC</link>
      <description>你有沒有在遠端想要控制電腦，但是電腦沒有開機？或著是享受一回到家電腦已經開好了的爽快。於是你研究如何使用 Wake On Lan，但是發現一定要用有線網路不能用 Wi-Fi? 看不到狀態就算了有時候還會失效？</description>
      <pubDate>Tue, 09 Jan 2024 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/Homekit-PC</guid>
      <media:thumbnail url="https://emtech.cc/static/Homekit-PC/power.webp" />
      <category>生活駭客</category>
     <content:encoded><![CDATA[<img src="/static/Homekit-PC/power.webp" />]]></content:encoded>
    </item>
<item>
      <title>Firefox 如何翻譯網站？</title>
      <link>https://emtech.cc/p/firefox-translate</link>
      <description>Firefox 有著卓越的性能及隱私保護，加上他有許多實用的開發者工具，一直是我的愛用的瀏覽器。然而，Firefox 目前還沒有內建中文翻譯功能，因此，今天我要來和你分享如何不透過擴充功能，只需要透過「書籤」就能夠在 Firefox 一鍵翻譯網站。</description>
      <pubDate>Sun, 31 Dec 2023 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/firefox-translate</guid>
      <media:thumbnail url="https://emtech.cc/static/firefox-translate/thumbnail.webp" />
      <category>生活駭客</category>
     <content:encoded><![CDATA[<img src="/static/firefox-translate/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>如何不透過 Microsoft Store 安裝 Microsoft Store 的應用程式</title>
      <link>https://emtech.cc/p/microsoft-store</link>
      <description>Microsoft Store 是 Windows 內建的應用程式商店。理論上它應該是一個很方便的東西，能夠安全的下載應用程式。但是實際上他的 Bug 很多，很多時候會因為一些奇怪的原因無法使用。最常見的就是 Windows Update 的錯誤會導致 Microsoft Store 無法使用。因此這篇文章將會教你如何不透過 Microsoft Store 安裝 Microsoft Store 的應用程式。</description>
      <pubDate>Tue, 05 Dec 2023 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/microsoft-store</guid>
      <media:thumbnail url="https://emtech.cc/static/microsoft-store/thumbnail.webp" />
      <category>精選,生活駭客</category>
     <content:encoded><![CDATA[<img src="/static/microsoft-store/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>Day30 三十天的血與淚 - 密技</title>
      <link>https://emtech.cc/p/2023ironman-30</link>
      <description>不知不覺，三十天的鐵人賽就要結束了。一開始還覺得時間很漫長，但到了二十幾天之後我開始發現時間不多了，十分珍惜每一次能夠和大家分享的機會。</description>
      <pubDate>Sat, 14 Oct 2023 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/2023ironman-30</guid>
      <media:thumbnail url="https://emtech.cc/static/2023ironman-1/thumbnail.webp" />
      <category>生活雜談,網頁開發</category>
     <content:encoded><![CDATA[<img src="/static/2023ironman-1/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>Day 29 鐵人賽太空粒子的例子</title>
      <link>https://emtech.cc/p/2023ironman-29</link>
      <description>相信大家對於這個頁面都不陌生吧。這是我們 2023 iThome 鐵人賽的首頁。我覺得他的粒子特效和地球很酷，所以我們今天就來看看怎麼做吧。</description>
      <pubDate>Fri, 13 Oct 2023 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/2023ironman-29</guid>
      <media:thumbnail url="https://emtech.cc/static/2023ironman-1/thumbnail.webp" />
      <category>網頁開發</category>
     <content:encoded><![CDATA[<img src="/static/2023ironman-1/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>Day28 純 JavaScript Slider (ft. CSS scroll-snap-type)</title>
      <link>https://emtech.cc/p/2023ironman-28</link>
      <description>今天我們要來製作 Slider 效果。不過要用一個你應該沒有看過有人這樣做但卻很簡單的方法。</description>
      <pubDate>Thu, 12 Oct 2023 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/2023ironman-28</guid>
      <media:thumbnail url="https://emtech.cc/static/2023ironman-1/thumbnail.webp" />
      <category>網頁開發</category>
     <content:encoded><![CDATA[<img src="/static/2023ironman-1/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>Day 27 iT 邦幫忙::一起幫忙製作導覽列，拯救第 27 天</title>
      <link>https://emtech.cc/p/2023ironman-27</link>
      <description>今天我們要來製作 iT 邦幫忙首頁的導覽列。我們先來看看原本的網站。</description>
      <pubDate>Wed, 11 Oct 2023 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/2023ironman-27</guid>
      <media:thumbnail url="https://emtech.cc/static/2023ironman-1/thumbnail.webp" />
      <category>網頁開發</category>
     <content:encoded><![CDATA[<img src="/static/2023ironman-1/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>Day26 不要躲在下面動！Animate On Scroll 自己做</title>
      <link>https://emtech.cc/p/2023ironman-26</link>
      <description>我們都知道 CSS 動畫可以用 @keyframes 來做，但是他們都是馬上就觸發的。就算元素還沒有出現在畫面上，動畫也已經開始了。</description>
      <pubDate>Tue, 10 Oct 2023 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/2023ironman-26</guid>
      <media:thumbnail url="https://emtech.cc/static/2023ironman-1/thumbnail.webp" />
      <category>網頁開發</category>
     <content:encoded><![CDATA[<img src="/static/2023ironman-1/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>Day25 有料的 CSS 漢堡選單</title>
      <link>https://emtech.cc/p/2023ironman-25</link>
      <description>我們今天要來做幾份漢堡選單。</description>
      <pubDate>Mon, 09 Oct 2023 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/2023ironman-25</guid>
      <media:thumbnail url="https://emtech.cc/static/2023ironman-1/thumbnail.webp" />
      <category>網頁開發</category>
     <content:encoded><![CDATA[<img src="/static/2023ironman-1/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>Day24 CSS 相融黏滯效果</title>
      <link>https://emtech.cc/p/2023ironman-24</link>
      <description>今天我們要來做這個紓壓的效果：</description>
      <pubDate>Sun, 08 Oct 2023 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/2023ironman-24</guid>
      <media:thumbnail url="https://emtech.cc/static/2023ironman-1/thumbnail.webp" />
      <category>網頁開發</category>
     <content:encoded><![CDATA[<img src="/static/2023ironman-1/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>Day23 優雅的漸層動畫 - 隨機而有秩序</title>
      <link>https://emtech.cc/p/2023ironman-23</link>
      <description>今天我們會提到幾個不同的原理。你可以像生菜沙拉一樣自己條配。</description>
      <pubDate>Sat, 07 Oct 2023 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/2023ironman-23</guid>
      <media:thumbnail url="https://emtech.cc/static/2023ironman-1/thumbnail.webp" />
      <category>網頁開發</category>
     <content:encoded><![CDATA[<img src="/static/2023ironman-1/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>Day 22 JavaScript 乱薍覼釠亂碼效果</title>
      <link>https://emtech.cc/p/2023ironman-22</link>
      <description>今天我們要來做一些乱薍覼釠亂碼效果。</description>
      <pubDate>Fri, 06 Oct 2023 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/2023ironman-22</guid>
      <media:thumbnail url="https://emtech.cc/static/2023ironman-1/thumbnail.webp" />
      <category>網頁開發</category>
     <content:encoded><![CDATA[<img src="/static/2023ironman-1/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>Day21 就是要對決 - CSS 和 JS 動畫，哪個更絲滑？</title>
      <link>https://emtech.cc/p/2023ironman-21</link>
      <description>今天是第二十一天，已經走完 2/3 的路程，我媽還以為我早被淘汰了。這個系列明明是叫【不用庫 也能酷 - 玩轉 CSS &amp; Js 特效】，但 Js 出現了幾篇？有五篇嗎？難道 JavaScript 是來湊關鍵字的嗎？今天就來聊聊為甚麼使用純 CSS 做效果如此吸引人。</description>
      <pubDate>Thu, 05 Oct 2023 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/2023ironman-21</guid>
      <media:thumbnail url="https://emtech.cc/static/2023ironman-1/thumbnail.webp" />
      <category>網頁開發</category>
     <content:encoded><![CDATA[<img src="/static/2023ironman-1/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>Day20 GPU! 啟動！- 淺談 CSS3 硬體加速</title>
      <link>https://emtech.cc/p/2023ironman-20</link>
      <description>今天我們要來探討如何善用使用者的 GPU 資源，讓網頁的動畫更加順暢。我盡量讓內容簡單易懂，可以當一篇科普文章閱讀。</description>
      <pubDate>Wed, 04 Oct 2023 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/2023ironman-20</guid>
      <media:thumbnail url="https://emtech.cc/static/2023ironman-1/thumbnail.webp" />
      <category>網頁開發</category>
     <content:encoded><![CDATA[<img src="/static/2023ironman-1/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>Day19 純 CSS 做出彈出式 Lightbox</title>
      <link>https://emtech.cc/p/2023ironman-19</link>
      <description>最討厭的廣告就是彈出式 Lightbox 廣告了，他會突然跳出來，然後你要去找那個超小的叉叉關掉他。今天我們不是要重現煩人的廣告，而是要來認識 CSS 選擇器 :target 並做出以下效果。</description>
      <pubDate>Tue, 03 Oct 2023 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/2023ironman-19</guid>
      <media:thumbnail url="https://emtech.cc/static/2023ironman-1/thumbnail.webp" />
      <category>網頁開發</category>
     <content:encoded><![CDATA[<img src="/static/2023ironman-1/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>Day18 純 CSS DVD 反彈動畫</title>
      <link>https://emtech.cc/p/2023ironman-18</link>
      <description>今天我們要使用純 CSS 實現 DVD 反彈動畫，讓大家認識 steps() 以及 animation-composition 屬性的使用方式，並提供這個實用的應用。(應該吧...)</description>
      <pubDate>Mon, 02 Oct 2023 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/2023ironman-18</guid>
      <media:thumbnail url="https://emtech.cc/static/2023ironman-1/thumbnail.webp" />
      <category>網頁開發</category>
     <content:encoded><![CDATA[<img src="/static/2023ironman-1/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>Day17 css.wav 純 CSS 波浪進度條</title>
      <link>https://emtech.cc/p/2023ironman-17</link>
      <description>以往製作波浪效果不是使用 GIF 就是借助貝茲曲線。貝茲曲線就是 Ai 或是 Vectornator (現在叫做 Curve) 裡面的鋼筆工具。隨便拉都會有波浪的感覺，且使用 SVG 或 JavaScript Canvas 都不難實現。</description>
      <pubDate>Sun, 01 Oct 2023 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/2023ironman-17</guid>
      <media:thumbnail url="https://emtech.cc/static/2023ironman-1/thumbnail.webp" />
      <category>網頁開發</category>
     <content:encoded><![CDATA[<img src="/static/2023ironman-1/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>Day16 今天我想來...欸現在幾點？- CSS 畫出 iOS 時鐘</title>
      <link>https://emtech.cc/p/2023ironman-16</link>
      <description>今天我們要來製作一個時鐘。不使用圖片，只使用 CSS 來繪製。我的目標是可以做出類似於 Apple iOS17 StandBy 的時鐘效果。</description>
      <pubDate>Sat, 30 Sep 2023 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/2023ironman-16</guid>
      <media:thumbnail url="https://emtech.cc/static/2023ironman-1/thumbnail.webp" />
      <category>網頁開發</category>
     <content:encoded><![CDATA[<img src="/static/2023ironman-1/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>Day15 今天我想來點...純 CSS 的並排選單</title>
      <link>https://emtech.cc/p/2023ironman-15</link>
      <description>昨天我們做了一個開關，那麼我們今天就來做一個選單吧！</description>
      <pubDate>Fri, 29 Sep 2023 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/2023ironman-15</guid>
      <media:thumbnail url="https://emtech.cc/static/2023ironman-1/thumbnail.webp" />
      <category>網頁開發</category>
     <content:encoded><![CDATA[<img src="/static/2023ironman-1/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>Day14 今天我想來點… 純 CSS 的開關</title>
      <link>https://emtech.cc/p/2023ironman-14</link>
      <description>在手機開關的設定裡面通常不是 checkbox，而是這種 toggle 開關。因為比較好看，且更有開關的感覺。</description>
      <pubDate>Thu, 28 Sep 2023 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/2023ironman-14</guid>
      <media:thumbnail url="https://emtech.cc/static/2023ironman-1/thumbnail.webp" />
      <category>網頁開發</category>
     <content:encoded><![CDATA[<img src="/static/2023ironman-1/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>Day13 今天我想來點… 顏色選單</title>
      <link>https://emtech.cc/p/2023ironman-13</link>
      <description>昨天的內容是不是有一點燒腦？沒關係，今天來點輕鬆的，只有一行 JavaScript。不管是在線上的文書軟體、製作網站的網站、或甚至是 iOS StandBy 都會有顏色選單。今天我們就來做一個極簡的吧，還要加上自訂顏色的功能。</description>
      <pubDate>Wed, 27 Sep 2023 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/2023ironman-13</guid>
      <media:thumbnail url="https://emtech.cc/static/2023ironman-1/thumbnail.webp" />
      <category>網頁開發</category>
     <content:encoded><![CDATA[<img src="/static/2023ironman-1/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>Day12 Js 滾動視差 甚麼都能滾 (ft. 國中數學)</title>
      <link>https://emtech.cc/p/2023ironman-12</link>
      <description>以下內容是我高一在上公民課時體悟的數學大道理，和網路上大多的做法都不太一樣。這篇文章假設你已學會國中直線方程式。如果不會的話…我也沒辦法。</description>
      <pubDate>Tue, 26 Sep 2023 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/2023ironman-12</guid>
      <media:thumbnail url="https://emtech.cc/static/2023ironman-1/thumbnail.webp" />
      <category>網頁開發</category>
     <content:encoded><![CDATA[<img src="/static/2023ironman-1/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>Day11 說滾不是真的要你滾 - 背景滾動視差</title>
      <link>https://emtech.cc/p/2023ironman-11</link>
      <description>你有看過這種頁面往下滾，但圖片位置沒有往下的效果嗎？</description>
      <pubDate>Mon, 25 Sep 2023 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/2023ironman-11</guid>
      <media:thumbnail url="https://emtech.cc/static/2023ironman-1/thumbnail.webp" />
      <category>網頁開發</category>
     <content:encoded><![CDATA[<img src="/static/2023ironman-1/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>Day10 永無止境跑馬燈 - 不同螢幕 相同速度</title>
      <link>https://emtech.cc/p/2023ironman-10</link>
      <description>這是我高一在學校吃肉蛋吐司時想到的做法，因此此篇文章假設你已熟悉國小數學。</description>
      <pubDate>Sun, 24 Sep 2023 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/2023ironman-10</guid>
      <media:thumbnail url="https://emtech.cc/static/2023ironman-1/thumbnail.webp" />
      <category>網頁開發</category>
     <content:encoded><![CDATA[<img src="/static/2023ironman-1/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>Day9 給你五彩斑斕的黑：mix-blend-mode</title>
      <link>https://emtech.cc/p/2023ironman-9</link>
      <description>昨天我們只是一個人的色而已，今天疊在一起更刺激。</description>
      <pubDate>Sat, 23 Sep 2023 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/2023ironman-9</guid>
      <media:thumbnail url="https://emtech.cc/static/2023ironman-1/thumbnail.webp" />
      <category>網頁開發</category>
     <content:encoded><![CDATA[<img src="/static/2023ironman-1/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>Day8 滿足你的色域！color: color</title>
      <link>https://emtech.cc/p/2023ironman-8</link>
      <description>今天這一篇是一個很色的冷知識分享。可以讓你調出很冷的顏色。</description>
      <pubDate>Fri, 22 Sep 2023 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/2023ironman-8</guid>
      <media:thumbnail url="https://emtech.cc/static/2023ironman-1/thumbnail.webp" />
      <category>網頁開發</category>
     <content:encoded><![CDATA[<img src="/static/2023ironman-1/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>Day7 幫我開濾鏡 filter</title>
      <link>https://emtech.cc/p/2023ironman-7</link>
      <description>CSS 的濾鏡屬性是一個非常實用且可以瞬間讓一個網頁看起來很厲害的功能。讓你可以以各種方式修改和調整圖像和元素的呈現方式，也可以讓元素模糊，或者是直接改變圖示顏色等等。今天我們將深入探討 CSS filter 屬性，解釋其各種功能以及如何使用它來建立引人注目的效果。</description>
      <pubDate>Thu, 21 Sep 2023 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/2023ironman-7</guid>
      <media:thumbnail url="https://emtech.cc/static/2023ironman-1/thumbnail.webp" />
      <category>網頁開發</category>
     <content:encoded><![CDATA[<img src="/static/2023ironman-1/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>Day6 你怎在這？攻克 Position</title>
      <link>https://emtech.cc/p/2023ironman-6</link>
      <description>在使用 CSS 做網站時幾乎一定會使用到 position 屬性，不過你真的知道它的原理和使用方式嗎？雖然乍看之下感覺很複雜但其實超簡單，你只需要幾分鐘就能完全理解了。</description>
      <pubDate>Wed, 20 Sep 2023 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/2023ironman-6</guid>
      <media:thumbnail url="https://emtech.cc/static/2023ironman-1/thumbnail.webp" />
      <category>網頁開發</category>
     <content:encoded><![CDATA[<img src="/static/2023ironman-1/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>Day5 載入中… Animation-delay</title>
      <link>https://emtech.cc/p/2023ironman-5</link>
      <description>假設你今天想製作這個載入動畫…</description>
      <pubDate>Tue, 19 Sep 2023 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/2023ironman-5</guid>
      <media:thumbnail url="https://emtech.cc/static/2023ironman-1/thumbnail.webp" />
      <category>網頁開發</category>
     <content:encoded><![CDATA[<img src="/static/2023ironman-1/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>Day4 自己動！@keyframes 與 Transition</title>
      <link>https://emtech.cc/p/2023ironman-4</link>
      <description>今天我們要來玩玩 CSS 動畫。CSS 動畫有兩種：</description>
      <pubDate>Mon, 18 Sep 2023 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/2023ironman-4</guid>
      <media:thumbnail url="https://emtech.cc/static/2023ironman-1/thumbnail.webp" />
      <category>網頁開發</category>
     <content:encoded><![CDATA[<img src="/static/2023ironman-1/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>Day3 用 Flex 切遍天下</title>
      <link>https://emtech.cc/p/2023ironman-3</link>
      <description>當你拿到一張設計圖要照著做出來你的第一反應是什麼呢？是直接套 bootstrap 再說嗎？但我幾乎所有的切版**只要是整齊能畫出網格的，我都會使用 flex。**而這個網格也不一定是正方形，只要是矩形就可以了。</description>
      <pubDate>Sun, 17 Sep 2023 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/2023ironman-3</guid>
      <media:thumbnail url="https://emtech.cc/static/2023ironman-1/thumbnail.webp" />
      <category>網頁開發</category>
     <content:encoded><![CDATA[<img src="/static/2023ironman-1/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>Day2 如何打的更快 | Emmet &amp; 預測輸入</title>
      <link>https://emtech.cc/p/2023ironman-2</link>
      <description>記得我在國一寫 HTML 的時候，傻傻的在那裡打小於、h1、大於、標題、小於、斜線、大於。我的朋友甚至發現了一個偷吃步就是先打好一堆大於小於，然後再填空。</description>
      <pubDate>Sat, 16 Sep 2023 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/2023ironman-2</guid>
      <media:thumbnail url="https://emtech.cc/static/2023ironman-1/thumbnail.webp" />
      <category>網頁開發</category>
     <content:encoded><![CDATA[<img src="/static/2023ironman-1/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>Day1 相見歡 - 庫就不酷嗎？</title>
      <link>https://emtech.cc/p/2023ironman-1</link>
      <description>哈囉大家好我是毛哥EM，歡迎來到 【不用庫 也能酷 - 玩轉 CSS &amp; Js 特效】</description>
      <pubDate>Fri, 15 Sep 2023 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/2023ironman-1</guid>
      <media:thumbnail url="https://emtech.cc/static/2023ironman-1/thumbnail.webp" />
      <category>網頁開發</category>
     <content:encoded><![CDATA[<img src="/static/2023ironman-1/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>iOS 如何把 Twitter 換成原本 Logo？全網唯一不用捷徑！沒有跳轉！</title>
      <link>https://emtech.cc/p/twitter-logo</link>
      <description>我自製了一個描述檔可以建立一個書籤在主畫面。是全網唯一沒有捷徑跳轉的方法。</description>
      <pubDate>Sat, 05 Aug 2023 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/twitter-logo</guid>
      <media:thumbnail url="https://emtech.cc/static/twitter-logo/thumbnail.webp" />
      <category>生活駭客</category>
     <content:encoded><![CDATA[<img src="/static/twitter-logo/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>VSCode 教學與你值得擁有的擴充功能</title>
      <link>https://emtech.cc/p/webpallet-4</link>
      <description>此系列已停更，歡迎可以參考我重新專寫的網頁開發教學。</description>
      <pubDate>Mon, 31 Jul 2023 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/webpallet-4</guid>
      <media:thumbnail url="https://emtech.cc/static/webpallet-0/thumbnail.webp" />
      <category></category>
     <content:encoded><![CDATA[<img src="/static/webpallet-0/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>EP.3 10 分鐘 基本 CSS 教學</title>
      <link>https://emtech.cc/p/webpallet-3</link>
      <description>哈囉大家好，我是毛哥EM，歡迎來到網棧。今天我要讓你 10 分鐘學會所有常用的 CSS 語法</description>
      <pubDate>Mon, 12 Jun 2023 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/webpallet-3</guid>
      <media:thumbnail url="https://emtech.cc/static/webpallet-0/thumbnail.webp" />
      <category></category>
     <content:encoded><![CDATA[<img src="/static/webpallet-0/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>iPadOS 17 真實心得 官方沒講的秘密，質感體驗的大升級（不斷更新）</title>
      <link>https://emtech.cc/p/iPadOS17</link>
      <description>iOS 17 與 iPadOS 17 在今年 6/6 號發佈，而隔天就開放 developer beta 版給我們使用了，可以說是最快的一次。儘管在發佈會上 iPadOS 的篇幅並不多，但多了很說實用的小更新，以及介面質感的大提升。發布會上沒有提到一次 Ai，但但滿滿的都是人工智慧和深度學習。</description>
      <pubDate>Fri, 09 Jun 2023 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/iPadOS17</guid>
      <media:thumbnail url="https://emtech.cc" />
      <category>科技趨勢</category>
     <content:encoded><![CDATA[<img src="" />]]></content:encoded>
    </item>
<item>
      <title>所有 iOS &amp; iPadOS 17 Beta 問題整理</title>
      <link>https://emtech.cc/p/ios17-problem</link>
      <description>iOS17 在 6/6 號發佈，且在昨天釋出測試版。以下是我整理出來目前 Apple 官方釋出遇到的問題及解決方案，希望能幫助到你。</description>
      <pubDate>Thu, 08 Jun 2023 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/ios17-problem</guid>
      <media:thumbnail url="https://emtech.cc" />
      <category>生活駭客,科技趨勢</category>
     <content:encoded><![CDATA[<img src="" />]]></content:encoded>
    </item>
<item>
      <title>EP.2 5 分鐘完結 HTML</title>
      <link>https://emtech.cc/p/webpallet-2</link>
      <description>哈囉大家好，我是毛哥EM，歡迎來到網棧。今天我要讓你 5 分鐘學會所有常用的 HTML 語法。</description>
      <pubDate>Mon, 05 Jun 2023 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/webpallet-2</guid>
      <media:thumbnail url="https://emtech.cc/static/webpallet-0/thumbnail.webp" />
      <category></category>
     <content:encoded><![CDATA[<img src="/static/webpallet-0/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>EP.1 什麼是網站？</title>
      <link>https://emtech.cc/p/webpallet-1</link>
      <description>哈囉大家好，我是毛哥EM，歡迎來到網棧。今天我們要來聊聊什麼是網站。</description>
      <pubDate>Mon, 29 May 2023 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/webpallet-1</guid>
      <media:thumbnail url="https://emtech.cc/static/webpallet-0/thumbnail.webp" />
      <category></category>
     <content:encoded><![CDATA[<img src="/static/webpallet-0/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>自製免費點名系統</title>
      <link>https://emtech.cc/p/rol-call</link>
      <description>本文將教授如何使用程式製作一個簡單的點名網頁。透過這個點名系統，你可以方便地管理你的學生出席狀況，並且隨時查詢歷史出席紀錄。我們將使用 Google Apps Script, GitHub 和 Google Sheets 來建立這個點名系統。我敢保證即使你完全不會程式也可以在 5 分鐘內完成。本文會詳細說明從建立 Google Sheets 到部屬網頁的步驟，並提供完整的程式碼和演示網頁。</description>
      <pubDate>Mon, 01 May 2023 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/rol-call</guid>
      <media:thumbnail url="https://emtech.cc/static/rol-call/thumbnail.webp" />
      <category>生活駭客,軟體開發</category>
     <content:encoded><![CDATA[<img src="/static/rol-call/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>EP.0 歡迎來到網棧</title>
      <link>https://emtech.cc/p/webpallet-0</link>
      <description>此系列已停更，歡迎可以參考我重新專寫的網頁開發教學。</description>
      <pubDate>Mon, 01 May 2023 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/webpallet-0</guid>
      <media:thumbnail url="https://emtech.cc/static/webpallet-0/thumbnail.webp" />
      <category></category>
     <content:encoded><![CDATA[<img src="/static/webpallet-0/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>【自製】CrossDown - 一個輕量化跨窗口顯示的 Markdown 編輯器</title>
      <link>https://emtech.cc/p/crossdown</link>
      <description>平常討論事情有時會需要臨時做筆記或馬上呈現內容給大家，但常又不是使用自己的電腦，且網路及環境很差。因此，我製作了這一個好看輕量的線上 markdown 編輯器。不只直覺好用，且會額外將成果顯示在獨立視窗，可直接全屏投影到第二螢幕上，呈現更好的效果避免被偷看其他分頁。最方便是開會還有上課要對答案可以快速清楚地打讓出來呈現。</description>
      <pubDate>Fri, 28 Apr 2023 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/crossdown</guid>
      <media:thumbnail url="https://emtech.cc" />
      <category>生活駭客</category>
     <content:encoded><![CDATA[<img src="" />]]></content:encoded>
    </item>
<item>
      <title>用擴充功能輕鬆修正錫蘭 YouTube 的訂閱數</title>
      <link>https://emtech.cc/p/Ceylan-sub-fix</link>
      <description>大家都知道，錫蘭的 YouTube 訂閱數因為某些原因顯示不太準確。但現在，我有了一個好消息：我開發了一個程式，可以輕鬆自動修正它！想知道怎麼做嗎？繼續往下看！</description>
      <pubDate>Tue, 14 Mar 2023 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/Ceylan-sub-fix</guid>
      <media:thumbnail url="https://emtech.cc/static/Ceylan-sub-fix/thumbnail.webp" />
      <category>生活駭客</category>
     <content:encoded><![CDATA[<img src="/static/Ceylan-sub-fix/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>CSS 濾鏡生成器：輕鬆製作網頁圖示上色效果</title>
      <link>https://emtech.cc/p/css-filter</link>
      <description>隨著網頁設計的發展，圖示上色效果已成為許多網站和應用程式中不可或缺的元素之一。然而，手動編輯每個圖示的色彩是一個繁瑣的任務，因此我進行了一些搜尋製作了這個 CSS 濾鏡生成器。</description>
      <pubDate>Mon, 13 Mar 2023 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/css-filter</guid>
      <media:thumbnail url="https://emtech.cc" />
      <category>軟體開發</category>
     <content:encoded><![CDATA[<img src="" />]]></content:encoded>
    </item>
<item>
      <title>【Google Apps Script】用 Line Bot &amp; Line Notify 轉發群組訊息給自己</title>
      <link>https://emtech.cc/p/line2notify</link>
      <description>你是否有群組充滿著垃圾訊息？用 Line Bot &amp; Line Notify 轉發重要訊息給自己！不用程式經驗，複製貼上就好了！</description>
      <pubDate>Wed, 22 Feb 2023 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/line2notify</guid>
      <media:thumbnail url="https://emtech.cc" />
      <category>生活駭客</category>
     <content:encoded><![CDATA[<img src="" />]]></content:encoded>
    </item>
<item>
      <title>破解赤鬼牛排店的平板限制</title>
      <link>https://emtech.cc/p/akaonisteak</link>
      <description>赤鬼牛排店之前是使用服務鈴，現在是使用 Samsung Galaxy 的平板進行點餐。想必會有可愛的小朋友拿它來看影片或玩遊戲，而赤鬼基於安全考量後來加了應用程式鎖，而這篇文章就要教你如何破解它開啟你想開的軟體</description>
      <pubDate>Mon, 13 Feb 2023 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/akaonisteak</guid>
      <media:thumbnail url="https://emtech.cc/static/akaonisteak/thumbnail.webp" />
      <category>生活駭客</category>
     <content:encoded><![CDATA[<img src="/static/akaonisteak/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>【終端機】快速上手 Vim</title>
      <link>https://emtech.cc/p/vim</link>
      <description>如果你正在尋求一款快速、高效和功能強大的文本編輯器，那麼 Vim 可能是你的最佳選擇。</description>
      <pubDate>Mon, 13 Feb 2023 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/vim</guid>
      <media:thumbnail url="https://emtech.cc/static/vim/thumbnail.webp" />
      <category>程式教學</category>
     <content:encoded><![CDATA[<img src="/static/vim/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>【開源】快速免費啟用 Office 及 Windows</title>
      <link>https://emtech.cc/p/massgrave</link>
      <description>Office 雖然目前有提供免費線上版，但是都一定要使用線上版。除了十分不方便以外許多操作也都受到限制。因此這一篇文章我要來和大家分享一個可以安全啟動 Office 的工具，同時也可以啟用 Windows。適用於所有版本，包括最新的 Office 2024 及 Office 365。</description>
      <pubDate>Thu, 19 Jan 2023 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/massgrave</guid>
      <media:thumbnail url="https://emtech.cc/static/massgrave/thumbnail.webp" />
      <category>生活駭客</category>
     <content:encoded><![CDATA[<img src="/static/massgrave/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>【iOS】進入/退出 Apple Beta 的世界 搶先體驗新功能</title>
      <link>https://emtech.cc/p/apple-beta</link>
      <description>iOS、iPadOS、還有所有 Apple 的系統在正式發布之前都會向部分的使用者提供搶先版 (Beta Version) 讓使用者體驗，來蒐集回饋包括問題回報或是功能建議。這篇文章會教你如何加入 Apple 的 Beta 計畫，以及如果不適應要如何離開。</description>
      <pubDate>Tue, 17 Jan 2023 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/apple-beta</guid>
      <media:thumbnail url="https://emtech.cc/static/apple-beta/thumbnail.webp" />
      <category>生活駭客</category>
     <content:encoded><![CDATA[<img src="/static/apple-beta/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>【Win11】取得電池報告！查看健康度、充電次數、歷史！</title>
      <link>https://emtech.cc/p/win-battery-life</link>
      <description>在 Windows11 無須依靠第三方軟體，只需要一行指令即可輕鬆取得電池的使用記錄和資訊。</description>
      <pubDate>Sat, 03 Dec 2022 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/win-battery-life</guid>
      <media:thumbnail url="https://emtech.cc/static/win-battery-life/thumbnail.webp" />
      <category>生活駭客</category>
     <content:encoded><![CDATA[<img src="/static/win-battery-life/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>【學生】免費全球學校 Wi-Fi &amp; Office365 教育版</title>
      <link>https://emtech.cc/p/edu-office-and-wifi</link>
      <description>你知道學生在在學期間於全世界皆可使用免費 Wi-Fi Eduroam 還有 Office365 嗎？這裡提供完整的操作說明！這是一個知道的人不會願意告訴你的祕密...</description>
      <pubDate>Thu, 01 Dec 2022 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/edu-office-and-wifi</guid>
      <media:thumbnail url="https://emtech.cc/static/edu-office-and-wifi/thumbnail.webp" />
      <category>生活駭客</category>
     <content:encoded><![CDATA[<img src="/static/edu-office-and-wifi/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>【ios】如何開熱點？你藍牙可能沒關過？帶你看懂比女生還難懂的控制中心！用專注模式關閉 Wi-Fi/藍牙！</title>
      <link>https://emtech.cc/p/ios-controls</link>
      <description>ios 的控制中心相較於安卓的開/關複雜許多，這篇文章我將快速介紹這些符號的功能以及如何正確開啟個人熱點別人才收得到。</description>
      <pubDate>Sat, 19 Nov 2022 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/ios-controls</guid>
      <media:thumbnail url="https://emtech.cc/static/ios-controls/thumbnail.webp" />
      <category>生活駭客</category>
     <content:encoded><![CDATA[<img src="/static/ios-controls/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>【視訊會議】EM-SFW - 鏡頭畫質的天花板！黑板不再顛倒/模糊/切割！</title>
      <link>https://emtech.cc/p/EM-SFW</link>
      <description>班上因為又有人確診又有人隔離又開始使用視訊會議，常常被反應黑板看不清楚。明明鏡頭很好、網路不錯、且畫質設定已經調到最高還是一樣。因此我做了一個簡單網站來顯示鏡頭畫面，用螢幕分享畫面的方式讓畫質明顯提升！且黑白不會左右顛倒，不用再去裝擴充外掛！</description>
      <pubDate>Fri, 07 Oct 2022 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/EM-SFW</guid>
      <media:thumbnail url="https://emtech.cc/static/EM-SFW/thumbnail.webp" />
      <category>生活駭客</category>
     <content:encoded><![CDATA[<img src="/static/EM-SFW/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>【C++】常見題目解答</title>
      <link>https://emtech.cc/p/sysh_cpp</link>
      <description>西苑高一電腦課 C++ 題目的最佳解。如果解不出來到想砸電腦或想只到更簡單的方法可以來看看。</description>
      <pubDate>Thu, 08 Sep 2022 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/sysh_cpp</guid>
      <media:thumbnail url="https://emtech.cc" />
      <category>程式教學</category>
     <content:encoded><![CDATA[<img src="" />]]></content:encoded>
    </item>
<item>
      <title>【pdftk】萬能 PDF 工具！一行指令合併 旋轉 提取</title>
      <link>https://emtech.cc/p/pdftk</link>
      <description>用 PDF Toolkit (pdftk) 一行指令完成各種 PDF 處裡！</description>
      <pubDate>Tue, 06 Sep 2022 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/pdftk</guid>
      <media:thumbnail url="https://emtech.cc" />
      <category>生活駭客</category>
     <content:encoded><![CDATA[<img src="" />]]></content:encoded>
    </item>
<item>
      <title>Git &amp; GitHub 基本教學</title>
      <link>https://emtech.cc/p/github-and-git</link>
      <description>這一篇文章我會用簡單好理解的方式讓你學會基本的使用 GitHub 和 Git。且複製貼上就能成為工程師系列所搭建的網站都可以免費架設在 GitHub</description>
      <pubDate>Mon, 22 Aug 2022 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/github-and-git</guid>
      <media:thumbnail url="https://emtech.cc/static/github-and-git/thumbnail.webp" />
      <category>程式教學</category>
     <content:encoded><![CDATA[<img src="/static/github-and-git/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>【終端機】輕鬆更改 SSH 的驗證碼 passpharase</title>
      <link>https://emtech.cc/p/change-ssh-passphrase</link>
      <description>SSH 是一種簡單的登入方式。以我來說在使用 git 來上傳檔案到 GitHub 時，因為我在手機生成並設定好了 ssh，不用每次上傳都需要輸入帳號和全是亂碼的驗證密碼。不過也可以設定在使用 SSH 登入的時候需要輸入一組 passpharase，來保障你的安全。不過如果你想要更改或取消密碼怎麼辦呢</description>
      <pubDate>Fri, 19 Aug 2022 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/change-ssh-passphrase</guid>
      <media:thumbnail url="https://emtech.cc/static/change-ssh-passphrase/thumbnail.webp" />
      <category>軟體開發</category>
     <content:encoded><![CDATA[<img src="/static/change-ssh-passphrase/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>【ShowDesktopPerMonitor】進化 Win+D！多螢幕不互相干擾/所有桌面視窗一鍵顯示</title>
      <link>https://emtech.cc/p/ShowDesktopPerMonitor</link>
      <description>使用多個螢幕可以使工作效率大幅提升。不過如果使用 Win+D 來隱藏視窗、會一次隱藏所有螢幕的所有的視窗。不過透過 ShowDesktopPerMonitor 可以模擬 Win+D 的隱藏視窗。除了可以分開螢幕控制以外，它的隱藏視窗是連工作列都看不到...（要怎麼使用就看你了！）</description>
      <pubDate>Thu, 18 Aug 2022 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/ShowDesktopPerMonitor</guid>
      <media:thumbnail url="https://emtech.cc/static/ShowDesktopPerMonitor/thumbnail.webp" />
      <category>生活駭客</category>
     <content:encoded><![CDATA[<img src="/static/ShowDesktopPerMonitor/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>【GitHub Actions】自動部署你的 Hugo 網站</title>
      <link>https://emtech.cc/p/hugo-githubAction</link>
      <description>每次寫完文章還要打指令生成網站，麻煩死了！讓 GitHub Actions 幫你自動部署，寫完文章直角上傳就好了！</description>
      <pubDate>Wed, 17 Aug 2022 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/hugo-githubAction</guid>
      <media:thumbnail url="https://emtech.cc/static/hugo-githubAction/thumbnail.webp" />
      <category>軟體開發</category>
     <content:encoded><![CDATA[<img src="/static/hugo-githubAction/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>【Google Apps Script】複製貼上讓試算表變身成網頁表格 秀爆你的客戶朋友！</title>
      <link>https://emtech.cc/p/create-site-for-sheet</link>
      <description>直接把整個試算表連結發給別人除了要載入很久且會出現一堆不需要的按鍵，整個畫面很醜很沒有質感。而且如果你把其他隱私的資料也放在裡面，都會被一次看光光。那我們就來幫試算表包個糖衣吧</description>
      <pubDate>Sun, 14 Aug 2022 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/create-site-for-sheet</guid>
      <media:thumbnail url="https://emtech.cc/static/create-site-for-sheet/thumbnail.webp" />
      <category>軟體開發,生活駭客</category>
     <content:encoded><![CDATA[<img src="/static/create-site-for-sheet/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>C 規則</title>
      <link>https://emtech.cc/p/APCS_note</link>
      <description>這是我自己學習的筆記，紀錄一些準備考試的重點，不適合新手閱讀</description>
      <pubDate>Sun, 17 Jul 2022 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/APCS_note</guid>
      <media:thumbnail url="https://emtech.cc" />
      <category>程式教學</category>
     <content:encoded><![CDATA[<img src="" />]]></content:encoded>
    </item>
<item>
      <title>【Remove.bg】讓 AI 幫你一鍵去背</title>
      <link>https://emtech.cc/p/remove-bg</link>
      <description>在這篇文章我要介紹 Remove.bg 這個超讚的去被網站，並講解如何使用它提供的 Api 來製作捷徑，使你能夠一鍵去被</description>
      <pubDate>Thu, 06 Jan 2022 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/remove-bg</guid>
      <media:thumbnail url="https://emtech.cc/static/remove-bg/thumbnail.webp" />
      <category>生活駭客</category>
     <content:encoded><![CDATA[<img src="/static/remove-bg/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>【網頁&amp;捷徑】旌旗教會週報下載器</title>
      <link>https://emtech.cc/p/banner_weekly_downloader</link>
      <description>當時在製作的時候正是疫情爆發的時間，教會聚會全面改成線上，且只有提供週報的圖片檔，因此製作了一個可以下載週報的網站。即使現在疫情已經過去，我還是習慣使用這它</description>
      <pubDate>Wed, 01 Dec 2021 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/banner_weekly_downloader</guid>
      <media:thumbnail url="https://emtech.cc/static/banner_weekly_downloader/thumbnail.webp" />
      <category>生活駭客</category>
     <content:encoded><![CDATA[<img src="/static/banner_weekly_downloader/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>【Google Apps Script】自製點名系統</title>
      <link>https://emtech.cc/p/frog_check_in</link>
      <description>大眼蛙教練的課程是以堂數做計算，也就是來一次算一次，而不是一段時間。因此每次學生上課都需要簽到，最後還需要人工來統計。因此我做了一個簡單的點名系統，讓電腦來做統計和計算的工作。</description>
      <pubDate>Thu, 07 Oct 2021 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/frog_check_in</guid>
      <media:thumbnail url="https://emtech.cc/static/frog_check_in/thumbnail.webp" />
      <category>軟體開發,生活駭客</category>
     <content:encoded><![CDATA[<img src="/static/frog_check_in/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>【MultiWall】讓不同螢幕放不同桌布</title>
      <link>https://emtech.cc/p/MultiWall</link>
      <description>使用多個螢幕可以大大的增加工作效率。比如說在開直播時可以在遊戲全螢幕時同時做 OBS 畫面切換或是查看聊天室。但是你是否有發現所有螢幕的桌布都只能設定一樣的。而如果你像我一樣兩個螢幕比例不同的話，其中一張比例會直接跑掉，十分的影響美觀。</description>
      <pubDate>Wed, 08 Sep 2021 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/MultiWall</guid>
      <media:thumbnail url="https://emtech.cc/static/MultiWall/thumbnail.webp" />
      <category>生活駭客</category>
     <content:encoded><![CDATA[<img src="/static/MultiWall/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>【is.gd】超好用網址縮短！連 Apple 都在用</title>
      <link>https://emtech.cc/p/is-gd</link>
      <description>太長的網址常除了不好看占版面之外，也難以令人記住。因此所短網址是一個不錯的做法。而其中我最常用的就是 is.gd，因為它 is good~</description>
      <pubDate>Mon, 16 Aug 2021 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/is-gd</guid>
      <media:thumbnail url="https://emtech.cc/static/is-gd/thumbnail.webp" />
      <category>生活駭客</category>
     <content:encoded><![CDATA[<img src="/static/is-gd/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>【Zoom】是個超讚綠幕！輕鬆去背到 OBS</title>
      <link>https://emtech.cc/p/vb-cable</link>
      <description>使用 OBS 攝取 Zoom 的視窗。</description>
      <pubDate>Sat, 14 Aug 2021 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/vb-cable</guid>
      <media:thumbnail url="https://emtech.cc/static/vb-cable/thumbnail.webp" />
      <category>生活駭客</category>
     <content:encoded><![CDATA[<img src="/static/vb-cable/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>【捷徑】史上最快簡訊實名制</title>
      <link>https://emtech.cc/p/shortcut-real_name_system</link>
      <description>我保證這是史上最快的簡訊實名制方法</description>
      <pubDate>Fri, 13 Aug 2021 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/shortcut-real_name_system</guid>
      <media:thumbnail url="https://emtech.cc/static/shortcut-real_name_system/thumbnail.webp" />
      <category>生活駭客</category>
     <content:encoded><![CDATA[<img src="/static/shortcut-real_name_system/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>【Windows】賭你不知道的必記快捷鍵</title>
      <link>https://emtech.cc/p/windows-hotkey</link>
      <description>想要加快工作效率，減少滑鼠的使用是個最直接的方法。這裡我提供了一些我常用但是很少人知道的快捷鍵供大家參考。</description>
      <pubDate>Thu, 12 Aug 2021 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/windows-hotkey</guid>
      <media:thumbnail url="https://emtech.cc/static/windows-hotkey/thumbnail.webp" />
      <category>生活駭客</category>
     <content:encoded><![CDATA[<img src="/static/windows-hotkey/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>【捷徑】快速進入當節課堂的 Meet（備份）</title>
      <link>https://emtech.cc/p/shortcut-joinMeetDirectly</link>
      <description>透過這個捷徑快速進入當節課堂的 Meet，再也不用怕忘記課表</description>
      <pubDate>Fri, 04 Jun 2021 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/shortcut-joinMeetDirectly</guid>
      <media:thumbnail url="https://emtech.cc/static/shortcut-joinMeetDirectly/thumbnail.webp" />
      <category>生活駭客</category>
     <content:encoded><![CDATA[<img src="/static/shortcut-joinMeetDirectly/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>【捷徑】怎麼加入不受信任的捷徑？</title>
      <link>https://emtech.cc/p/shortcut-untrusted_Shortcut</link>
      <description>如果碰見這問題，可以透過這個簡單的方法來解決。</description>
      <pubDate>Fri, 04 Jun 2021 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/shortcut-untrusted_Shortcut</guid>
      <media:thumbnail url="https://emtech.cc/static/shortcut-untrusted_Shortcut/thumbnail.webp" />
      <category>生活駭客</category>
     <content:encoded><![CDATA[<img src="/static/shortcut-untrusted_Shortcut/thumbnail.webp" />]]></content:encoded>
    </item>
<item>
      <title>【捷徑】衛道網頁書籤</title>
      <link>https://emtech.cc/p/shortcut-viatorBookmark</link>
      <description>只須點一下即可快速連結到衛道的網頁或檔案</description>
      <pubDate>Fri, 04 Jun 2021 00:00:00 GMT</pubDate>
      <guid>https://emtech.cc/p/shortcut-viatorBookmark</guid>
      <media:thumbnail url="https://emtech.cc/static/shortcut-viatorBookmark/thumbnail.webp" />
      <category>生活駭客</category>
     <content:encoded><![CDATA[<img src="/static/shortcut-viatorBookmark/thumbnail.webp" />]]></content:encoded>
    </item></channel></rss>