顯示具有 CSS 標籤的文章。 顯示所有文章
顯示具有 CSS 標籤的文章。 顯示所有文章

2023年11月9日 星期四

CSS 學習筆記 : 圖片的自適應寬度設定

最近努力上 Hahow 學校企業版學習, 這周聚焦在響應式網頁設計, 例如 Bootstrap 與 CSS, 雖然 Bootstrap 很好用, 但要會用得巧還是得要有堅強的 CSS 底子才行. 

圖片如果不設定 width 屬性, 則當瀏覽器寬度縮小時會出現 X 軸拉桿, 這在小型裝置上會造成使用經驗不佳問題. 今天學到這可以將 width 與 max-width 屬性設為百分比值來解決, 但兩者有如下差異 :
  • width : 
    設為 100% 時圖片會一直佔滿父元素 (例如 body) 空間, 瀏覽器放大時也跟著滿版放大, 超過圖片寬度解析度時會糊掉. 
  • max-width :
    設為 100% 時圖片不會一直佔滿父元素 (例如 body) 空間, 瀏覽器放大到 超過圖片寬度時不會持續放大, 當超過圖片寬度時會固定在其原本寬度, 因此不會有糊掉現象. 
因此除非有特別用途, 建議使用 max-width. 測試如下, 圖片來自 Pixabay (解析度 640x427) : 


<!doctype html>
<html>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width,initial-scale=1">
  <title>圖片</title>
  <style>
    .pic {
      width: 100%;
      }
  </style>
</head>
<body>
  <img class="pic" src="images/landscape.jpg">
</body>
</html>

此例使用 width: 100% 屬性設定圖片寬度, 當瀏覽器縮小時圖片也會隨之縮小, 橫軸不會出現滑桿, 但它會一直滿版佔據整個視窗寬度, 當瀏覽器放大到超過圖片寬度 (640px) 時就會開始出現糊掉現象 :




在我的 Note8 手機上瀏覽不管直式或橫式都是滿版 : 




測試網址 :



其次是使用 max-width: 100% 的效果 : 

<!doctype html>
<html>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width,initial-scale=1">
  <title>圖片</title>
  <style>
    .pic {
      max-width: 100%;
      }
  </style>
</head>
<body>
  <img class="pic" src="images/landscape.jpg">
</body>
</html>



當瀏覽器縮小時圖片一樣是跟著縮小不會出現滑桿, 當瀏覽器放大超過圖片寬度 640px 時圖片就固定在那寬度不會再放大, 因此不會有糊掉現象 : 


2021年2月27日 星期六

碁峰的兩本前端網頁設計好書

最近從母校圖書館借到兩本碁峰出版的網頁設計好書 :

1.  學好跨平台網頁設計第二版 (碁峰, 文淵閣工作室, 2019)


Source : 博客來


此書完整介紹前端網頁設計相關技術 : HTML5, CSS, Javascript, jQuery, jQuery Moble, 以及 Bootstrap, 只要熟習這五大項目即可掌握前端網頁技術的精要了. 鄧文淵工作室的系列作品特色就是條理清楚, 範例簡單易懂, 還附有 100 分鐘的影音教學+範例程式, 可在碁峰網站下載 :





Source : 博客來


此書的主角是 Bootstrap 框架, 全書 18 章裡前 12 章都是 Bootstrap 主題, 13~15 章為 Javascript 精要, 16 章為 jQuery 重要函式, 17 章為 jQuery Mobile 重點介紹, 18 章為 Cordova 平台介紹, 附錄則有 MTA Javascript 國際認證模擬試題. 可見與上面那本不同的是, Javascript, jQuery, 與 jQuery Mobile 在此書中為重點濃縮, 重點完全是在 Bootstrap 功能敘述, 特色是最後一章談如何用 Cordova 平台將 jQuery Mobile 行動網頁轉成 App. 書中範例可在碁峰網站下載 :


2021年2月24日 星期三

CSS 串接樣式表語法小抄

CSS (Cascading Style Sheet) 是 W3C 發布並維護的建議書, 其版本前後有 CSS1, CSS2, CSS3 三種, 不僅是前端網頁排版與呈現的主角, 也是撰寫網頁爬蟲時定位目標資料的重要工具, 故將其選擇器語法整理如下表, 詳細測試範例參考 :


1. CSS Level 1 選擇器 (1996 年發布) : 


 CSS1 選擇器 範例 說明
 #id #ok 選取 id 屬性值為 ok 之全部元素
 .class .food 選取 class 屬性值為 food 之全部元素 
 tag p 選取所有指定標籤之元素
 tag1, tag2 div, p 選取全部 div 與 p 元素 
 tag1 tag2 div p 選取全部是 div 後代之 p 元素
 a:link a:link 選取全部尚未拜訪過的超連結
 a:visited a:visited 選取全部已經拜訪過的超連結
 a:active a:active 選取全部可點選的超連結
 a:hover a:hover 選取全部滑鼠游標正在上面的超連結
 :first-letter p:first-letter 選取 p 元素內容的第一個字母
 :first-line p:first-line 選取 p 元素內容的第一行


2. CSS Level 2 選擇器 (1998 年發布) : 

CSS2 是 CSS1 的超集 (superset, 即 CSS2 包含了 CSS1 語法), 新功能主要提供了元素的絕對, 相對, 固定定址語法以及 z-index. 


 CSS2 選擇器 範例 說明
 * * 選取全部元素 (全域選擇器)
 tag1 > tag2 div > p 選取 div 元素之子孫元素中的全部 p 元素
 tag1 + tag2 div + p 選取 div 元素後面之兄弟元素中的全部 p 元素
 [attribute] [name] 選取全部具有 name 屬性之元素
 [attribute=value] [name=food] 選取全部 name 屬性值為 food 之元素
 [attribute~=value] [name~=food] 選取全部 name 屬性值包含 food 之元素
 [attribute|=value] [name|=food] 選取全部 name 屬性值以 food 開頭之元素
 :first-child p:first-child 選取是第一個子元素的全部 p 元素
 :focus input:focus 選取取得焦點的 input 元素
 :before p:before 在 p 元素之前插入偽元素
 :after p:after 在 p 元素之後插入偽元素
 :lang(value) p:lang(zh) 選取 lang 屬性值是 zh (繁中) 之全部 p 元素


