首页 > 其他分享 >CSS 数学函数与容器查询实现不定宽文本溢出跑马灯效果

CSS 数学函数与容器查询实现不定宽文本溢出跑马灯效果

时间:2023-03-02 09:23:48浏览次数:52  
标签:容器 查询 跑马灯 宽度 文本 cqw CSS

在许久之前,曾经写过这样一篇文章 -- 不定宽溢出文本适配滚动。我们实现了这样一种效果:

  1. 文本内容不超过容器宽度,正常展示
  2. 文本内容超过容器的情况,内容可以进行跑马灯来回滚动展示

像是这样:

但是,之前的方案,有一个很明显的缺点,如果我们事先知道了容器的宽度,那么没问题,但是如果没法确定容器的宽度,也就文本宽度不确定,容器宽度也不确定的话,那么整个效果会有一点瑕疵

瑕疵在于,当时的 CSS 技术,其实没法判断当前文本内容长度是否超过了其容器宽度,导致即便文本没有没有超长,Hover 上去也会进行一个来回滚动,像是这样:

容器查询 cqw 和 CSS 数学函数 max

背景描述大概是这样,感兴趣的同学,可以简单翻看一下上午提到的文章 -- 不定宽溢出文本适配滚动

到今天,我们重新审视这个问题。看看到今天,我们可以如何更加简单便捷的解决这个问题!

首先,我们的问题其实可以抽象成:

  1. 判断文本宽度与容器宽度的大小差异,文本宽度是否大于容器宽度
  2. 如果超出,则设置来回位移动画,位移的幅度为容器宽度与文本宽度的差值

那么,我们一步一步来。

假设我们的 HTML 结构如下:

<div class="marquee">
	<span>Lorem ipsum dolor sit amet elit. Animi, aliquid.<span>
</div>

其中,div 为容器,span 为文本内容。同时,我们利用容器查询,设置父容器 marquee 为容器查询的容器,并且将基于容器的inline-size 维度。

.marquee {
	white-space: nowrap;
	container-type: inline-size;
}

继续,我们如何能够在 span 中得知,当前 span 的内容长度与父容器宽度谁比较大呢?

在之前,这是很难办到的,但是现在,我们有了 容器查询 后,可以靠容器查询单位 cqw 完成。

首先,什么是容器查询?容器查询它给予了 CSS,在不改变浏览器视口宽度的前提下,只是根据容器的宽度变化,对布局做成调整的能力。

对容器查询想了解更多的,可以戳:新时代布局新特性 -- 容器查询

容器查询带来了很多新的单位,其中有:

  • cqw 容器查询宽度(Container Query Width)占比。1cqw 等于容器宽度的 1%。假设容器宽度是 1000px,则此时 1cqw 对应的计算值就是 10px。
  • cqh 容器查询高度(Container Query Height)占比。1cqh 等于容器高度的 1%。
  • cqi 表示容器查询内联方向尺寸(Container Query Inline-Size)占比。这个是逻辑属性单位,默认情况下等同于 cqw
  • cqb 容器查询块级方向尺寸(Container Query Block-Size)占比。同上,默认情况下等同于 cqh
  • cqmin 容器查询较小尺寸的(Container Query Min)占比。取 cqw 和 cqh 中较小的一个
  • cqmax 表示容器查询较大尺寸的(Container Query Min)占比。取 cqw 和 cqh 中较大的一个

本文,我们会运用到其中的 cqw,1cqw 等于容器宽度的 1%。那么,当前容器的宽度,其实就是 100 cqw。

那么:

  1. width: 100% ,对于 span 行内元素而言,其文本长度就是其整个的宽度,100% 代表的就是文本内容的长度
  2. width: 100cqw 表示的是设置了容器查询的 .marquee 的宽度(也就是父容器的宽度)

OK,有了 100%100cqw 怎么比较他们谁大谁小呢?其实我们的关键不是谁大谁小,而是:

  1. 如果当前容器的宽度(也就是文本宽度)大于父容器宽度,需要得到一个动画位置值
  2. 如果当前容器的宽度(也就是文本宽度)小于父容器宽度,无需动画,也就是动画位移值为 0

那么,我们的核心就变成了,0 与两个宽度差值的比较。刚好,CSS 中提供了比较大小数学函数 max()min()

