ypeScript是由微软开发的自由和开源的编程语言,它是JavaScript语言的超集,主要增加了类型检查的能力,目标是为了支持大型项目的开发,原生的JavaScript可以原封不动在TypeScript语言里使用。TypeScript的语言很像Java这样的后端语言,转换到TypeScript让你开启了全栈能力的征程。
但是直接从JavaScript切换到TypeScript并非没有代价,可以参考从 JavaScript 迁移到 TypeScript - TypeScript 中文手册掌握切换的一般步骤,不过按照指导操作我还是遇到别的问题,本文以《WebGL编程指南》一书的示例代码为例介绍我遇到的问题以及解决办法。
注意使用TypeScript编写的代码并不能直接运行,还是需要编译成JavaScript才行,首先使用npm命令全局安装TypeScript。
npm install -g typescript
安装成功后,cmd执行tsc -v如果成功打印版本则表示安装成功。
当我尝试把《WebGL编程指南》中的代码转换到TypeScript进行练习时,执行tsc命令编译报错,提示找不到getWebGLContext这个方法,这个方法是本书作者提供的js库cuon-utils.js中的方法。
示例代码位置:
《WebGL编程指南》第2章WebGL入门中的一个示例“最短的WebGL程序:清空绘图区”,16页。
源码仓库链接:https://github.com/GrayMind/WebGL-Programming-Guide.git/
解决这个问题可以通过在tsconfig.json这个TypeScript工程管理配置中设置,在include中引入lib这个目录即可,这样TypeScript就能识别提示不存在的方法了,再次执行tsc命令编译就不会报错了,getWebGLContext方法就可以正常使用了(不过TypeScript做了检查,需要把第二个参数传入,默认为false)。
{
"compilerOptions": {
"outDir": "./built",
"allowJs": true,
"target": "es6"
},
"include": [
"./src/*",
"./lib/*", // 这里引入lib目录,TypeScript就会包含引入其中的js文件了
]
}
还有些细节的地方需要变动,这里列出全部代码并在变动的地方添加了注释。
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程序:清空绘图区</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)
内容是盒子模型的中心,它包含了实际的文本、图片等元素。内容区域是盒子模型中唯一不可或缺的部分,其他三部分都是可选的。
内容区的尺寸由元素的宽度和高度决定,但可以通过设置box-sizing属性来改变这一行为。
下面通过代码例子来了解一下内容区:
<!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;(这是默认值),所以元素的宽度和高度仅包括内容区的尺寸。换句话说,元素的宽度是200px,高度是100px,不包括内边距、边框和外边距。
如果我们将box-sizing属性设置为border-box,则元素的宽度和高度将包括内容区、内边距和边框,但不包括外边距。这意味着元素的总宽度将是234px(200px + 2 * 10px + 2 * 2px),高度将是124px(100px + 2 * 10px + 2 * 2px)。
总之,内容区是CSS盒子模型中的一个核心概念,它表示元素的实际内容所在的区域。通过调整box-sizing属性,您可以控制元素尺寸是否包括内容区、内边距和边框。
2.2 内边距(Padding)
内边距是内容的缓冲区,它位于内容和边框之间。通过设置内边距,我们可以在内容和边框之间创建空间,让页面看起来不会太过拥挤。
内边距是内容区和边框之间的距离,会影响到整个盒子的大小。
代码示例:
<!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;
}
/*
* 创建一个子元素box2占满box1,box2把内容区撑满了
*/
.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 可以跟多个值
规则跟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>
盒子的大小指的是盒子的宽度和高度。大多数初学者容易将宽度和高度误解为width和height属性,然而默认情况下width和height属性只是设置content(内容)部分的宽和高。
盒子真正的宽和高按下面公式计算
我们还可以用带属性的公式表示:
上面说到的是默认情况下的计算方法,另外一种情况下,width和height属性设置的就是盒子的宽度和高度。盒子的宽度和高度的计算方式由box-sizing属性控制。
box-sizing属性值
content-box:默认值,width和height属性分别应用到元素的内容框。在宽度和高度之外绘制元素的内边距、边框、外边距。
border-box:为元素设定的width和height属性决定了元素的边框盒。就是说,为元素指定的任何内边距和边框都将在已设定的宽度和高度内进行绘制。通过从已设定的宽度和高度分别减去 边框 和 内边距 才能得到内容的宽度和高度。
inherit:规定应从父元素继承box-sizing属性的值
想要快速入门前端开发吗?推荐一个前端开发基础课程,这个老师讲的特别好,零基础学习无压力,知识点结合代码,边学边练,可以免费试看试学,还有各种辅助工具和资料,非常适合新手!点这里前往学习哦!云端源想
掌握了盒子模型的基本概念后,我们就可以开始创造性地应用它来设计网页。以下是一些技巧:
CSS盒子模型是前端开发的精髓之一,它不仅帮助我们理解和控制页面布局,还为我们提供了无限的创意空间。现在,你已经掌握了盒子模型的奥秘,是时候在你的项目中运用这些知识,创造出令人惊叹的网页设计了。
记住,每一个细节都可能是打造卓越用户体验的关键。开启你的CSS盒子模型之旅,让我们一起构建更加精彩、更加互动的网页世界!
我们下期再见!
END
文案编辑|云端学长
文案配图|云端学长
内容由:云端源想分享
一节我们完成了基本的设置,应该说,至少目前对我来说,现在的功能已经基本够用了。
于是我计划从这篇文章开始,我就不再使用Word进行编辑了,用我这个私人日记软件来编辑,实际验证下是否实用。
如下图,这是我之前教程的编写模式:
之前也交待过,在word文档中编辑,只要是包含了图片的,复制后再粘贴到头条都没办法成功,还需要把图片一个个另外粘贴过去才行。如果是遇到gif动图,从word复制只能复制静态的截图,还得再次复制原文件才能粘贴到头条的编辑器中,操作起来比较麻烦。
于是我就在我的程序中尝试复制粘贴,发现跟word是一样的效果。这对我来说是不实用的,需要对它进行改造。
要解决这个问题,首先要分析下为什么会造成这种情况。我们使用的文本编辑控件是RichTextBox,这个默认是rtf格式的,跟word是一样的。我们把带图文的内容粘贴到word文档中,图片就是可以正常显示的。这就说明我们Ctrl+C的内容是rtf格式的,而不是通过浏览器粘贴能够识别出来的格式。那么浏览器能够识别的格式是不是每个浏览器特有的呢?于是我尝试在FireFox中复制图片和文字,粘贴到用Chrome打开的头条编辑器,发现图片是可以显示的,上述的猜测可以排除了。那么这个格式究竟是怎样的呢?我需要在程序中截获一下粘贴的内容。在ContentManagerForm.cs文件中,添加键盘截获事件,截获Ctrl+V时的内容:
我们发现,如果从浏览器上按Ctrl+C,到我们的软件中按Ctrl+V,用DataFormats.Html做参数可以取到值,值的内容大概是这样:
前面红线部分相当于信息头,定义了一些参数,后面从<div>开始就是我们刚刚复制的内容了。我原封不动地将这些内容再写回到剪贴板中,然后在浏览器中按Ctrl+V,浏览器也能够正常显示了。
这样我们基本上就明白了,想要跟浏览器正常通讯,需要两步:第一步是要将rtf格式转换为html格式,第二步是要将html再转换成浏览器能够识别的格式到剪贴板。
一般这种格式转换需要的工作量都比较大,自己从头开发不大现实,需要网上找找看是否有现成的类库。对比了几家,找到了一个rftpipe的,而且是mit授权的。于是从Nuget获取安装,使用起来很容易:
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
string html=RtfPipe.Rtf.ToHtml(tbxMainBody.Rtf);
如此两行代码就实现了第一步的转换。
同样也是先网上查资料,找到了一个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下开发的,不支持.netcore。
鉴于找到合适的库有点困难,随后仔细分析了下需求,其实这种从浏览器图文混排复制到软件的场景对我来说意义不大,通篇复制是不大可能的,关键位置复制文字做摘抄,真的有特别需要的图片,单张截图就好,所以这个功能暂时搁置吧。
这个小项目伴着教程做到了24节,终于有了一点实际作用了:)
----------------------------------------------------
本教程尽量保证2天一更,项目源码已作为开源项目加入到Gitee,代码内容会随教程实时更新,大家有兴趣的话可以关注我,以获得最及时的更新。私信:
私人日记 可以获取Gitee的链接;
sqlitestudio 可以获取sqlitestudio的链接;
菜鸟 可以获取菜鸟教程链接;
QQ群 可以获取教程交流Q群号;
大家阅读过程中有哪些看不懂或未尽兴的地方,可以在评论区留言,我会先记下来在后续的教程中找机会再说。
教程有帮助的话请大家帮忙关注、转发、扩散,能不能开专栏还需要你们的支持!
*请认真填写需求信息,我们会在24小时内与您取得联系。