天这篇是我们正式开篇的第一篇文章,我想和你聊聊 HTML。
我猜屏幕那一边的你估计会说:“HTML 我很熟悉了,每天写,这不是初级程序员才学的内容
么,这我还能不会吗?”
其实在我看来,HTML 并不简单,它是典型的“入门容易,精通困难”的一部分知识。深刻理
解 HTML 是成为优秀的前端工程师重要的一步。
我们在上一篇文章中讲到了,HTML 的标签可以分为很多种,比如 head 里面的元信息类标
签,又比如 img、video、audio 之类的替换型媒体标签。我今天要讲的标签是:语义类标签。
语义类标签是什么,使用它有什么好处?
语义类标签也是大家工作中经常会用到的一类标签,它们的特点是视觉表现上互相都差不多,
主要的区别在于它们表示了不同的语义,比如大家会经常见到的 section、nav、p,这些都是
语义类的标签。
语义是我们说话表达的意思,多数的语义实际上都是由文字来承载的。语义类标签则是纯文字
的补充,比如标题、自然段、章节、列表,这些内容都是纯文字无法表达的,我们需要依靠语
义标签代为表达。
在讲语义之前,我们来说说为什么要用语义。
现在我们很多的前端工程师写起代码来,多数都不用复杂的语义标签, 只靠 div 和 span 就能
走天下了。
这样做行不行呢?毫无疑问答案是行。那这样做好不好呢?按照正确的套路,我应该说不好,
但是在很多情况下,答案其实是好。
这是因为在现代互联网产品里,HTML 用于描述“软件界面”多过于“富文本”,而软件界面
里的东西,实际上几乎是没有语义的。比如说,我们做了一个购物车功能,我们一定要给每个
购物车里的商品套上 ul 吗?比如说,加入购物车这个按钮,我们一定要用 Button 吗?
实际上我觉得没必要,因为这个场景里面,跟文本中的列表,以及表单中的 Button,其实已
经相差很远了,所以,我支持在任何“软件界面”的场景中,直接使用 div 和 span。
不过,在很多工作场景里,语义类标签也有它们自己无可替代的优点。正确地使用语义标签可
以带来很多好处。语义类标签对开发者更为友好,使用语义类标签增强了可读性,即便是在没
有 CSS 的时候,开发者也能够清晰地看出网页的结构,也更为便于团队的开发和维护。除了
对人类友好之外,语义类标签也十分适宜机器阅读。它的文字表现力丰富,更适合搜索
引擎检索(SEO),也可以让搜索引擎爬虫更好地获取到更多有效信息,有效提升网页的搜
索量,并且语义类还可以支持读屏软件,根据文章可以自动生成目录等等。不过,不恰当地使
用语义标签,反而会造成负面作用。这里我们举一个常见的误区作为例子。我们都知道 ul 是
无序列表,ol 是有序列表,所以很多接触过语义这个概念,半懂不懂的前端工程师,特别喜欢
给所有并列关系的元素都套上 ul。实际上, ul 是长成下面的这种样子的 (以下来自 HTML 标准)。
I have lived in the following countries:
ul 多数出现正在行文中间,它的上文多数在提示:要列举某些项。但是,如果所有并列关系都
用 ul,会造成大量冗余标签。错误地使用语义标签,会给机器阅读造成混淆、增加嵌套,给
CSS 编写加重负担。所以,对于语义标签,我的态度是:“用对”比“不用”好,“不
用”比“用错”好。当然了,我觉得有理想的前端工程师还是应该去追求“用对”它们。
与 JavaScript 这样严格的编程语言相比,HTML 中语义标签的使用更接近我们平常说话用的
自然语言。我们说话并没有唯一的标准措辞,语义标签的使用也是一样。下面,我挑选了几种
(我认为)比较重要的语义标签使用场景,来为你介绍一下。
作为自然语言延伸的语义类标签其实语义问题不仅仅属于理科,它还是个文科问题。所以我们
这里讲语义标签的使用的第一个场景,也是最自然的使用场景,就是:作为自然语言和
纯文本的补充,用来表达一定的结构或者消除歧义。
我们先来看看“表达一定的结构”这个场景。在日语中,有一个语法现象叫做:ルビ,它的读
音是 ruby(著名的 ruby 语言就是据此命名的),它中文的意思大约类似于注音或者意思的注
解,它的形式可以看下图:图中的例子选自动画片《某科学的超电磁炮》第二季第一话。图中
把 teleport 放在空间移动上方的用法,就是日文中 ruby 的用法。“空间移动”是动画中白井
黑子的技能,这里动画字幕上写的是“空间移动”,动画里的台词则用了英文发
音“Teleport”,这里就形成了一个使用
ruby 的场景。ruby 的这个形式,在中国的网友中间最近被玩出了新花样,比如表情包。
有时候微信聊天,不能用 ruby 这样的东西真的是好急啊,只好用括号代替,效果真是差了不
少。在 HTML5 中,就引入了这个表示 ruby 的标签,它由 ruby、rt、rp 三个标签来实现。
所以说,这些情况里存在的语义,其实原本就存在了,只是我们用纯文字是没法表达的,
HTML作为一种“超文本”语言,支持这些文字表达就是必要的了。还有一种情况是,HTML
的有些标签实际上就是必要的,甚至必要的程度可以达到:如果没有这个标签,文字会产生歧
义的程度。
这里我们可以介绍一下 em 标签。
我们看看这句话,
1. 今天我吃了一个苹果.
再比如:
昨天我吃了一个香蕉。
今天我吃了一个苹果。
看上去它很清楚,但是实际上,这句话放到不同上下文中,可能表达完全不
同的意思。
昨天我吃了两个苹果。
今天我吃了一个苹果。
试着读一读,这两段里面的“今天我吃了一个苹果”,你是不是发现读音不自觉地发生了变化?
实际上,不仅仅是读音,这里的意思也发生了变化。前一段中,表示我今天吃的是苹果,而不是别的什么东西,后一段中,则表示我今天只吃了一个苹果,没有多吃。
当没有上下文时,如何消除歧义呢?这就要用到我们的 em 标签了。em 表示重音:
通过 em 标签,我们可以消除这样的歧义。
一些文章常常会拿 em 和 strong 做对比,实际上,我们只要理解了 em 的真正意思,它和
strong 可谓天差地别,并没有任何混淆的可能。
作为标题摘要的语义类标签
介绍完自然语言的语义场景后,我想介绍的另一个语义重要使用场景,就是文章的结构。中国古
代小说就形成了“章 - 回”的概念,西方的戏剧也有幕的区分,所以人类的自然语言作品也是如出一辙。
HTML 也应该支持这样的需求。HTML 语义标签中,有不少是用于支持这样的结构的标签。
语义化的 HTML 能够支持自动生成目录结构,HTML 标准中还专门规定了生成目录结构的算
法,即使我们并不打算深入实践语义,也应该尽量在大的层面上保证这些元素的语义化使用。
首先我们需要形成一个概念,一篇文档会有一个树形的目录结构,它由各个级别的标题组成。这
个树形结构可能不会跟 HTML 元素的嵌套关系一致。
这段 HTML 几乎是平铺的元素,但是它的标题结构是:
HTML 语义
弱语义
今天我吃了一个 <em> 苹果 </em>。
今天我吃了 <em> 一个 </em> 苹果。
例如:
.文本类属性
① 字体类型
语法:font-family:字体1,字体2,字体3...;
body{font-family: "宋体,楷书"; }
设置多个字体时,浏览器会优先识别字体1,找不到则识别字体2,都无法识别时,显示浏览器默认字体。
② 字体大小
语法:font-size:数值+单位;
p{font-size: 12px}
字体大小单位有px、em、rem、pt;浏览器默认大小为16px;字体大小一般设置为偶数值;谷歌浏览器识别最小字体为12px。
③ 字体加粗
p{font-weight: normal}
属性值:normal常规、bold加粗、bolder更粗、100-900数值
数值100-900字体加粗程度不同,其中100-500为常规字体,600-900为加粗字体。
④字体颜色
p{color: 颜色值;}
颜色值写法有三种:直接写颜色单词,如red;十六进制写法,如color:#000;rgb写法 ,color:rgb(0,0,0);
⑤字体倾斜
font-style: normal;
font-style: italic; 倾斜
⑥复合写法
font:字体大小/行高 字体类型;
font: 12px/24px "宋体"
⑦行高
语法: line-height:数值+单位;
数值不能为负值
⑧水平对齐方式
语法:text-align:left; 左对齐
text-align:center 居中
text-align:right 右对齐
text-align:justify 两端对齐,只对英文起作用
⑨文本修饰
text-decoration:none; 去掉文本修饰,可去掉超链接(对a标签使用)的下划线
text-decoration:underline; 下划线
text-decoration:overline; 上划线
text-decoration:line-through; 删除线
文本缩进
text-indent:数值+单位;
数值为正向后缩进,负值向前缩进
强制在一行显示
white-space:nowrap;
长单词换行
word-warp:break-word;
2.背景类属性
语法:background-color:颜色值;
属性值同字体颜色属性值相同用法
语法:background-image:url(图片路径);
语法:background-position:left;
水平方向:left、center、right
垂直方向:top、center、bottom
属性值为数值时,水平方向向右为正,向左为负,垂直方向向下为正,向上为负。水平和垂直方向都居中时可写background-position:center;
background-attachment:scroll;
属性值:scroll 默认值;fixed 固定
当容器出现滚动条时,背景图固定不滚动,可设置为fixed。
语法:background-repeat:repeat;
属性值:repeat平铺;no-repeat;repeat-x横向平铺;repeat-y纵向平铺。
background:背景图 背景平铺 背景位置
background:url(13211.jpg) no-repeat right bottom;
3.列表属性
语法:list-style-type:disc;
属性值:disc实心圆;circle空心圆;square实心方块;decimal数字;none去除列表符号。
4.伪类选择器
语法: 选择符:hover{属性:属性值;}
p:hover{color:red;}
超链接a标签的四个状态:
a) a:link 超链接的初始状态,链接没有被访问过时的状态
b) a:visited 链接访问过后的状态
c) a:hover 鼠标悬停在超链接上的状态(鼠标滑过)
d) a:active 超链接被激活时的状态(鼠标按下)
display -- block;(转换为块元素&& 显示) none(隐藏 && 不保留原来的位置) -- 重要!
visibility -- visible(显示) hidden (隐藏 && 保留原来的位置 )
复习:
overflow:hidden; 1.之前解决父子关系垂直嵌套的合并塌陷问题。2.清除浮动
overflow -- hidden 内容超出的部分隐藏(重点的) scroll(强制出现滚动条样式) auto(根据内容多少来判断是否出现滚动条 )
目的:为了有效地减少服务器接受和发送请求的次数,提高页面的加载速度
实现原理: 只请求一张图 --只是展示不同位置的小图。
案例使用:
background-image 背景图片
background-repeat 是否平铺
background-position 背景定位
小小注意点:
1.精灵技术主要针对背景图片,插入的img不需要这个技术
2.需要测量每个小背景图片的大小和位置
3.给盒子指定小的背景图片时,背景定位基本都是负值
##
优势:浏览器支持性比较好,灵活性大;体积小,加载速度快,节省带宽流量;减轻服务器压力。
注意:字体图标是字体 不是图片
1.把包包里面的font文件夹复制出来一份,放在我们项目根目录。
2.在html文件标签里面添加结构
3.在html文件样式style里面声明字体:告诉代码和别人使用我们自己自定义的字体(一定注意路径问题)
4.给盒子设置字体即可
原来的不能删除,继续使用,此时我们需要这样做
把压缩包里面的selection.json 从新上传,然后,选中自己想要新的图标,从新下载压缩包,替换原来文件夹即可。
重新导入selection.json 生成 新的字体包--》追加选择字体 --》点击下载 --》把之前项目中fonts删除--》替换成新的字体包里面的fonts文件夹
本质:还是利用了盒子的边框
做法:
1.宽高为 零
2.四个边都要的,只保留我们需要的边框颜色,其他的 颜色透明即可。
3.为了照顾兼容问题,设置:line-height:0; font-size:0;
三角形案例:
.demo {
position: relative;
width: 200px;
height: 100px;
background-color: pink;
}
i {
position: absolute;
top: 35px;
left: 200px;
width: 0;
height: 0;
border: 15px solid transparent;
border-left-color: hotpink;
}
<div class="demo">
<i></i>
</div>
<ul>
<li style="cursor:default;">我是默认的小白鼠标样式</li>
<li style="cursor:pointer;">我是鼠标小手样式</li>
<li style="cursor:move;">我是鼠标移动样式</li>
<li style="cursor:text;">我是鼠标文本样式</li>
<li style="cursor:not-allowed;">我是鼠标禁止样式</li>
</ul>
?
cursor:pointer; -- 记住!
cursor:move; --记住!
cursor:not-allowed; --记住!
outline: 0/ none; ----- 去掉轮廓线
resize:none;
div {
border: 2px solid red;
}
img {
/* 这个属性加给图片本身,千万不要加给图片的父级盒子 */
vertical-align: middle;
}
?
<div>
<img src="images/ldh.jpg" alt="">
</div>
1.必须强制一行显示 white-space:nowrap;
2.超出部分隐藏 overflow:hidden;
3.文字省略号代替超出的文本 text-overflow:ellipsis;
overflow: hidden;
/*文字省略号代替*/
text-overflow: ellipsis;
/* 弹性伸缩盒子模型显示 */
display: -webkit-box;
/* 限制在一个块元素显示的文本的行数 */
-webkit-line-clamp: 3;
/* 设置或检索伸缩盒对象的子元素的排列方式 */
-webkit-box-orient: vertical;
前置知识点:
relative -- 相对定位占位置
absolute --- 绝对定位不占位置
float ---- 浮动不占位置
浮动 -- 压不住下面标流的图片和文字。
text-align:center --- 给父亲元素添加,可以让子盒子(行内块/行内元素)水平居中。
*请认真填写需求信息,我们会在24小时内与您取得联系。