整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

重学前端基础: HTML语义:div和span不是够

重学前端基础: HTML语义:div和span不是够用了吗?

天这篇是我们正式开篇的第一篇文章,我想和你聊聊 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:

  • Switzerland
  • Norway
  • United Kingdom
  • United States

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文件夹

css三角形

本质:还是利用了盒子的边框

做法:

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;

vertical-align 垂直对齐方式

  • 如果让单行文本垂直居中 -- 使用line-height,如果处理图片和文本的垂直对齐方式,line-height=高 不可以实现!
  • 注意:只针对行内元素和 行内块起作用。
  • 通常用于 -- 图片和文本对齐问题和去除图片底部空白缝隙问题。
  • 去除图片底部空白让图片白不要和 基线对齐 --- vertical-align:top middle bottom转换为块元素 -- display:block;
    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;

margin负值运用(练习!)

前置知识点:

relative -- 相对定位占位置

absolute --- 绝对定位不占位置

float ---- 浮动不占位置

文字环绕效果

浮动 -- 压不住下面标流的图片和文字。

行内块可以单独设置宽高一排显示

text-align:center --- 给父亲元素添加,可以让子盒子(行内块/行内元素)水平居中。

京东三角形巧妙运用