3. CSS Level 3 選擇器 (1999 年發布) : 


 CSS3 選擇器 範例 說明
 tag1 ~ tag2 div ~ p 選取前 (兄弟) 元素是 div 的全部 p 元素
 [attribute^=value] a[href^="http"] 選取 href 屬性值以 http 開頭的全部 a 元素
 [attribute$=value] a[href$="php"] 選取 href 屬性值以 php 結尾的全部 a 元素
 [attribute*=value] a[href*="msn"] 選取 href 屬性值包含 msn 的全部 a 元素
 :last-child p:last-child 選取是最後一個子元素的全部 p 元素
 :nth-child(n) p:nth-child(3) 選取是第 3 個子元素的全部 p 元素
 :nth-last-child(n) p:nth-last-child(3) 選取是倒數第 3 個子元素的全部 p 元素
 :only-child p:only-child 選取是唯一子元素的全部 p 元素
 :first-of-type p:first-of-type 選取是第 1 個子元素的全部 p 元素
 :last-of-type p:last-of-type 選取是最後一個子元素的全部 p 元素
 :nth-of-type(n) p:nth-of-type(3) 選取是第 3 個子元素的全部 p 元素
 :nth-last-of-type(n) p:nth-last-of-type(3) 選取是倒數第 3 個子元素的全部 p 元素
 :enabled button:enabled 選取所有可使用之 button 元素
 :disabled button:disabled 選取所有不可使用之 button 元素
 :checked input:checked 選取所有被勾選之 input 元素
 :not(selector) :not(div) 選取所有不是 div 的元素
 :root :root 選取 HTML 網頁之根元素
 :empty p:empty 選取沒有子元素之全部 p 元素
 

參考 :


2019年11月10日 星期日

網頁設計速學筆記索引

暑假時為了教二哥網頁設計寫了下列筆記, 照二哥申請入學時所寫的學習計畫是排在大一上學期, 但開學後發覺課業太多, 可能要推遲到明年暑假了. 除了當教案, 我自己寫程式也常要參考, 畢竟東西太多不可能全記得, 寫下筆記還是最可靠.

Git 學習筆記 (六) : 利用 GitHub 架設靜態網站    
申請免費 PHP 虛擬主機 000a.biz 與 000webhost.com

2022-01-22 補充 :

如果只是架設靜態網站, 不需要用到後端程式的話, 我非常推薦使用 GitHub, 因為它非常穩定, 不需要安裝 Git, 只要打好 HTML 檔上傳即可. 若使用一般 PHP 免費空間經常遇到隨意刪帳號或暫停服務問題. 

2022-08-17 補充 : 

Javascript 筆記我另外在學 p5.js 時整理過 :


另外常用的 jQuery 技法則整理於下面這兩篇 :


2019年8月25日 星期日

網頁技術速學筆記 (二) : CSS 基礎

HTML5 將網頁技術做了清楚的分工, 即 HTML 專注於內容; Javascript 負責行為或動作; 而網頁外觀樣式則交由 CSS 控制呈現方式, 三者透過 link 元素(或 style 屬性) 以及 script 元素耦合, 如下圖所示 :




因為 HTML5 取消了大部分 HTML4 裡面原本負責樣式的標籤, 將外觀呈現全部交給效果更豐富的 CSS 來完成, 因此要讓網頁看起來美觀, 具有視覺傳達效益, 必須對 CSS 有基礎運用能力.

本系列之前的筆記參考 :

申請免費 PHP 虛擬主機 000a.biz 與 000webhost.com
網頁技術速學筆記 (一) : HTML 基礎


一. 加入 CSS 樣式表的四個方法 : 

在網頁中套用樣式的四種方法如下表 :


 加入 CSS 的四種方法 說明
 1. 在網頁元素的 style 屬性內 (inline 行內) <p style="color:blue; font-wight:bold;"></p>
 2. 在網頁標頭的 <style></style> 內嵌入 <style>
    p {color:blue; font-wight:bold;}
 </style>
 3. 在網頁標頭內以 <link> 連結外部 CSS 檔 <link ref="stylesheet" href="hello.css">
 4. 在網頁標頭的 <style></style> 內
     以 @import url() 匯入外部 CSS 檔
 <style>
    @import url("hello.css")
 </style>


前兩種用法為套用內部樣式, 後兩種為套用外部樣式. 其中第一種行內 (inline) 樣式最優先, 因為它是最後才套用, 其他三種方法則依其載入順序而定, 最後載入的會蓋掉先載入的樣式. 注意, link 元素為空元素 (沒有結束標籤), 只能放在 head 標頭內, 但可以出現一次以上, 它還有一個屬性 type="text/css", 但可以省略.


範例 1 :  行內 (inline) 樣式   

<!DOCTYPE html>
<html>
<head>
  <title>CSS 測試</title>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width,initial-scale=1">
</head>
<body>
  <p style="color:blue; font-wight:bold;">Hello World</p>
  <p style="font-size:x-large;font-style:italic;">Hello World</p>
  <p style="font-family:微軟正黑體;">Hello World</p>
</body>
</html>


同樣效果改用標頭內的 style 嵌入如下 (使用樣式類別) :


範例 2 :  網頁標頭內用 style 元素嵌入樣式

<!DOCTYPE html>
<html>
<head>
  <title>CSS 測試</title>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width,initial-scale=1">
  <style>
   .p1 {color:blue; font-wight:bold;}
   .p2 {font-size:x-large;font-style:italic;}
   .p3 {font-family:微軟正黑體;}
  </style>
</head>
<body>
  <p class="p1">Hello World</p>
  <p class="p2">Hello World</p>
  <p class="p3">Hello World</p>
</body>
</html>


範例 3 :  在網頁標頭內用 link 元素連結外部樣式檔

先編輯一個純文字檔 p.css 以 utf-8 編碼存放在 css 子目錄下 :

.p1 {color:blue; font-wight:bold;}
.p2 {font-size:x-large;font-style:italic;}
.p3 {font-family:微軟正黑體;}

然後在 head 裡面用 link 連結此樣式檔 :