关于 CSS 数学函数,你可以参考我的这篇文章 -- 现代 CSS 解决方案:CSS 数学函数

铺垫了这么久,最终,我们得到最为核心的一行代码:

max(100% - 100cqw, 0px)

当然,换一种思维,使用 min() 也是可以的:

min(100cqw - 100%, 0px)

如果 span 内容长度,大于容器宽度,也就是 100% - 100cqw 大于 0px,那么其实也就得到了跑马灯效果应该位移的距离。

我们顺便也就将整个效果的代码写完了,完整的代码:

.marquee {
	overflow: hidden;
	white-space: nowrap;
	width: 200px;
	resize: horizontal;
	container-type: inline-size;
}
.marquee span {
      animation: marquee 3s linear infinite both alternate;
}
@keyframes marquee {
	to {
		transform: translateX(min(100cqw - 100%, 0px));
	}
}

效果如下:

这样,到今天,我们可以轻易的实现:

  1. 文本内容不超过容器宽度,正常展示
  2. 文本内容超过容器的情况,内容可以进行跑马灯来回滚动展示

也就是如下的效果:

完整的代码,你可以戳这里:Pure CSS Marquee

当然,硬要说的话,本方案还是存在一个缺陷,就是动画的时长是固定的,没法根据内容的长短响应式的进行适配。可能更适合文本内容相差不大的场景使用。

最后

本案例 DEMO 由日服第一切图仔佐子哥倾情贡献。好了,本文到此结束,希望本文对你有所帮助

标签:容器,查询,跑马灯,宽度,文本,cqw,CSS
From: https://www.cnblogs.com/coco1s/p/17170627.html

相关文章

  • R语言自然语言处理NLP:情感分析上市公司文本信息知识发现可视化
    全文链接:http://tecdat.cn/?p=31702原文出处:拓端数据部落公众号情感分析,就是根据一段文本,分析其表达情感的技术。比较简单的情感分析,能够辨别文本内容是积极的还是消极的......
  • CSS全局关键字
    css的全局关键字有下面几个:inherit:继承父级属性initial:将元素初始化成css的初始值unset:继承和初始化元素revert:还原到浏览器内置样式all:代指所有css属性下面分......
  • 路飞:路飞前端全局css,全局配置文件、配置axios实现前后台交互、安装vue-cookies、安装e
    目录一、路飞前端全局css,全局配置文件1.1整理项目1.2设置全局css1.3配置全局js二、配置axios实现前后台交互三、安装vue-cookies四、安装elementui五、安装bootstrap和j......
  • 使用 CSS 替换表行颜色?
    我正在使用一个带有交替行颜色的表格。tr.d0td{background-color:#CC9999;color:black;}tr.d1td{background-color:#9999CC;color:black;}<table><trclas......
  • css中的counter计数器
    作为程序猿,代码比什么都有说服力,嗯,所以废话不多说,直接看吧,认真看完了,就一定有收获(内容有点多,需要一点耐心哦,我是一点一点写的,咱也一点一点看呗)counter:是css计数器,只能跟co......
  • CSS 列表
     CSS列表属性作用如下:设置不同的列表项标记为有序列表设置不同的列表项标记为无序列表设置列表项标记为图像列表在HTML中,有两种类型的列表:无序列表 ul -......
  • CSS 表格
     使用CSS可以使HTML表格更美观。CompanyContactCountryAlfredsFutterkisteMariaAndersGermanyBerglundssnabbköpChristinaBerglundSwedenCentr......
  • HTML页面自动清理js、css文件的缓存(自动添加版本号)
    在web项目开发过程中,我们经常会引用css、js文件,更新文件后常出现缓存问题(明明更改了代码,在浏览器上访问的时候却没有发生变化),这种情况我们通常采用以下两种解决方案:1、手......
  • css基础
    CSS导入方式 这种方式会导致CSS和HTML的耦合度高,不利于维护<style>标签在head,而不是body,如图,其中div是选择器,表示应用在<div>上,类似的有<span>等等可以在外部......
  • CSS:整个网页变灰色
    方法一html{filter:grayscale(100%);-webkit-filter:grayscale(100%);-moz-filter:grayscale(100%);-ms-filter:grayscale(100%);-o-filte......