ypeScript是由微軟開發(fā)的自由和開源的編程語言,它是JavaScript語言的超集,主要增加了類型檢查的能力,目標是為了支持大型項目的開發(fā),原生的JavaScript可以原封不動在TypeScript語言里使用。TypeScript的語言很像Java這樣的后端語言,轉換到TypeScript讓你開啟了全棧能力的征程。
但是直接從JavaScript切換到TypeScript并非沒有代價,可以參考從 JavaScript 遷移到 TypeScript - TypeScript 中文手冊掌握切換的一般步驟,不過按照指導操作我還是遇到別的問題,本文以《WebGL編程指南》一書的示例代碼為例介紹我遇到的問題以及解決辦法。
注意使用TypeScript編寫的代碼并不能直接運行,還是需要編譯成JavaScript才行,首先使用npm命令全局安裝TypeScript。
npm install -g typescript
安裝成功后,cmd執(zhí)行tsc -v如果成功打印版本則表示安裝成功。
當我嘗試把《WebGL編程指南》中的代碼轉換到TypeScript進行練習時,執(zhí)行tsc命令編譯報錯,提示找不到getWebGLContext這個方法,這個方法是本書作者提供的js庫cuon-utils.js中的方法。
示例代碼位置:
《WebGL編程指南》第2章WebGL入門中的一個示例“最短的WebGL程序:清空繪圖區(qū)”,16頁。
源碼倉庫鏈接:https://github.com/GrayMind/WebGL-Programming-Guide.git/
解決這個問題可以通過在tsconfig.json這個TypeScript工程管理配置中設置,在include中引入lib這個目錄即可,這樣TypeScript就能識別提示不存在的方法了,再次執(zhí)行tsc命令編譯就不會報錯了,getWebGLContext方法就可以正常使用了(不過TypeScript做了檢查,需要把第二個參數(shù)傳入,默認為false)。
{
"compilerOptions": {
"outDir": "./built",
"allowJs": true,
"target": "es6"
},
"include": [
"./src/*",
"./lib/*", // 這里引入lib目錄,TypeScript就會包含引入其中的js文件了
]
}
還有些細節(jié)的地方需要變動,這里列出全部代碼并在變動的地方添加了注釋。
HelloCanvas.html:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>最短的WebGL程序:清空繪圖區(qū)</title>
</head>
<!-- 原來body中的onload="main()"不再需要了 -->
<body>
<canvas id="webgl" width="400" height="400">
您的瀏覽器不支持WebGL
</canvas>
<script src="../lib/webgl-utils.js"></script>
<script src="../lib/webgl-debug.js"></script>
<script src="../lib/cuon-utils.js"></script>
<!-- script元素要增加type="module"來支持模塊的import export -->
<script type="module" src="./built/src/HelloCanvas.js"></script>
</body>
</html>
HelloCanvas.ts:
這里是云端源想IT,幫你輕松學IT”
嗨~ 今天的你過得還好嗎?
最具勇氣的行為
仍然是獨立思考
并將你的想法大聲公之于世
- 2024.03.25 -
在網絡設計的世界里,盒子模型是構建網頁布局的基石,只有理解了盒子模型,我們才能更好的進行網頁布局。
HTML中的每一個元素都可以看成是一個盒子,擁有盒子一樣的外形和平面空間,它不可見、不直觀,但無處不在,所以初學者很容易在這上面出問題。今天就讓我們來深入了解一下盒子模型。
首先,我們來理解一下什么是CSS盒子模型。
簡單來說,CSS盒子模型是CSS用來管理和布局頁面上每一個元素的一種機制。每個HTML元素都可以被想象成一個矩形的盒子,這個盒子由內容(content)、內邊距(padding)、邊框(border)和外邊距(margin)四個部分組成。
這四個部分共同作用,決定了元素在頁面上的最終顯示效果。
一個盒子由外到內可以分成四個部分:margin(外邊距)、border(邊框)、padding(內邊距)、content(內容)。其中margin、border、padding是CSS屬性,因此可以通過這三個屬性來控制盒子的這三個部分。而content則是HTML元素的內容。
下面來一一介紹盒子模型的各個組成部分:
2.1 內容(Content)
內容是盒子模型的中心,它包含了實際的文本、圖片等元素。內容區(qū)域是盒子模型中唯一不可或缺的部分,其他三部分都是可選的。
內容區(qū)的尺寸由元素的寬度和高度決定,但可以通過設置box-sizing屬性來改變這一行為。
下面通過代碼例子來了解一下內容區(qū):
<!DOCTYPE html>
<html>
<head>
<style>
.box {
width: 200px;
height: 100px;
background-color: lightblue;
border: 2px solid black;
padding: 10px;
margin: 20px;
box-sizing: content-box; /* 默認值 */
}
</style>
</head>
<body>
<div>這是一個盒子模型的例子。</div>
</body>
</html>
在這個例子中,.box類定義了一個具有特定樣式的<div>元素。這個元素的寬度為200px,高度為100px,背景顏色為淺藍色。邊框為2像素寬的黑色實線,內邊距為10像素,外邊距為20像素。
由于我們設置了box-sizing: content-box;(這是默認值),所以元素的寬度和高度僅包括內容區(qū)的尺寸。換句話說,元素的寬度是200px,高度是100px,不包括內邊距、邊框和外邊距。
如果我們將box-sizing屬性設置為border-box,則元素的寬度和高度將包括內容區(qū)、內邊距和邊框,但不包括外邊距。這意味著元素的總寬度將是234px(200px + 2 * 10px + 2 * 2px),高度將是124px(100px + 2 * 10px + 2 * 2px)。
總之,內容區(qū)是CSS盒子模型中的一個核心概念,它表示元素的實際內容所在的區(qū)域。通過調整box-sizing屬性,您可以控制元素尺寸是否包括內容區(qū)、內邊距和邊框。
2.2 內邊距(Padding)
內邊距是內容的緩沖區(qū),它位于內容和邊框之間。通過設置內邊距,我們可以在內容和邊框之間創(chuàng)建空間,讓頁面看起來不會太過擁擠。
內邊距是內容區(qū)和邊框之間的距離,會影響到整個盒子的大小。
代碼示例:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title></title>
<style type="text/css">
/*
1、 padding-top: ; 上內邊距
padding-left:; 左內邊距
padding-right:; 右內邊距
padding-bottom:; 下內邊距
2、padding簡寫 可以跟多個值
四個值 上 右 下 左
三個值 上 左右 下
二個值 上下 左右
一個值 上下左右
*/
.box1 {
width: 200px;
height: 200px;
background-color: #bfa;
/* padding-top:30px ;
padding-left: 30px;
padding-right: 30px;
padding-bottom: 30px; */
padding: 40px;
border: 10px transparent solid;
}
.box1:hover {
border: 10px red solid;
}
/*
* 創(chuàng)建一個子元素box2占滿box1,box2把內容區(qū)撐滿了
*/
.box2 {
width: 100%;
height: 100%;
background-color: yellow;
}
</style>
</head>
<body>
<div>
<div></div>
</div>
</body>
</html>
2.3 邊框(Border)
邊框圍繞在內邊距的外圍,它可以是實線、虛線或者其他樣式。邊框用于定義內邊距和外邊距之間的界限,同時也起到了美化元素的作用。
邊框屬于盒子邊緣,邊框里面屬于盒子內部,出了邊框都是盒子的外部,設置邊框必須指定三個樣式 邊框大小、邊框的樣式、邊框的顏色
代碼示例:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title></title>
<style type="text/css">
.box {
width: 0px;
height: 0px;
/* background-color: rgb(222, 255, 170); */
/* 邊框的大小 如果省略,有默認值,大概1-3px ,不同的瀏覽器默認大小不一樣
border-width 后可跟多個值
四個值 上 右 下 左
三個值 上 左右 下
二個值 上下 左右
一個值 上下左右
單獨設置某一邊的邊框寬度
border-bottom-width
border-top-width
border-left-width
border-right-width
*/
border-width: 20px;
/* border-left-width:40px ; */
/*
邊框的樣式
border-style 可選值
默認值:none
實線 solid
虛線 dashed
雙線 double
點狀虛線 dotted
*/
border-style: solid;
/* 設置邊框的顏色 默認值是黑色
border-color 也可以跟多個值
四個值 上 右 下 左
三個值 上 左右 下
二個值 上下 左右
一個值 上下左右
對應的方式跟border-width是一樣
單獨設置某一邊的邊框顏色
border-XXX-color: ;
*/
border-color: transparent transparent red transparent ;
}
.box1{
width: 200px;
height: 200px;
background-color: turquoise;
/* 簡寫border
1、 同時設置邊框的大小,顏色,樣式,沒有順序要求
2、可以單獨設置一個邊框
border-top:; 設置上邊框
border-right 設置右邊框
border-bottom 設置下邊框
border-left 設置左邊框
3、去除某個邊框
border:none;
*/
border: blue solid 10px;
border-bottom: none;
/* border-top:10px double green ; */
}
</style>
</head>
<body>
<div></div>
<div></div>
</body>
</html>
2.4 外邊距(Margin)
外邊距是元素與外界的間隔,它決定了元素與其他元素之間的距離。通過調整外邊距,我們可以控制元素之間的相互位置關系,從而影響整體布局。
代碼示例:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title></title>
<style type="text/css">
/* 外邊距 不會影響到盒子的大小
可以控制盒子的位置
margin-top:; 正值 元素向下移動 負值 元素向上移動
margin-left:; 正值 元素向右移動 負值 元素向左移動
margin-bottom:; 正值 元素自己不動,其靠下的元素向下移動,負值 元素自己不動,其靠下的元素向上移動
margin-right: ; 正值負值都不動
簡寫 margin 可以跟多個值
規(guī)則跟padding一樣
*/
.box1 {
width: 200px;
height: 200px;
background-color: #bfa;
border: 10px solid red;
/* margin-top: -100px;
margin-left: -100px;
margin-bottom: -100px;
margin-right: -100px; */
margin: 40px;
}
.box2 {
width: 200px;
height: 200px;
background-color: yellow;
}
</style>
</head>
<body>
<div></div>
<div></div>
</body>
</html>
盒子的大小指的是盒子的寬度和高度。大多數(shù)初學者容易將寬度和高度誤解為width和height屬性,然而默認情況下width和height屬性只是設置content(內容)部分的寬和高。
盒子真正的寬和高按下面公式計算
我們還可以用帶屬性的公式表示:
上面說到的是默認情況下的計算方法,另外一種情況下,width和height屬性設置的就是盒子的寬度和高度。盒子的寬度和高度的計算方式由box-sizing屬性控制。
box-sizing屬性值
content-box:默認值,width和height屬性分別應用到元素的內容框。在寬度和高度之外繪制元素的內邊距、邊框、外邊距。
border-box:為元素設定的width和height屬性決定了元素的邊框盒。就是說,為元素指定的任何內邊距和邊框都將在已設定的寬度和高度內進行繪制。通過從已設定的寬度和高度分別減去 邊框 和 內邊距 才能得到內容的寬度和高度。
inherit:規(guī)定應從父元素繼承box-sizing屬性的值
想要快速入門前端開發(fā)嗎?推薦一個前端開發(fā)基礎課程,這個老師講的特別好,零基礎學習無壓力,知識點結合代碼,邊學邊練,可以免費試看試學,還有各種輔助工具和資料,非常適合新手!點這里前往學習哦!云端源想
掌握了盒子模型的基本概念后,我們就可以開始創(chuàng)造性地應用它來設計網頁。以下是一些技巧:
CSS盒子模型是前端開發(fā)的精髓之一,它不僅幫助我們理解和控制頁面布局,還為我們提供了無限的創(chuàng)意空間。現(xiàn)在,你已經掌握了盒子模型的奧秘,是時候在你的項目中運用這些知識,創(chuàng)造出令人驚嘆的網頁設計了。
記住,每一個細節(jié)都可能是打造卓越用戶體驗的關鍵。開啟你的CSS盒子模型之旅,讓我們一起構建更加精彩、更加互動的網頁世界!
我們下期再見!
END
文案編輯|云端學長
文案配圖|云端學長
內容由:云端源想分享
一節(jié)我們完成了基本的設置,應該說,至少目前對我來說,現(xiàn)在的功能已經基本夠用了。
于是我計劃從這篇文章開始,我就不再使用Word進行編輯了,用我這個私人日記軟件來編輯,實際驗證下是否實用。
如下圖,這是我之前教程的編寫模式:
之前也交待過,在word文檔中編輯,只要是包含了圖片的,復制后再粘貼到頭條都沒辦法成功,還需要把圖片一個個另外粘貼過去才行。如果是遇到gif動圖,從word復制只能復制靜態(tài)的截圖,還得再次復制原文件才能粘貼到頭條的編輯器中,操作起來比較麻煩。
于是我就在我的程序中嘗試復制粘貼,發(fā)現(xiàn)跟word是一樣的效果。這對我來說是不實用的,需要對它進行改造。
要解決這個問題,首先要分析下為什么會造成這種情況。我們使用的文本編輯控件是RichTextBox,這個默認是rtf格式的,跟word是一樣的。我們把帶圖文的內容粘貼到word文檔中,圖片就是可以正常顯示的。這就說明我們Ctrl+C的內容是rtf格式的,而不是通過瀏覽器粘貼能夠識別出來的格式。那么瀏覽器能夠識別的格式是不是每個瀏覽器特有的呢?于是我嘗試在FireFox中復制圖片和文字,粘貼到用Chrome打開的頭條編輯器,發(fā)現(xiàn)圖片是可以顯示的,上述的猜測可以排除了。那么這個格式究竟是怎樣的呢?我需要在程序中截獲一下粘貼的內容。在ContentManagerForm.cs文件中,添加鍵盤截獲事件,截獲Ctrl+V時的內容:
我們發(fā)現(xiàn),如果從瀏覽器上按Ctrl+C,到我們的軟件中按Ctrl+V,用DataFormats.Html做參數(shù)可以取到值,值的內容大概是這樣:
前面紅線部分相當于信息頭,定義了一些參數(shù),后面從<div>開始就是我們剛剛復制的內容了。我原封不動地將這些內容再寫回到剪貼板中,然后在瀏覽器中按Ctrl+V,瀏覽器也能夠正常顯示了。
這樣我們基本上就明白了,想要跟瀏覽器正常通訊,需要兩步:第一步是要將rtf格式轉換為html格式,第二步是要將html再轉換成瀏覽器能夠識別的格式到剪貼板。
一般這種格式轉換需要的工作量都比較大,自己從頭開發(fā)不大現(xiàn)實,需要網上找找看是否有現(xiàn)成的類庫。對比了幾家,找到了一個rftpipe的,而且是mit授權的。于是從Nuget獲取安裝,使用起來很容易:
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
string html=RtfPipe.Rtf.ToHtml(tbxMainBody.Rtf);
如此兩行代碼就實現(xiàn)了第一步的轉換。
同樣也是先網上查資料,找到了一個ClipboardHelper的類,同樣也是mit授權的。把代碼加入到工程,然后在ContentManagerForm中增加一個專門用于復制成html格式到剪貼板的按鈕:
按鈕處理代碼:
private void btnCopyAsHtml_Click(object sender, EventArgs e)
{
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
string html=RtfPipe.Rtf.ToHtml(tbxMainBody.Rtf);
ClipboardHelper.CopyToClipboard(html, "");
}
在使用了類庫的基礎上,三行代碼就完成了我想要的功能。
功能演示:
以上解決了從軟件復制到頭條的問題。
還有一種場景,就是把瀏覽器當成來源,從瀏覽器復制到軟件的功能。如果是純文本RichEdit編輯器自帶就支持,如果是圖文混排的,就需要從html到rtf的轉換,我找了一下相關的類庫,貌似沒有類似rftpipe這種免費且直接支持字符轉換的庫,很多都是通過文檔來轉換,而且還是收費的。好不容易找到一個符合要求的,結果這個項目比較老,是在Framework下開發(fā)的,不支持.netcore。
鑒于找到合適的庫有點困難,隨后仔細分析了下需求,其實這種從瀏覽器圖文混排復制到軟件的場景對我來說意義不大,通篇復制是不大可能的,關鍵位置復制文字做摘抄,真的有特別需要的圖片,單張截圖就好,所以這個功能暫時擱置吧。
這個小項目伴著教程做到了24節(jié),終于有了一點實際作用了:)
----------------------------------------------------
本教程盡量保證2天一更,項目源碼已作為開源項目加入到Gitee,代碼內容會隨教程實時更新,大家有興趣的話可以關注我,以獲得最及時的更新。私信:
私人日記 可以獲取Gitee的鏈接;
sqlitestudio 可以獲取sqlitestudio的鏈接;
菜鳥 可以獲取菜鳥教程鏈接;
QQ群 可以獲取教程交流Q群號;
大家閱讀過程中有哪些看不懂或未盡興的地方,可以在評論區(qū)留言,我會先記下來在后續(xù)的教程中找機會再說。
教程有幫助的話請大家?guī)兔﹃P注、轉發(fā)、擴散,能不能開專欄還需要你們的支持!
*請認真填寫需求信息,我們會在24小時內與您取得聯(lián)系。