<!DOCTYPE html>
<html>
<head>
  <title>CSS 測試</title>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width,initial-scale=1">
  <link rel="stylesheet" href="css/p.css">
</head>
<body>
  <p class="p1">Hello World</p>
  <p class="p2">Hello World</p>
  <p class="p3">Hello World</p>
</body>
</html>


範例 4 :  在網頁標頭的 style 內用 @import 匯入外部樣式檔

<!DOCTYPE html>
<html>
<head>
  <title>CSS 測試</title>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width,initial-scale=1">
  <style>
    @import url("css/p.css")   
  </style>
</head>
<body>
  <p class="p1">Hello World</p>
  <p class="p2">Hello World</p>
  <p class="p3">Hello World</p>
</body>
</html>


二. CSS 的語法 : 

CSS 串接樣式表主要是透過選擇器挑選網頁中的元素, 套用指定之樣式.


1. 樣式結構 :

寫在 style 元素內以及外部 .css 樣式檔中的 CSS 樣式結構如下 :

選擇器 {
               屬性1: 值1;      /* 這是註解  */
               屬性2: 值2; 
               屬性3: 值3; 
               ....
              }   

選擇器用來指定樣式要套用的對象, 後面用大括弧 {} 包起來的是樣式內容, 每一個樣式以 "屬性:內容" 格式指定, 可同時指定多個樣式串接, 每一種樣式之間用分號隔開, 這也是 CSS 稱為串接式樣式表的原因.

注意, 屬性值若含有英數字, 小數點, 減號以外字元例如空白時必須加引號, 例如 :

p {font-family:"Times New Roman";}

放在 /* 與 */ 之間的文字會被當做註解不予解析, 但註解文字中不要含有 CSS 的屬性識別字, 例如 :

h1 {
      color:blue;           /* 大標題用藍色凸顯 */
      font-style: italic;
     }

如果是行內 (inline) 樣式, 則只要在 HTML 元素的 style 屬性中直接填入樣式內容即可 (不含大括號 {} 與註解), 例如 :

<h1 style="color:blue; font-style: italic;">Hello World</h1>

樣式內容 (包括屬性與值) 雖然都不分大小寫, 例如 Color: BLUE; 與 color: Blue; 均能被正確解析且呈現效果相同, 但習慣上樣式內容最好都用小寫. 但選擇器就不同了, 選擇器中與 Javascript 有關的 id 與 class 有分大小寫.


2. 常用樣式屬性 :

CSS 最常用的樣式屬性如下表 :


 文字樣式屬性 說明
 font-family  字型 : 標楷體, 微軟正黑體, "New Time Roman" (逗號隔開依序套用)
 font-size  大小 : 可用 px, 百分比 %, 相對 (smaller/larger) 或絕對 (small/large) 
 font-style  風格 : normal (正常)/italic (斜體)/oblique (粗體) 
 font-weight  粗細 : 絕對 normal(=400)/bold(=700) 或相對 lighter/bolder
 font 設定字型/大小/顏色/風格/粗細等, 例如 font: 15px 標楷體 italic bold
 text-shadow  陰影格式: 顏色 右(正)左(負)長度 下(正)上(負)長度 範圍
 text-decoration 添加裝飾 : none/underline/overline/line-through (刪除線)
 text-transform 大小寫轉換 : none/lowercase/uppercase/capitalize
 vertical-align 垂直對齊 : baseline/super(上標)/sub(下標)/top/middle/bottom

 文字樣式屬性 說明
 font-family (字型) 標楷體, 微軟正黑體, "New Time Roman" (逗號隔開依序套用)
 font-size (大小) 可用 px, 百分比 %, 相對 (smaller/larger) 或絕對 (small/large) 大小
 font-style (風格) 有 normal (正常)/italic (斜體)/oblique (粗體) 三個值
 font-weight (粗細) 絕對 normal(=400)/bold(=700) 或相對 lighter/bolder
 font (綜合) 以空格隔開, 例如 font: 15px 標楷體 italic bold

 色彩樣式屬性 說明
 color 設定元素前景色彩, 可用色彩名稱如 red 或色碼如 #ff00ee
 background-color 設定元素背景色彩, 可用色彩名稱如 red 或色碼如 #ff00ee
 border-color 設定元素邊框色彩, 可用色彩名稱如 red 或色碼如 #ff00ee
 opacity 設定元素透明度, 值範圍 0.0 (完全不透明) ~ 1.0 (完全透明, 預設)

 背景樣式屬性 說明
 background-color 設定元素背景色彩, 可用色彩名稱如 red 或色碼如 #ff00ee
 background-image 設定元素背景圖片, 可用 url() 設定, 例如 url("img/aaa.png")
 background-position 設定元素背景圖片位置, 可用 top/center/bottom/left/right
 background 設定元素背景顏色, 圖片, 位置等, 例如 background: red center

 尺寸樣式屬性 說明
 width 設定元素寬度, 可用 px, %, 或 auto (自動)
 height 設定元素高度, 可用 px, %, 或 auto (自動)
 min-width 設定元素最小寬度, 可用 px, %, 或 auto (自動)
 max-width 設定元素最大寬度, 可用 px, %, 或 auto (自動)
 min-height 設定元素最小高度, 可用 px, %, 或 auto (自動)
 max-height 設定元素最大高度, 可用 px, %, 或 auto (自動)

 邊界留白樣式屬性 說明
 margin 設定元素的上右下左邊界寬度, 可用px, %, 或 auto
 padding 設定元素內容的上右下左留白寬度, 可用px, %, 或 auto

 邊框樣式屬性 說明
 border-color 設定元素邊框色彩, 可用色彩名稱如 red 或色碼如 #ff00ee
 border-top 設定元素的上邊框, none/dotted/dashed/solid/double/groove/inset/outset
 border-right 設定元素的右邊框, none/dotted/dashed/solid/double/groove/inset/outset
 border-bottom 設定元素的下邊框, none/dotted/dashed/solid/double/groove/inset/outset
 border-left 設定元素的左邊框, none/dotted/dashed/solid/double/groove/inset/outset
 border-style  設定元素的四邊框, none/dotted/dashed/solid/double/groove/inset/outset
 border 設定元素的邊框框線, 顏色, 寬度樣式, 例如 border: dotted 5px blue


