SS有很多用于格式化文本的属性。比如,文本的颜色、大小写转化、对齐方式、文本间距、文本装饰等等。(此时会同时演示几个案例)
首先,我们来介绍 CSS 如何为文本添加颜色。
通过声明 color 属性 来设置文本的颜色,值可以是颜色名称、十六进制颜色值、RGB颜色值。(此处用代码来演示)
这几个颜色值是不是感觉很熟悉?没错,我们在前面给HTML元素定义过color属性,值就是这三个。你还记得在哪一节讲过吗?可以弹幕告诉大家!
我们来做个例子。
打开编辑器,创建一个 005-css-text 文件夹,在文件夹里创建一个 text.html 文件,创建基础代码,添加 h1 元素,填入一些文本。再添加一个 p 标签,填入一些文本。
再创建一个 mystyle-1.css 文件,定义 body 元素选择器,声明样式 color: blue。在页面里引用它,路径为当前目录下的 mystyle-1.css 文。./mystyle-1.css)。
<!DOCTYPE html>
<html>
<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>CSS Text</title>
<link rel="stylesheet" href="./mystyle-1.css">
</head>
<body>
<h1>浠浠呀老师,学前端的大专生就业难吗?</h1>
<p>
不难,只要你能力过关、项目经验过关、人品过关,企业就会录用你。你可以在面试的时候,着重介绍一下你的开发能力、技术能力以及你对技术理解,让别人挑不出毛病,那学历这块是可以自动忽略的。我在面试别人的时候也是这样,如果这个人的技术能力和过往经验真的征服了我,我不是很在他乎他的学历。
</p>
</body>
</html>
这里说明一下:一个页面的默认文本颜色是在 body 选择器中定义的。
body {
/* 一个页面的默认文本颜色是在body选择器中定义的。 */
color: blue;
}
细心的小伙伴发现了,这里添加的是注释吗?没错,和 html 注释一样,它是用来解释CSS 代码的,浏览器会忽略注释。CSS注释以 /* (读作:斜杠 星号) 开始,以 */ (读作:星号 斜杠)结束,里面编写注释内容。注释一般放到一组样式定义的前面,或者放在单个样式声明的后面,中间可以换行。
在浏览器里查看页面效果,文本全部为蓝色。
在 mystyle-1.css 里再定义一个 h1 选择器,声明样式 color: green。
再来看效果,标题变为了绿色,段落还是蓝色。
接下来,我们介绍 CSS 如何强制转换文本中,单词和字母的大写和小写。
使用 text-transform 属性来实现这个功能,它的值有三个:
uppercase:文本被转换为大写。
lower case:文本被转换为小写。
capitalize [ˈkæpɪtəlaɪz]:每个单词的首字母被转换为大写。
这个属性主要用来设置英文的文本,对中文无效。
回到编辑器,我们再创建一个段落,填入答案的英文版。
<body>
<h1>浠浠呀老师,学前端的大专生就业难吗?</h1>
<p>
不难,只要你能力过关、项目经验过关、人品过关,企业就会录用你。你可以在面试的时候,着重介绍一下你的开发能力、技术能力以及你对技术理解,让别人挑不出毛病,那学历这块是可以自动忽略的。我在面试别人的时候也是这样,如果这个人的技术能力和过往经验真的征服了我,我不是很在他乎他的学历。
</p>
<p>
It's not difficult, as long as you are competent, have project experience and are a good person, companies will hire you. You can focus on your development skills, technical skills and your understanding of technology during the interview so that no one can pick a fault, then the education piece can be automatically ignored. I do the same thing when interviewing people, if the person's technical skills and past experience really conquered me, I am not very in him about his education.
</p>
</body>
给这个段落定义 class 属性,值为 transform。
在样式中,定义 p.transform 选择器,声明样式属性text-transform ,值为 uppercase。
返回浏览器,全部的英文为大写字母。
修改 text-transform 的属性值为 lowercase。全部的英文为小写字母。
修改 text-transform 的属性值为 capitalize。全部单词的首字母大写。
有关 CSS 如何给文本添加颜色,以及转换文本的大小写,就介绍完了。
文章配套视频链接:https://www.bilibili.com/video/BV1oU4y1278g?p=61
代CSS强大的令人难以置信。
这次我们来用 CSS 实现这样一个功能:有多个宽度不同的标签水平排列,当外层宽度不足时,会提示超出的数量,演示效果如下
如果让我用 JavaScript来实现估计都有点折腾,毕竟宽度都是动态的,要监听各部分的尺寸变化,包括标签的位置和外层的宽度,总之不是一两行代码就能搞定的。
现如今,纯CSS也能完美的实现这样的效果,而且比 JS 实现更加简单,一起来看看吧
很多时候,CSS并没有直接的实现方式,需要“绕”点弯路,将需求拆分成很多小点,然后逐一突破。
回到本文这里,其实有几个问题需要考虑:
关于第3点,其实在之前这篇文章中有详细介绍,有兴趣可以回顾一下,非常有意思
纯 CSS 检测文本是否溢出
那么第一点,CSS有没有什么方式可以统计数量呢?
没错,相信很多小伙伴已经猜到了,就是利用 CSS计数器,示意如下
counter-reset: num var(--num);
counter-increment: num;
::after{
content: "+"counter(num);
}
关于计数器,我之前也在很多文章中有用到
你可能不需要 JS!CSS实现一个计时器
如何让CSS计数器支持小数的动态变化?
还在使用定时器吗?CSS 也能实现电子时钟
动画合成小技巧!CSS 实现动感的倒计时效果
自定义计数器小技巧!CSS 实现长按点赞累积动画
然后是第二点,CSS有什么方式可以知道元素是出去了还是在视野之内呢?
如果是用 JS来判断的话,最稳妥的方式应该Intersection Observer(交叉观察者),相信很多同学都用过,这个在图片懒加载非常有用
交叉观察器 API - Web API 接口参考 | MDN (mozilla.org)[1]
那么,CSS中有什么类似的呢?没错,还是之前提到过的CSS滚动驱动动画。
不过这里用到的是视图进度,也就是关注的是元素自身位置,元素进入到容器范围之内就会触发动画,非常类似 JS中的Intersection Observer
tag{
animation: appear;
animation-timeline: view(inline);
animation-range: contain;
}
@keyframes appear{
to {
background-color: #9747FF;
}
}
这里就不详细介绍了,有兴趣回顾之前这篇文章
CSS 滚动驱动动画终于正式支持了~
好了,关键原理就这些了,我们需要做的就是想办法将「计数器」和「元素进出容器范围」关联起来就行了,接着往下看
利用 CSS 计数器,我们可以很轻松的统计元素的数量。
先简单布局一下文章开头的例子,HTML如下所示
<div class="con">
<a class="tag">HTML</a>
<a class="tag">CSS</a>
<a class="tag">JavaScript</a>
<a class="tag">Flutter</a>
<a class="tag">Vue</a>
<a class="tag">React</a>
<a class="tag">Svelte</a>
</div>
<span class="num"></span><!--用来计数的标签-->
然后美化一下
.con{
display: flex;
gap: 5px;
padding: 5px;
overflow: hidden;
}
.tag{
padding: .2em .5em;
background-color: #c49ef5;
color: #fff;
border-radius: 4px;
animation: appear;
}
.num::after{
content: "+0";
padding: .2em .5em;
background-color: #FFE8A3;
color: #191919;
border-radius: 4px;
}
这样就得到了水平排列的 tag 布局(超出隐藏),后面跟一个数字
现在我们定义一个计数器,然后通过每个tag进行累计,有多个tag相当于多少次累加,最后在::after中显示出来
.con{
counter-reset: num; /*计数器初始值,默认为0*/
}
.tag{
counter-increment: num; /*计数器增量值,默认为1*/
}
.num::after{
content: "+"counter(num);
}
默认计数器的起始值是 0,每次累计是1,所以这里最后得到了7,这样就能实时统计元素的数量了
当然,我们也可以自定义这些默认值,比如
.con{
counter-reset: num 10;
}
.tag{
counter-increment: num -1;
}
这种情况下,起始值是10,增量值是-1,所以最后得到了3,如下
那么,该如何统计容器之外的标签数量呢?
这里我们要利用CSS 视图进度时间轴,也就是观察元素自身的位置,在进入到容器范围之内执行动画。
拿上面这个例子,我们给标签添加一个动画,让标签在进入到容器之内时变个颜色,实现如下
.tag{
animation: appear;
animation-timeline: view(inline);
}
@keyframes appear{
to {
background-color: #4d47ff;
}
}
由于是水平方向,所以这里需要设置view(inline) ,效果如下
好像不是很明显?这是因为动画是在整个视区内过渡的,我们可以改变动画时间线的区间animation-range,让这个动画在进出的一瞬间就变化
.tag{
animation: appear;
animation-timeline: view(inline);
animation-range: contain;
}
@keyframes appear{
from,to {
background-color: #4d47ff;
}
}
效果如下
那么,这个效果和前面的计数器有什么关联呢?
从效果上来看,在视区内会执行一个动画,如果在这个动画中加入计数器的累加会怎么样呢?先去除原先的累加器
.tag{
/* counter-increment: num; */
}
@keyframes appear{
from,to {
background-color: #4d47ff;
counter-increment: num;
}
}
效果如下
可以看到计数器已经生效了,不过现在统计的在「可视区内」标签的数量。而我们要统计的是「可视区外」的数量,好像反过来了,如何实现呢?
这里有两种思路。
第一种,用总数减去可视区内的数量,不就行了吗?由于现在动画是针对可视区内的,我们可以给计数器设置一个初始值,就是总量,然后动画中给累加值设置为-1,就相当于减去当前数量了,实现如下
.con{
counter-reset: num 7;
}
@keyframes appear{
from,to {
background-color: #4d47ff;
counter-increment: num -1;
}
}
这样就完美统计出了可视区外的数量了
还有一种方式,我觉得更加巧妙,需要反向思考。原理是重置当前的累加值,比如默认情况下,正常累加,进入可视范围,把累加值设置为0,不就相当于可视区外的正常累加了吗?
.tag{
counter-increment: num;
}
@keyframes appear{
from,to {
background-color: #4d47ff;
counter-increment: num 0;
}
}
同样能达到相同的效果
现在基本已经达到我们需要的效果了
首先是,在超出范围时,需要在边缘出添加一个半透明蒙层,这样体验效果会更好。
半透明蒙层很好实现,只需要添加一个水平渐变的mask遮罩就行了
.con{
-webkit-mask: linear-gradient(to right, #fff calc(100% - 30px), transparent);
}
效果如下
那么,如何在没有超出时,不出现这个遮罩呢?
这个其实在之前的文章中有详细介绍了,建议回顾一下
纯 CSS 检测文本是否溢出
利用CSS滚动驱动动画,可以检测容器是否可滚动,也就是是否超出。所以我们只需要将遮罩放在滚动驱动动画里就行了,关键实现如下
.con{
animation: check;
animation-timeline: scroll(x self);
}
@keyframes check{
from,to {
-webkit-mask: linear-gradient(to right, #fff calc(100% - 30px), transparent);
}
}
效果如下
还有一个问题,希望在没有超出的时候不显示后面的数量。
关于这个,我本来是打算用样式查询来实现,但是遇到了一个问题,由于样式查询只能匹配到子元素,所以不得不将显示数量的标签放到.con容器内。但是这样一来,mask遮罩就会出现问题,就像这样
遮罩层连同数量标签一起被裁剪了!
于是又想出了另一种方案,这个在以前的布局中其实用到的更多,那就是负margin。
实现很简单,给标签容器一个的负margin-right,这样,右边的数量就会被左边的标签盖住,比如
.con{
margin-right: -20px;
}
效果如下
是不是已经被盖住一部分了?我们继续向左偏移
.con{
margin-right: -50px;
}
这样就完全看不到右边的数量了
那么,如何在超出时显示数量呢?这里就体现出负margin的好处了,可以借助前一个元素来隐藏后一个元素,在这里,我们直接在前面的动画中还原margin就行了
.con{
animation: check;
animation-timeline: scroll(x self);
}
@keyframes check{
from,to {
-webkit-mask: linear-gradient(to right, #fff calc(100% - 30px), transparent);
margin-right: 0;
}
}
这样就完美实现了文章开头所示效果了
你也可以访问以下链接来体验真实效果(Chrome115+)
以上就是本文的全部内容了,不知道你学会了吗?下面总结一下实现重点:
[1]交叉观察器 API - Web API 接口参考 | MDN (mozilla.org): https://developer.mozilla.org/zh-CN/docs/Web/API/Intersection_Observer_API
[2]CSS auto tag num (juejin.cn): https://code.juejin.cn/pen/7352565668073439241
[3]CSS auto tag num (codepen.io): https://codepen.io/xboxyan/pen/rNbYpZV
作者:XboxYan
来源-微信公众号:前端侦探
出处:https://mp.weixin.qq.com/s/_m5UxLQQtDU1GxbLRnCUhQ
font-size:设置字体大小:
该属性值的单位可以使用相对单位和绝对单位,推荐使用px。(浏览器能够识别的最小像素是12px)
p{
font-size:20px;
}
常见尺寸单位:
font-family:设置字体:
如果需要设置多个字体样式,则属性值可以写多个中间用逗号隔开即可,需要知道的是浏览器会从第一个字体属性值找,直到找到自己设备有的字体显示,自己设备没有的字体,按设备默认字体显示,推荐系统默认字体。
p{
font-family:"微软雅黑",Arial;
}
font-weight:设置字体粗细:
其属性值有:normal正常不加粗、bold加粗、bolder更粗、lighter更细、number(整百的数字)、inherit继承父级元素字体粗细
p {
font-weight:700;
}
font-style:设置字体风格:
如设置斜体、倾斜或正常字体,其属性值:normal默认值,标准字体、italic斜体、oblique倾斜
font:综合设置字体样式(字体样式连写):
字体样式连写是有顺序的,必须是严格遵循顺序,其中不需要设置的属性可以省略,font-size和font-family属性值必须写,否则字体连写失效。
p{
/*font:font-style font-weight font-size/line-height font-family;*/
font:italic bolder 20px/10px Arial;
}
提示:本文图片等素材来源于网络,若有侵权,请发邮件至邮箱:810665436@qq.com联系笔者 删除。
笔者:苦海123
其它问题可通过以下方式联系本人咨询:
QQ:810665436
微信:ConstancyMan
*请认真填写需求信息,我们会在24小时内与您取得联系。