HTML代表超文本標記語言(Hypertext Markup Language)。它是一種用于構建網頁的標記語言。HTML文件包含一組標簽,這些標簽用于定義網頁的結構和內容。瀏覽器讀取HTML文件,并根據標記中的指示呈現網頁內容。
HTML的主要作用是定義文本內容、圖像、鏈接和其他媒體的排列方式,并提供交互元素,例如表單和按鈕。
每個HTML文檔都應該遵循以下基本結構:
<!DOCTYPE html>
<html>
<head>
<title>網頁標題</title>
</head>
<body>
<!-- 內容在這里 -->
</body>
</html>
讓我們逐步解釋這個結構:
HTML標簽是由尖括號括起來的名稱,例如<p>表示段落,<img>表示圖像。標簽通常成對出現,有一個開始標簽和一個結束標簽。例如:
<p>這是一個段落。</p>
<p>是開始標簽,</p>是結束標簽,文本位于兩個標簽之間。標簽定義了元素的類型和結構。
有些HTML標簽是自封閉的,不需要結束標簽,例如<img>用于插入圖像。
在HTML中,你可以使用注釋來添加說明性文字,注釋不會在瀏覽器中顯示。HTML注釋使用<!--開頭和-->結尾,如下所示:
<!-- 這是一個注釋 -->
注釋通常用于添加文檔說明、調試代碼或標記未來的修改。
HTML中的文本通常包含在段落、標題、列表等元素中。以下是一些常見的文本元素:
示例:
<p>這是一個段落。</p>
<h1>這是一個標題</h1>
<p><strong>這是強調文本。</strong></p>
<p><em>這是斜體文本。</em></p>
<p>訪問<a href="https://www.example.com">示例網站</a></p>
要在網頁中插入圖像,可以使用<img>標簽。它是一個自封閉標簽,需要指定圖像的src屬性來指定圖像文件的路徑。
示例:
htmlCopy code
<img src="image.jpg" alt="圖像描述">
通過使用<a>標簽,可以在網頁中創建鏈接。鏈接通常包含在文本或圖像中,并使用href屬性指定目標URL。
示例:
<a href="https://www.example.com">訪問示例網站</a>
HTML支持有序列表(<ol>)、無序列表(<ul>)和定義列表(<dl>)。
無序列表使用<ul>標簽定義,每個列表項使用<li>標簽。
示例:
<ul>
<li>項目1</li>
<li>項目2</li>
<li>項目3</li>
</ul>
有序列表使用<ol>標簽定義,每個列表項使用<li>標簽。
示例:
<ol>
<li>第一項</li>
<li>第二項</li>
<li>第三項</li>
</ol>
定義列表使用<dl>標簽定義,每個定義項目使用<dt>標簽定義術語,使用<dd>標簽定義描述。
示例:
<dl>
<dt>術語1</dt>
<dd>描述1</dd>
<dt>術語2</dt>
<dd>描述2</dd>
</dl>
HTML表單允許用戶與網頁進行交互,提交數據。以下是HTML表單的基本元素:
<form>元素用于創建表單,可以包含文本字段、復選框、單選按鈕、下拉列表等。
示例:
<form action="submit.php" method="post">
<!-- 表單元素在這里 -->
</form>
輸入字段用于接收用戶輸入的數據,常見的輸入字段類型包括文本框、密碼框、單選按鈕、復選框等。
文本框使用<input>標簽,type屬性設置為"text"。
示例:
<input type="text" name="username" placeholder="用戶名">
密碼框使用<input>標簽,type屬性設置為"password"。
示例:
htmlCopy code
<input type="password" name="password" placeholder="密碼">
單選按鈕使用<input>標簽,type屬性設置為"radio"。
示例:
<input type="radio" name="gender" value="male">男
<input type="radio" name="gender" value="female">女
復選框使用<input>標簽,type屬性設置為"checkbox"。
示例:
<input type="checkbox" name="subscribe" value="yes">訂閱新聞
下拉列表使用<select>和<option>標簽創建。<select>定義下拉列表,而<option>定義選項。
示例:
<select name="country">
<option value="us">美國</option>
<option value="ca">加拿大</option>
<option value="uk">英國</option>
</select>
HTML用于定義網頁的結構和內容,但要使網頁看起來更吸引人,需要使用CSS(層疊樣式表)。CSS允許你定義字體、顏色、布局等樣式。
可以在HTML元素內部使用style屬性來定義內聯樣式。
示例:
<p style="color: blue; font-size: 16px;">這是一個藍色的段落。</p>
外部樣式表將樣式規則保存在獨立的CSS文件中,并通過<link>標簽將其鏈接到HTML文檔。
示例(style.css):
/* style.css */
p {
color: blue;
font-size: 16px;
}
在HTML中鏈接外部樣式表:
<link rel="stylesheet" type="text/css" href="style.css">
這使得可以在整個網站上共享相同的樣式。
HTML是構建現代網頁的基礎。通過學習HTML的基本語法和元素,你可以創建吸引人且功能強大的網頁。無論是文本、圖像、鏈接還是表單,HTML提供了豐富的工具來呈現內容和實現用戶交互。
這篇文章提供了HTML的基礎知識,但HTML是一個廣泛的主題,還有許多高級特性和技巧等待你探索。希望這篇文章對你入門HTML有所幫助,讓你能夠開始創建自己的網頁。繼續學習和實踐,你將成為一個熟練的網頁開發者。
eb 開發主要會用到 HTML 和 CSS,而可視化則較少涉及 HTML 和 CSS。可視化更多地要同瀏覽器的 Canvas、SVG、WebGL 等其他圖形 API 打交道。
Web 開發著重于處理普通的文本和多媒體信息,渲染普通的、易于閱讀的文本和多媒體內容;可視化開發則著重于處理結構化數據,需要深入渲染引擎層,從而控制細節,讓瀏覽器渲染出各種相對復雜的圖表和圖形元素。
可視化用一句話來說,本質上就是將數據信息組織起來后,以圖形的方式呈現出來。
現代瀏覽器的 HTML、CSS 表現能力很強大,完全可以實現常規的圖表展現,比如,我們常見的柱狀圖、餅圖和折線圖。
一些簡單的可視化圖表,用 CSS 來實現很有好處,既能簡化開發,又不需要引入額外的庫,可以節省資源,提高網頁打開的速度。
用 CSS 實現柱狀圖其實很簡單,原理就是使用網格布局(Grid Layout)加上線性漸變(Linear-gradient)。代碼及效果如下:
.bargraph {
display: grid;
width: 150px;
height: 100px;
padding: 10px;
transform: scaleY(3);
grid-template-columns: repeat(5, 20%);
}
.bargraph div {
margin: 0 2px;
}
.bargraph div:nth-child(1) {
background: linear-gradient(to bottom, transparent 75%, #37c 0, #37c 85%, #3c7
}
.bargraph div:nth-child(2) {
background: linear-gradient(to bottom, transparent 74%, #37c 0, #37c 89%, #3c7
}
.bargraph div:nth-child(3) {
background: linear-gradient(to bottom, transparent 60%, #37c 0, #37c 83%, #3c7
}
.bargraph div:nth-child(4) {
background: linear-gradient(to bottom, transparent 55%, #37c 0, #37c 75%, #3c7
}
.bargraph div:nth-child(5) {
background: linear-gradient(to bottom, transparent 32%, #37c 0, #37c 63%, #3c7
}
而要實現餅圖,可以使用圓錐漸變,方法也很簡單,上代碼。
.piegraph {
display: inline-block;
width: 250px;
height: 250px;
border-radius: 50%;
background-image: conic-gradient(#37c 30deg, #3c7 30deg, #3c7 65deg, orange 6
}
除此之外,用 HTML 和 CSS 也可以實現折線圖??梢杂酶叨群苄〉?Div 元素來模擬線段,用 transform 改變角度和位置,這樣就能拼成折線圖了。另外,如果使用 clip-path 這樣的高級屬性,我們還能實現更復雜的圖表,比如,用不同的顏色表示兩個不同折線的面積。
從 CSS 代碼里,很難看出數據與圖形的對應關系,有很多換算也需要開發人員自己來做。這樣一來,一旦圖表或數據發生改動,就需要我們重新計算,維護起來會很麻煩。
其次,HTML 和 CSS 作為瀏覽器渲染引擎的一部分,為了完成頁面渲染的工作,除了繪制圖形外,還要做很多額外的工作。比如說,瀏覽器的渲染引擎在工作時,要先解析 HTML、SVG、CSS,構建 DOM 樹、RenderObject 樹和 RenderLayer 樹,然后用 HTML(或 SVG)繪圖。當圖形發生變化時,我們很可能要重新執行全部的工作,這樣的性能開銷是非常大的。
傳統的 Web 開發,因為涉及 UI 構建和內容組織,所以這些額外的解析和構建工作都是必須做的。而可視化與傳統網頁不同,它不太需要復雜的布局,更多的工作是在繪圖和數據計算。所以,對于可視化來說,這些額外的工作反而相當于白白消耗了性能。
因此,相比于 HTML 和 CSS,Canvas 和 WebGL 更適合去做可視化這一領域的繪圖工作。它們的繪圖 API 能夠直接操作繪圖上下文,一般不涉及引擎的其他部分,在重繪圖像時,也不會發生重新解析文檔和構建結構的過程,開銷要小很多。
SVG 是一種基于 XML 語法的圖像格 式,可以用圖片(img 元素)的 src 屬性加載。而且,瀏覽器更強大的是,它還可以內嵌 SVG 標簽,并且像操作普通的 HTML 元素一樣,利用 DOM API 操作 SVG 元素。甚至, CSS 也可以作用于內嵌的 SVG 元素。
比如,上面的柱狀圖,如果用 SVG 實現的話,可以用如下所示的代碼來實現:
<!--
dataset = {
total: [25, 26, 40, 45, 68],
current: [15, 11, 17, 25, 37],
}
-->
<svg xmlns="http://www.w3.org/2000/svg" width="120px" height="240px" viewbox="<g" transform="translate(0, 100) scale(1, -1)">
<g>
<rect x="1" y="0" width="10" height="25" fill="#37c" />
<rect x="13" y="0" width="10" height="26" fill="#37c" />
<rect x="25" y="0" width="10" height="40" fill="#37c" />
<rect x="37" y="0" width="10" height="45" fill="#37c" />
<rect x="49" y="0" width="10" height="68" fill="#37c" />
</g>
<g>
<rect x="1" y="0" width="10" height="15" fill="#3c7" />
<rect x="13" y="0" width="10" height="11" fill="#3c7" />
<rect x="25" y="0" width="10" height="17" fill="#3c7" />
<rect x="37" y="0" width="10" height="25" fill="#3c7" />
<rect x="49" y="0" width="10" height="37" fill="#3c7" />
</g>
</svg>
從上面的 SVG 代碼中,可以一目了然地看出,數據 total 和 current 分別對應 SVG 中兩個 g 元素下的 rect 元素的高度。也就是說,元素的屬性和數值可以直接對應起來。而 CSS 代碼并不能直觀體現出數據的數值,需要進行 CSS 規則轉換。具體如下圖所示:
在上面這段 SVG 代碼中,g 表示分組,rect 表示繪制一個矩形元素。除了 rect 外,SVG 還提供了豐富的圖形元素,可以繪制矩形、圓弧、橢圓、多邊形和貝塞爾曲線等等。具體可查看 MDN SVG。
SVG 繪制圖表與 HTML 和 CSS 繪制圖表的方式差別不大,只不過是將 HTML 標簽替換成 SVG 標簽,運用了一些 SVG 支持的特殊屬性。
HTML 的不足之處在于 HTML 元素的形狀一般是矩形,雖然用 CSS 輔助,也能夠繪制出各種其它形狀的圖形,甚至不規則圖形,但是總體而言還是非常麻煩的。而 SVG 則彌補了這方面的不足,讓不規則圖形的繪制變得更簡單了。因此,用 SVG 繪圖比用 HTML 和 CSS 要便利得多。
SVG 圖表也有缺點。在渲染引擎中,SVG 元素和 HTML 元素一樣,在輸出圖形前都需要經過引擎的解析、布局計算和渲染樹生成。而且,一個 SVG 元素只表示一種基本圖形,如果展示的數據很復雜,生成圖形的 SVG 元素就會很多。這樣一來,大量的 SVG 元素不僅會占用很多內存空間,還會增加引擎、布局計算和渲染樹生成的開銷,降低性能,減慢渲染速度。這也就注定了 SVG 只適合應用于元素較少的簡單可視化場景。
除了 SVG,使用 Canvas 上下文來繪制可視化圖表也很方便,但是在繪制方式上, Canvas 和 HTML/CSS、SVG 又有些不同。
無論是使用 HTML/CSS 還是 SVG,它們都屬于聲明式繪圖系統,也就是我們根據數據創建各種不同的圖形元素(或者 CSS 規則),然后利用瀏覽器渲染引擎解析并渲染出來。 但是 Canvas 不同,它是瀏覽器提供的一種可以直接用代碼在一塊平面的“畫布”上繪制圖形的 API,使用它來繪圖更像是傳統的“編寫代碼”,簡單來說就是調用繪圖指令,然后引擎直接在頁面上繪制圖形。這是一種指令式的繪圖系統。
首先,Canvas 元素在瀏覽器上創造一個空白的畫布,通過提供渲染上下文,賦予開發者繪制內容的能力。只需要調用渲染上下文,設置各種屬性,然后調用繪圖指令完成輸出,就能在畫布上呈現各種各樣的圖形。
為了實現更加復雜的效果,Canvas 還提供了非常豐富的設置和繪圖 API,我們可以通過操作上下文,來改變填充和描邊顏色,對畫布進行幾何變換,調用各種繪圖指令,然后將繪制的圖形輸出到畫布上。具體可以查看MDN Canvas。
總結來說,Canvas 能夠直接操作繪圖上下文,不需要經過 HTML、CSS 解析、構建渲染樹、布局等一系列操作。因此單純繪圖的話,Canvas 比 HTML/CSS 和 SVG 要快得多。
因為 HTML 和 SVG 一個元素對應一個基本圖形,所以我們可以很方便地操作它們,比如在柱狀圖的某個柱子上注冊點擊事件。而同樣的功能在 Canvas 上就比較難實現,因為對于 Canvas 來說,繪制整個柱狀圖的過程就是一系列指令的執行過程,其中并沒有區分“A 柱子”、“B 柱子”,很難單獨對 Canvas 繪圖的局部進行控制。不過這并不代表就不能控制 Canvas 的局部了。實際上,通過數學計算是可以通過定位的方式來獲取局部圖形的。
Canvas 和 SVG 的使用也不是非此即彼的,它們可以結合使用。因為 SVG 作為一種圖形格式,也可以作為 image 元素繪制到 Canvas 中。舉個例子,可以先使用 SVG 生成某些圖形,然后用 Canvas 來渲染。這樣,既可以享受 SVG 的便利性,又可以享受 Canvas 的高性能了。
WebGL 繪制比前三種方式要復雜一些,因為 WebGL 是基于 OpenGL ES 規范的瀏覽器實現的,API 相對更底層,使用起來不如前三種那么簡單直接。 一般情況下,Canvas 繪制圖形的性能已經足夠高了,但是在三種情況下有必要直接操作更強大的 GPU 來實現繪圖。
第一種情況,如果要繪制的圖形數量非常多,比如有多達數萬個幾何圖形需要繪制,而且它們的位置和方向都在不停地變化,即使用 Canvas 繪制了,性能還是會達到瓶頸。這個時候,就需要使用 GPU 能力,直接用 WebGL 來繪制。
第二種情況,如果要對較大圖像的細節做像素處理,比如,實現物體的光影、流體效果和一些復雜的像素濾鏡。由于這些效果往往要精準地改變一個圖像全局或局部區域的所有像素點,要計算的像素點數量非常的多(一般是數十萬甚至上百萬數量級的)。這時候即使采用 Canvas 操作,也會達到性能瓶頸,所以也要用 WebGL 來繪制。
第三種情況是繪制 3D 物體。因為 WebGL 內置了對 3D 物體的投影、深度檢測等特性,所以用它來渲染 3D 物體就不需要我們對坐標做底層的處理了。在這種情況下,WebGL 無論是在使用上還是性能上都有很大優勢。
HTML+CSS 的優點是方便,不需要第三方依賴,甚至不需要 JavaScript 代碼。如果要繪制少量常見的圖表,可以直接采用 HTML 和 CSS。它的缺點是 CSS 屬性不能直觀體現數據,繪制起來也相對麻煩,圖形復雜會導致 HTML 元素多,而消耗性能。
SVG 是對 HTML/CSS 的增強,彌補了 HTML 繪制不規則圖形的能力。它通過屬性設置圖形,可以直觀地體現數據,使用起來非常方便。但是 SVG 也有和 HTML/CSS 同樣的問題,圖形復雜時需要的 SVG 元素太多,也非常消耗性能。
Canvas 是瀏覽器提供的簡便快捷的指令式圖形系統,它通過一些簡單的指令就能快速繪制出復雜的圖形。由于它直接操作繪圖上下文,因此沒有 HTML/CSS 和 SVG 繪圖因為元素多導致消耗性能的問題,性能要比前兩者快得多。但是如果要繪制的圖形太多,或者處理大量的像素計算時,Canvas 依然會遇到性能瓶頸。
WebGL 是瀏覽器提供的功能強大的繪圖系統,它使用比較復雜,但是功能強大,能夠充分利用 GPU 并行計算的能力,來快速、精準地操作圖像的像素,在同一時間完成數十萬或數百萬次計算。另外,它還內置了對 3D 物體的投影、深度檢測等處理,更適合繪制 3D 場景。
當今互聯網時代,HTML 和 Markdown 都是非常流行的標記語言。HTML 用于構建網頁結構和內容,而 Markdown 則以其簡潔易讀的語法被廣泛用于編寫文檔、博客文章等。在很多場景下,我們需要將 HTML 內容轉換為 Markdown 格式,例如網頁內容抓取、文檔格式轉換等。
Rust 作為一門以安全、性能和可靠性著稱的系統級編程語言,也提供了相應的庫來處理 HTML 到 Markdown 的轉換。本文將介紹一個名為 htmd 的 Rust 庫,它提供了一種高效且易于使用的方式來完成這項任務。
htmd 是一個受 JavaScript 庫 turndown.js 啟發而開發的 Rust 庫,用于將 HTML 文檔轉換為 Markdown 格式。它具有以下特點:
在使用 htmd 之前,我們需要先安裝它。將以下依賴項添加到你的 Cargo.toml 文件中:
[dependencies]
htmd = "0.1"
基本轉換
使用 htmd 進行 HTML 到 Markdown 的基本轉換非常簡單。以下代碼展示了如何將一個 <h1> 標簽轉換為 Markdown 中的 # 標題:
use htmd::HtmlToMarkdown;
fn main() {
let markdown = HtmlToMarkdown::new();
let html = "<h1>這是一個標題</h1>";
let result = markdown.convert(html).unwrap();
assert_eq!(result, "# 這是一個標題\n");
}
跳過標簽
在某些情況下,我們可能希望跳過 HTML 文檔中的某些標簽,例如 <script> 和 <style> 標簽。htmd 提供了 skip_tags 方法來實現這一點:
use htmd::HtmlToMarkdown;
fn main() {
let markdown = HtmlToMarkdown::builder()
.skip_tags(vec!["script", "style"])
.build();
let html = r#"
<script>
// 一些 JavaScript 代碼
</script>
<h1>這是一個標題</h1>
"#;
let result = markdown.convert(html).unwrap();
assert_eq!(result, "# 這是一個標題\n");
}
自定義標簽處理器
htmd 允許我們自定義標簽處理器來處理特定的 HTML 標簽。例如,我們可以定義一個處理器將 <img> 標簽轉換為 Markdown 中的圖片語法:
use htmd::{HtmlToMarkdown, HandleResult};
use html5ever::tendril::StrTendril;
use html5ever::QualName;
fn main() {
let markdown = HtmlToMarkdown::builder()
.add_handler(
vec!["img"],
|el| {
let src = el
.attrs
.iter()
.find(|(name, _)| name.local.as_ref() == "src")
.map(|(_, value)| value.as_ref());
let alt = el
.attrs
.iter()
.find(|(name, _)| name.local.as_ref() == "alt")
.map(|(_, value)| value.as_ref());
match (src, alt) {
(Some(src), Some(alt)) => Some(format!("", alt, src)),
_ => None,
}
},
)
.build();
let html = r#"<img src="https://example.com/image.jpg" alt="圖片描述">"#;
let result = markdown.convert(html).unwrap();
assert_eq!(result, "\n");
}
多線程處理
htmd 支持多線程處理,可以充分利用多核 CPU 的性能來加速轉換過程。以下代碼展示了如何使用多線程將多個 HTML 文檔轉換為 Markdown:
use htmd::HtmlToMarkdown;
use std::sync::Arc;
use std::thread;
fn main() {
let markdown = Arc::new(HtmlToMarkdown::new());
let html_docs = vec![
"<h1>文檔 1</h1>",
"<h2>文檔 2</h2>",
"<h3>文檔 3</h3>",
];
let threads: Vec<_> = html_docs
.into_iter()
.map(|html| {
let markdown = markdown.clone();
thread::spawn(move || {
let result = markdown.convert(html).unwrap();
println!("{}", result);
})
})
.collect();
for thread in threads {
thread.join().unwrap();
}
}
htmd 是一個功能強大且易于使用的 Rust 庫,用于將 HTML 文檔轉換為 Markdown 格式。它提供了豐富的選項、自定義標簽處理器和多線程支持,可以滿足各種轉換需求。如果你正在尋找一種高效可靠的 HTML 到 Markdown 轉換解決方案,htmd 絕對值得一試。
*請認真填寫需求信息,我們會在24小時內與您取得聯系。