text-shadow 樣式至少需指定兩個數值, 第一個是向右的陰影距離 (負數表示向左), 第二個是向下的陰影距離 (負數表示向上), 第三個數值是陰影範圍 (可有可無). 顏色若不指定預設為黑色陰影.

注意, 樣式中用到外部資源, 例如 background-image 中用到外部圖片當背景, 都使用 url() 來指定資源所在之 URL, 可用本機相對位址例如 url("img/abc.jpg") 或網路位址例如 url("http://www.blabla.com/a.jpg").

更多樣式屬性參考 :

https://www.w3schools.com/css/


3. 選擇器種類 :

選擇器可分為如下 7 類 :


 樣式選擇器 說明
 1. 類型選擇器  套用對象為 HTML 元素 (標籤選擇器), 例如 p, div, table 等 
 2. 後代選擇器 套用到符合指定之父子元素 (空格隔開) 關係的子元素上, 例如 div a 
 3. ID 選擇器  套用到指定該 id 屬性值之元素, 選擇器為 id 屬性值前加點號, 例如 .myID
 4. Class 選擇器 套用到所有該樣式類別之元素, 選擇器為 class 屬性值前加 # 號, 例如 #myClass
 5. 屬性選擇器 套用到具有指定屬性特徵之元素, 例如 [attr], [attr=val], [attr~=val], [attr|=val]
 6. 全域選擇器 套用到全部元素, 選擇器為星號 *
 7. 偽類選擇器 套用到具有指定父子節點關係的多個元素的最後一個元素, 以空格隔開


注意, 選擇器中的 id 與 class 一定要大小寫都符合才會套用, 但選擇器若是 HTML 標籤或屬性時則可不分大小寫, 這是因為 HTML 不分大小寫之故, 屬性名稱與值都不分大小寫. 參考 :

小细节:css中的的大小写区分

多個套用相同樣式的選擇器可用逗號合併, 例如 :

p {color: red;}
div {color: red;}

這兩行樣式可用逗號合併為一行 :

div, p {color: red;}

這表示 p 元素與 div 元素均套用相同樣式.

要注意後代選擇器 (descendant selector) 與合併選擇器的差別, 後代選擇器是以空格隔開父子元素, 而合併選擇器是用逗號隔開多個要共用同一樣式的選擇器.

類型選擇器 (type selector) 就是以 HTML 標籤當作選擇之對象, 因此網頁中所有這種標籤都會被套用此樣式, 例如 :


範例 5 :  類型選擇器測試

<!DOCTYPE html>
<html>
<head>
  <title>CSS 測試</title>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width,initial-scale=1">
  <style>
   p {color:red; font-wight:bold;}
   DIV {COLOR:green; FONT-wight:bold;}
   span {text-shadow:navy 3px 3px 3px;}
  </style>
</head>
<body>
  <p>Hello World</p>
  <div>Hello World</div>
  <span>Hello World</span>
</body>
</html>



此例中的樣式表定義了 p, div, 與 span 這三種元素的樣式, 可見它們各自套用到指定的元素類型上, 而且樣式內容不論屬性或值都不分大小寫.

下面的範例測試後代選擇器, 這是選擇 HTML DOM 樹階層結構中具有指定之父子關係的子元素, 注意, 它是套用到最後那一個子元素 :


範例 6 :  後代選擇器測試

<!DOCTYPE html>
<html>
<head>
  <title>CSS 測試</title>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width,initial-scale=1">
  <style>
   div p span{color:green; font-wight:bold;}
   div p {color:blue; font-style:italic;}
   p {color:red;}
  </style>
</head>
<body>
  <p>Hello World</p>
  <div><p>Hello World</p></div>
  <div><p><span>Hello World</span></p></div>
</body>
</html>



此例定義了三個樣式, 選擇器 div p span 只會套用在 span 元素的內容 Hello World 3; 而 div p 則會套用到 div 的子元素 p 的內容, 因此 Hello World 2 與 Hello World 3 都會套用, 兩個都是斜體字, 顏色部分會先套用 div p 的藍色, 然後馬上又被較嚴格的 div p spam 的綠色覆蓋掉. 總之, 後代較多的會最後套用.

ID 與 Class 選擇器是最常用的選擇器, 尤其是 Class 選擇器, 因為它會套用到有相同 class 屬性值的所有元素; 而 ID 則只能套用到唯一的元素, 因為網頁中的 ID 屬性值必須唯一.


範例 7 :  ID 選擇器測試

<!DOCTYPE html>
<html>
<head>
  <title>CSS 測試</title>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width,initial-scale=1">
  <style>
   #p1 {color:green; font-weight:bold;}
   #p2 {color:blue; font-style:italic;}
   #p3 {color:red; font-size:24px;}
  </style>
</head>
<body>
  <p id="p1">Hello World 1</p>
  <p id="p2">Hello World 2</p>
  <p id="p3">Hello World 3</p>
  <p id="P3">Hello World 3</p>
</body>
</html>



此例樣式表定義了 #p1, #p2, #p3 三個 ID 樣式 (注意, ID 樣式的選擇器是在 id 屬性值前面加上 #), 它們會分別套用到網頁元素中 id 屬性值分別是 p1, p2,p3 的元素. 可見第四個 p 元素因為 id 屬性為大寫的 "P3", 因此不會套用 #p3 的樣式.

類別選擇器是在元素的 class 屬性值前面加個點號, 它會套用到全部具有該樣式類別之元素上, 其使用頻率最廣, 許多前端框架大量使用類別來控制網頁之呈現方式.


範例 8 :  Class 選擇器測試

<!DOCTYPE html>
<html>
<head>
  <title>CSS 測試</title>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width,initial-scale=1">
  <style>
   .header {background:violet;}
   .odd {background:lightgray;}
   .even {background:orange;}
  </style>
</head>
<body>
  <table>
    <tr class="header">
      <th>代號</th>
      <th>公司</th>
      <th>股價</th>
      <th>現金股利</th>
    </tr>
    <tr class="even">
      <td>2330</td>
      <td>台積電</td>
      <td>254</td>
      <td>2.5</td>
    </tr>
    <tr class="odd">
      <td>2412</td>
      <td>中華電</td>
      <td>107.5</td>
      <td>4.48</td>
    </tr>
    <tr class="even">
      <td>2308</td>
      <td>台達電</td>
      <td>148.5</td>
      <td>5</td>
    </tr>
    <tr class="odd">
      <td>1301</td>
      <td>台塑</td>
      <td>93.4</td>
      <td>5.08</td>
    </tr>
  </table>
</body>
</html>




此例定義了三個樣式 header, odd, 與 even, 分別給表格的標題, 奇數列, 偶數列套上底色樣式. 關於顏色名稱參考 :

參考 :

https://www.w3schools.com/html/html_colors.asp
https://www.w3schools.com/colors/colors_names.asp
# 常用 CSS 屬性列表


屬性選擇器挑選含有指定屬性之元素作為套用樣式之對象, 選擇器形式為將屬性名稱與屬性值篩選條件放入中括號內, 常用的屬性值篩選條件如下 :


 屬性選擇器 說明
 [attr] 套用到具有 attr 屬性之元素
 [attr="val"] 套用到具有 attr 屬性且其值為 val 之元素
 [attr~="val"] 套用到具有 attr 屬性且其值含有 val 之元素
 [attr|="val"] 套用到具有 attr 屬性且其值含有 val- 之元素
 [attr^="val"] 套用到具有 attr 屬性且其值以 val 開頭之元素
 [attr$="val"] 套用到具有 attr 屬性且其值以 val 結尾之元素


其中 [attr|="val"] 常用在全域屬性 lang, 例如中文有 zh-Hans (簡體中文), zh-Hant (繁體中文), 篩選條件 [lang|="zh"] 就會套用到所有具有 lang 屬性且值為中文語言的元素上. [attr^="val"] 則可用來篩選網址中的 URL 協定 (以 http 開頭) 等, 例如 [href^="http://"]; 而 [attr$="val"] 則常用在篩選副檔名, 例如 [href$=".jpg"].


範例 9 :  屬性選擇器測試

<!DOCTYPE html>
<html>
<head>
  <title>CSS 測試</title>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width,initial-scale=1">
  <style>
   [class] {color:blue;}
   [class="p2"] {font-weight:bold;}
   [lang|="zh"] {font-style:italic;}
   [href^="html"] {background:yellow;}
   [src$=".jpg"] {border: inset 5px violet}
  </style>
</head>
<body>
  <p class="p1">Hello World 1</p>
  <p class="p2">Hello World 2</p>
  <p lang="zh-Hant">Hello World 3</p>
  <p><a href="html_test_hello_world.htm" target="_blank">開啟 Hello World</a><p>
  <img src="img/20190510-cat.jpg"  width="400" height="225"  alt="Missing">
</body>
</html>




 此例定義了五個屬性選擇器, 第一個 [class] 會套用於所有包含 class 屬性之元素, 因此前兩個 p 元素文字顏色都是藍色. 第二個 [class="p2"] 只套用於 class 屬性值為 p2 者, 因此只有第二個 p 元素變粗體. 第三個 [lang|="zh"] 只套用於 class 屬性值為 "zh-" 開頭者, 因此只有第三個 p 元素變斜體. 第四個 [href^="html"] 只套用於 href 屬性值以 "html" 開頭者, 因此只有超連結 a 元素背景色變黃色. 第五個 [src$=".jpg"] 只套用於 src 屬性值以 ".jpg" 結尾者, 因此只有圖片 img 元素套用邊框樣式.

最後來測試偽類選擇器, 偽類選擇器 (pseudo-class selector) 用來選擇具有特定狀態或資訊之元素, 而這無法透過 DOM 樹來選擇, 例如滑鼠滑過 (hover) 之元素等, 最常用在控制超連結或表單元件因狀態而變之外觀, 常用的偽類選擇器如下表 :


 偽類選擇器 說明
 :link 套用尚未瀏覽過之超連結
 :visited 套用已瀏覽過之超連結
 :hover 套用游標在其上方之元素
 :focus 套用取得焦點之元素
 :active 套用所點選之元素
 :enabled 套用表單中可用之元件
 :disabled 套用表單中不可用之元件
 :checked 套用表單中被選取之 radio 或 checkbox 元件
 :not() 套用非指定之選擇器的元素
 :valid() 套用表單中已驗證成功之欄位
 :required 套用表單中之必填欄位


偽類選擇器前面可加上元素名稱限定, 例如 a:link 或 input:checked 等.

更多偽類選擇器參考 :

https://developer.mozilla.org/zh-TW/docs/Web/CSS/Pseudo-classes
Day24:小事之 CSS 偽類 與 偽元素
CSS 虛擬 (偽) 類別選擇器 (Selector) 教學範例


範例 10 :  偽類選擇器測試

<!DOCTYPE html>
<html>
<head>
  <title>CSS 測試</title>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width,initial-scale=1">
  <style>
    a:link {color:blue;}
    a:visited {color:violet;}
    a:hover {background-color:yellow;}
    div.hello:hover {background:violet;}
    :checked {height:20px; width:20px;}
    :disabled {background-color:lightgray;}
    :focus {background-color:yellow;}
    :required {border:dotted 2px blue;}
  </style>
</head>
<body>
  <p><a href="http://www.google.com">Google</a><p>
  <p><a href="http://tw.yahoo.com">Yahoo</a><p>
  <div class="hello">Hello World</div><br>
  <form>
    <input type="text" required>
    <input type="text" disabled><br><br>
    <input name="language" type="checkbox" value="Python"> Python
    <input name="language" type="checkbox" value="R"> R
    <input name="language" type="checkbox" value="C#"> C#
  </form>
</body>
</html>




此例樣式表中的 :link 與 :visited 均只套用到超連結, 因此前面不加 a 亦可, 而 hover 則可套用到所有元素 (此例為 div). 第一個 text 輸入欄位因為是必填欄位 (required), 因此會套用虛線邊框樣式. 最後面的 checkbox 元件被核取時會套用 :checked 樣式, 即尺寸會變大.

OK, 大功告成, 以上便是網頁專案中最常用的樣式用法.

參考 :

https://www.w3schools.com/css/
網頁樣式表-CSS的提示與竅門

2015年4月18日 星期六

好書 : 互動式網站前台開發武功秘笈 :使用HTML5、CSS3和jQuery

這本書借自左新, 分為基礎, 應用, 與比較三篇. 基礎介紹互動網站前台三大技術 : HTML5, CSS3, 與最夯的 jQuery.


第六章介紹了 CreateJS Suite 套件, 這是以 Javascript 為基礎的網頁動畫函式庫, 用來簡化 HTML5 中撰寫動畫的 Javascript 語法. Adobe 也提供了 Toolkit for CreateJS 擴充套件可將 Flash 動畫轉換成 HTML5/CreateJS 語法. 參考 :

# http://www.createjs.com
http://www.adobe.com/go/downloadcreatejs
# Getting started with the Flash Professional Toolkit for CreateJS

其實這本書程式方面較弱, 應用篇主要在講如何用 jQuery 設計導覽選單與淡入淡出效果, 也就是 click(), hover(), 以及 fadein(), fadeout(), animate() 函式的用法罷了. 而比較篇則是介紹輪播效果以及介紹循序動畫的五種製作方法. (jQuery, CSS3, HTML5, Edge Animate, Adobe toolkit for CreateJS). 此書較適合網頁設計師.

比較有趣的是書末介紹了 Adobe Creative Cloud, 只要申請 Adobe ID 登入, 就可以付費取得 Adobe 軟體如 Photoshop CC, 透過雲端儲存空間與檔案同步能力, 與團隊成員或客戶分享創作概念與成果, 即使式行動裝置也可以. 透過 Behance 整合可以在專屬網站 URL 上發布作品集, 加入全世界最大創意社群. 不過費用不便宜 :

"取得我們的所有創意應用程式和連線行動應用程式,每月只需支付新台幣 960 元起", 學生四折, 每月 320 元.

# https://creative.adobe.com

摘要 :

  1. 將圖片變成半透明 :
    $("img").css("opacity",0.5);
  2. 選擇器 :
    $("選擇器 類別")
    $("選擇器 : 偽類別")
  3. jQuery 除錯 :
    console.log("OK");
    console.warn("NG"); //顯示警告訊息
    console.error("error"); //顯示錯誤訊息
    console.info("OK"); //顯示一般訊息
    console.clear(); //清除 console 視窗中所有訊息
    console.assert((x==1), "x != 1"); //當條件為 false 時輸出訊息







2015年1月20日 星期二

CSS3 的魔力 : 如何製作交談氣泡 (Speech bubble)

這幾天 EasyuiCMS 的開發進度慢了下來, 因為動手寫留言板功能時, 對於排版與呈現方式感到苦惱, 這就是完美主義者自戀自愛的代價.

上周末看到 EasyUI 的 tooltip 元件範例, 突然發現用 tooltip 來呈現留言很不錯, 但試了兩天還是放棄了, 原因是 tooltip 預設為隱藏, 等游標移到上面時才會現身, 而留言板是進入頁面就應該顯示最近幾筆留言, 若還要使用者移到人名或日期上才顯示內容, 還要多一步操作, 這樣就有點怪了.

在看過幾本 PHP 書籍的範例仍無頭緒後, 開始上網以留言板為 keyword 去搜尋, 啊哈, 經由 "那些 CSS 偽元素可以幫你做的 10 個效果" 找到下面兩個超棒網站 :

Pure CSS speech bubbles
How to Create CSS3 Speech Bubbles Without Images

實際測試後發現前者比較適合, 這位作者對 CSS3 的掌握真的是太神了, 主要是以 CSS3 的偽元素 before 與 after 來製作兩個一大一小 size 為 0 的三角形, 利用其上下左右方向的 border 寬度與 background-color 顏色不同, 使兩個三角形重疊出一個三角框, 然後將三角框的一邊與圓角方框的一邊重疊, 這樣就能做出交談氣泡的指引箭頭了. 我是透過詳讀第二個網站的詳細說明才真正了解其原理的.

OK, 現在就來測試一下. 我的留言板規劃是左邊隨機顯示一個圖檔與留言者, 其下顯示留言日期, 右方則顯示其留言內容, 因此我需要的是一個箭頭在左邊的交談氣泡, 也就是 "Pure CSS speech bubbles" 中 "Sample Examples" 倒數第二個圖. 觀其網頁原始碼, 可以發現其樣式設定在 default.css 這個檔 :

http://nicolasgallagher.com/pure-css-speech-bubbles/demo/default.css

我需要的是 triangle border 與其 left 部分, 也就是將 "BUBBLE WITH A BORDER AND TRIANGLE" 這區塊中的 top 與 right 部分去除即可.

  .triangle-border {
    position:relative;
    padding:15px;
    margin:1em 0 3em;
    border:1px solid #95B8E7;
    color:#333;
    background:#fff;
    /* css3 */
    -webkit-border-radius:10px;
    -moz-border-radius:10px;
    border-radius:10px;
    }
  .triangle-border:before {
    content:'';
    position:absolute;
    bottom:-20px;
    left:40px;
    border-width:20px 20px 0;
    border-style:solid;
    border-color:#5a8f00 transparent;
    /* reduce the damage in FF3.0 */
    display:block;
    width:0;
    }
  .triangle-border:after {
    content:"";
    position:absolute;
    bottom:-13px;
    left:47px;
    border-width:13px 13px 0;
    border-style:solid;
    border-color:#fff transparent;
    /* reduce the damage in FF3.0 */
    display:block;
    width:0;
    }
  .triangle-border.left {margin-left:30px;}
  /* creates the larger triangle */
  .triangle-border.left:before {
    top:10px;
    bottom:auto;
    left:-20px;
    border-width:10px 20px 10px 0;
    border-color:transparent #95B8E7;
    }
  /* creates the smaller  triangle */
  .triangle-border.left:after {
    top:11px;
    bottom:auto;
    left:-19px;
    border-width:9px 19px 9px 0;
    border-color:transparent #fff;
    }

這裡我修改了原作者關於邊框顏色與粗細的設定, 因為我的邊框只要 1px 即可, 原作是設為 5px, 太粗了. 需要修改的數據如上藍色部分, 目的是擠出一個邊框 1px 的三角形, 其計算原理如下 :


這裡我們的交談氣泡指標是以交談框的左上角為原點, 外三角往左 20px, 往下 10px 開始描繪, 故 triangle-border.left:before 裡, top 設為 10, left 設為 -20 (負為往左), 其邊框寬度要設為 10 (上), 20 (右), 10(下), 左邊要壓扁, 故為 0. 而內三角的底與外三角的底 (右方) 重疊, 高少 1px, 因此 triangle-border.left:after 的 top 設為 11, left 設為 -19, 其邊框寬度設為 9 (上), 19 (右), 9(下), 同樣左邊要壓扁, 故為 0. 重點是內三角邊框顏色設為白色, 剛好把外三角的顏色蓋掉, 只剩上下兩個 1px 的線.

網頁部分如下, 只要設定 P, SPAN, 或 DIV 元素的樣式類別為 "triangle-border left" 即可 :

  <div>
    <img src="male.png" style="border-width:0px;">
    <span class="triangle-border left">
      Hello Emma!
      How is everything going?
    </span>
  </div>
  <div>
    <img src="female.png" style="border-width:0px;">
    <span class="triangle-border left">
      Hi, Sam!
      Ya, just fine. And You?
    </span>
  </div>

測試範例 1 : http://mybidrobot.allalla.com/css3test/speech-bubble-1.htm [看原始碼]

下面是用 Chrome 瀏覽的結果, 看來很不錯 (版本 39.0.2171.95 m) :


下面是用 IE 瀏覽結果, 不佳 (版本 11.0.9600) :


下面是用 Firefox, 同樣不佳 (版本 35.0) :


最後是 Opera, 雖然渲染效果與 Chrome 稍有不同, 但也 OK (版本 26.0.1656.60) :


從這一點可看出, Chrome 與 Opera 還是瀏覽器界數一數二的優等生, 對於 CSS3 與 HTML5 的支援度是最棒的. Firefox 與 IE 則要加油了.

下午又找到一個更棒的 CSS 箭頭產生器, 直接選取所需要的屬性, 就會自動產生 CSS 檔 :

# CSS Arrow Please: CSS 箭頭產生器
# http://cssarrowplease.com/

我選了左方箭頭, 寬度 1px 的, 然後稍加調整屬性如下 :

    .arrow_box {
      padding: 15px;
      height: auto;
      border-radius: 10px;
      position: relative;
      background: #ffffff;
      border: 1px solid #95B8E7;
      }
    .arrow_box:after, .arrow_box:before {
      right: 100%;
      top: 50%;
      border: solid transparent;
      content: " ";
      height: 0;
      width: 0;
      position: absolute;
      pointer-events: none;
      }
    .arrow_box:after {
      border-right-color: #ffffff;
      border-width: 13px;
      margin-top: -10px;
      }
    .arrow_box:before {
      border-right-color: #95B8E7;
      border-width: 14px;
      margin-top: -11px;
      }

原理其實跟上面範例 1 是一樣的, 只是所用的樣式屬性稍有不同而已. 我改動了一些屬性值來達成與範例 1 同樣的結果. 只要把上面範例 1 的 class 改為 arrow_box 即可 :

  <div>
    <img src="male.png" style="border-width:0px;">
    <span class="arrow_box">
      Hello Emma!
      How is everything going?
    </span>
  </div>
  <div>
    <img src="female.png" style="border-width:0px;">
    <span class="arrow_box">
      Hi, Sam!
      Ya, just fine. And You?
    </span>
  </div>

如下範例 2 所示 :

測試範例 2 : http://mybidrobot.allalla.com/css3test/speech-bubble-2.htm [看原始碼]

這個做法比範例 1 要好, 在 Chrome, Firefox, 與 Opera 均正常, 僅 IE 無法覆蓋與三角形重疊的邊框. IE 到底是哪根筋不對啊? 是因為老大當太久了嗎?

上面兩個範例都有一個問題, 就是留言內容不可太長, 否則留言內容框會斷成兩節 :


這是因為我們使用 span 元素之故, 若使用 div 元素就不會這樣, 但如此一來留言框就會佔據整列了. 所以現在考慮改用向上箭頭 :

    .arrow_box {
      margin-top:30px;
      padding: 15px;
      height: auto;
      border-radius: 10px;
      position: relative;
      background: #ffffff;
      border: 1px solid #95B8E7;
      }
    .arrow_box:after, .arrow_box:before {
      bottom: 100%;
      left: 60px;
      border: solid transparent;
      content: " ";
      height: 0;
      width: 0;
      position: absolute;
      pointer-events: none;
      }
    .arrow_box:after {
      border-bottom-color: #ffffff;
      border-width: 15px;
      margin-left: -12px;
      }
    .arrow_box:before {
      border-bottom-color: #95B8E7;
      border-width: 16px;
      margin-left: -13px;
      }

網頁部分做了些修改, 加上姓名與時間 :

  <div>
    <img src="male.png" style="border-width:0px;"> Sam 於 2015-01-13 23:11:06
    <div class="arrow_box">
      Hello Emma!
      How is everything going?
    </div>
  </div>
  <div>
    <img src="female.png" style="border-width:0px;"> Emma 於 2015-01-13 23:12:50
    <div class="arrow_box">
      Hi, Sam!
      Ya, just fine. And You?
    </span>
  </div>

如下列範例 3 所示 :

測試範例 3 : http://mybidrobot.allalla.com/css3test/speech-bubble-3.htm [看原始碼]



2014年10月28日 星期二

Robin Nixon 的 PHP 新書

之前在市圖借到 Robin Nixon 膾炙人口的 PHP, MySQL, JavaScript 與 CSS 第二版 (中文), 翻閱後覺得不錯, 上網一找原來今年已出第三版, 但因應 HTML5 潮流, 書名改為 PHP, MySQL, JavaScript, CSS & HTML5, 仍由歐萊里出版.

第三版在原第十章後插入了新增的第 11 章 Using the mysqli Extension, 其餘章節往後推, 最後新增了 22~25 共四章的 HTML5 (含 Canvas). 這本書的好處就是把撰寫 PHP 網頁應用程式所需的前後端技術都寫在一本書裡. 可惜沒有包含 jQuery, 只在書中提到 Javascript Framwork 時有提到.

原書範例程式可在下列網站下載 :

http://lpmj.net/3rdedition/


2013年11月25日 星期一

HTML5 測試 : 檢測函式庫 Modenizr 的用法

在 HTML5 網頁程式開發時第一個要處理的便是檢測客戶端的瀏覽器是否支援 HTML5 與 CSS3, 但是 HTML5 許多新功能在各瀏覽器實作上還有些差異 (特別是 video 的 codec 特別麻煩), 這需要使用稱為 User Agent sniffing 的方法來一一偵測, 要記得這些還真是一種負擔 (又不是狗狗, sniffing 啥?). 不過, 現在有一個 Modernizr 函式庫可以解決這個困擾, 它可以測試超過 40 種 HTML5 功能, 讓我們可以用較簡單的方式去扮狗狗到處 sniffing.

下載 Modernizr 請到其首頁 :

# Modernizr 首頁

目前是 2.7.0 版, 請按中央 "Development" 按鈕進入下載頁面 :


Modernizr 函式庫可以客製化 (可以下載只包含想要測試之功能的程式碼), 預設除了右下角 Extra 項下的 Media Queries 外, 其他檢測功能都已經預設選取, 建議把 Media Queries 也選取, 而且勾選左下角的 "Don't Minify Source", 這樣我們就可以研究原始碼是如何檢測 HTML5 功能的, 全功能開發版只有 29KB 而已 :


然後按 "Generate!" 鈕, 下方就會顯示函式庫原始碼, 再按 "Download" 即可下載此客製化函式庫, 其檔名可能像是 modernizr.custom.28923.js 這樣, 為了簡短, 可改為 modernizr.js 就好, 然後複製到專案目錄下, 然後在網頁中匯入 modernizr.js. 我把它放在測試目錄下 :

# modernizr.js 2.7.0 版 (按滑鼠右鍵另存新檔)

下面就來看看其用法, 測試用範本如下 :

<!DOCTYPE html>
<meta charset=utf-8>
<head>
  <title>HTML5 Test</title>
  <script src="modernizr.js"></script>
</head>
<body>
  <script>
  </script>
</body>

此函式庫匯入後會建立一個 Javascript 物件 Modernizr, 它會將 HTML5 與 CSS3 支援情形記錄在所提供的相關屬性上, 例如要測試是否支援 canvas 功能. 其語法為 :

if (Modernizr.canvas) {
    //支援 canvas
    }
else {
    //不支援 canvas
    }

要特別注意, Modernizr 所用的的屬性名稱跟用 Javascript 去存取 DOM 物件之屬性有一些不同, Modernizr 省略符號, 全部使用小寫字母, 例如新表單輸入元件 datetime-local 在 Modernizr 要改為 datetimelocal, 不需 dash.

在下列範例一中, 我用三元運算子 ? : 來做判斷 :

Modernizr.canvas? document.write("O"): document.write("X");

測試範例 1 : http://tony1966.16mb.com/html5test/modernizr.htm [看原始碼]

在 Chrome 31.0 上測試, 其未支援項目只有兩項, Web SQL 與 IndexedDB 都有支援, 僅新表單輸入元件 datetime, datetimelocal 未支援, 堪稱模範生 :
 datetime, datetimelocal

於 Opera 18.0 測試, 未支援項目僅六項 :
h264, mp3, m4a, datetime, datetimelocal,

在 Firefox 25.0.1 上測試, 其未支援項目有十四項 :
h264, mp3, m4a, websqldatabase, datetime, date, month, week, time, datetimelocal, number, color, flexbox, cssreflections

總之, Firefox 在新表單輸入元件方面支援度還不是很好, 其他還不錯 (不支援 Web SQL).

在 Windows 系統的 Safari 5.1.7 上測試, 其未支援項目有十四項 :
ogg, webm, indexeddb, webgl, datetime, date, month, week, time, datetimelocal, color, autocomplete, list, flexbox

在 iPad2 之 iOS 5.1.7 的 Safari 測試, 未支援項目比 Windows 版 Safari 較少僅八項 (改天升級 iOS7 後再來測試一遍) :
ogg, webm, indexeddb, datetimelocal, color, autocomplete, list, flexbox

Safari 跟 Firefox 差不多, 也是新表單輸入元件方面支援度還不全, Safari 支援 Web SQL, 未支援 IndexedDB.

至於 IE8, 那就慘不忍睹, 與其列出其未支援項目, 不如列出其支援項目較快 :
draganddrop, localstorage, sessionstorage, postmessage, fontface

而 IE 9 聲稱要支援 HTML5, 但也只是進步一些而已, 同樣列出其支援項目較快 :
canvas, canstext, video, h264, mp3, m4a, draganddrop, localstorage, sessionstorage, geolocation, postmessage, svg, inlinsvg, svgclippaths, hashchange, fontface, backgrounsize, borderradius, boxshadow, hsla, multiplebgs, opacity, rgba, generatedcontent, csstransforms

微軟會軟趴趴, 不是沒有原因的.

好消息是 IE 11.0 有進步, 我在 Win8.1 上的 IE 11 測試結果, 其未支援項目有 13 項 :
ogg, webm, wav, websqldatabase, smil, datetime, date, month, week, time, datetimelocal, color, cssreflections

看起來跟 Firefox 差不多了, 主要也是新表單輸入元件尚未完全支援, 但 IE 11 未支援 wav 有點奇怪.

而我的 HTC Desire S 上的 Android 2.3.6 瀏覽器未支援項目 23 項 :
ogg, webm, wav, webworkers, indexeddb, websockets, svg, inlinesvg, svgclippaths, smil, webgl, url, datetime, date, month, week, time, datetimelocal, color, autocomplete, list, flexbox, csstransforms3d

在升版為 Android 4.0.3 版的三星 P7510 瀏覽器測試結果明顯比 2.3.6 好很多, 未支援項目有 9 項 :
ogg, wav, webworkers, webgl, datetimelocal, color, list, flexbox, generatedcontent

 參考資料 :

# Modernizer Documentation
# Dive Into HTML5 (電子書)
HTML5 Modernizr Tutorial
# Modernizr Features Detection Helper