We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
在许久之前,曾经写过这样一篇文章 -- 不定宽溢出文本适配滚动。我们实现了这样一种效果:
像是这样:
但是,之前的方案,有一个很明显的缺点,如果我们事先知道了容器的宽度,那么没问题,但是如果没法确定容器的宽度,也就文本宽度不确定,容器宽度也不确定的话,那么整个效果会有一点瑕疵。
瑕疵在于,当时的 CSS 技术,其实没法判断当前文本内容长度是否超过了其容器宽度,导致即便文本没有没有超长,Hover 上去也会进行一个来回滚动,像是这样:
背景描述大概是这样,感兴趣的同学,可以简单翻看一下上午提到的文章 -- 不定宽溢出文本适配滚动。
到今天,我们重新审视这个问题。看看到今天,我们可以如何更加简单便捷的解决这个问题!
首先,我们的问题其实可以抽象成:
那么,我们一步一步来。
假设我们的 HTML 结构如下:
<div class="marquee"> <span>Lorem ipsum dolor sit amet elit. Animi, aliquid.<span> </div>
其中,div 为容器,span 为文本内容。同时,我们利用容器查询,设置父容器 marquee 为容器查询的容器,并且将基于容器的inline-size 维度。
marquee
inline-size
.marquee { white-space: nowrap; container-type: inline-size; }
继续,我们如何能够在 span 中得知,当前 span 的内容长度与父容器宽度谁比较大呢?
在之前,这是很难办到的,但是现在,我们有了 容器查询 后,可以靠容器查询单位 cqw 完成。
首先,什么是容器查询?容器查询它给予了 CSS,在不改变浏览器视口宽度的前提下,只是根据容器的宽度变化,对布局做成调整的能力。
对容器查询想了解更多的,可以戳:新时代布局新特性 -- 容器查询
容器查询带来了很多新的单位,其中有:
本文,我们会运用到其中的 cqw,1cqw 等于容器宽度的 1%。那么,当前容器的宽度,其实就是 100 cqw。
那么:
width: 100%
width: 100cqw
.marquee
OK,有了 100% 和 100cqw 怎么比较他们谁大谁小呢?其实我们的关键不是谁大谁小,而是:
100%
100cqw
那么,我们的核心就变成了,0 与两个宽度差值的比较。刚好,CSS 中提供了比较大小数学函数 max() 和 min()。
max()
min()
关于 CSS 数学函数,你可以参考我的这篇文章 -- 现代 CSS 解决方案:CSS 数学函数
铺垫了这么久,最终,我们得到最为核心的一行代码:
max(100% - 100cqw, 0px)
当然,换一种思维,使用 min() 也是可以的:
min(100cqw - 100%, 0px)
如果 span 内容长度,大于容器宽度,也就是 100% - 100cqw 大于 0px,那么其实也就得到了跑马灯效果应该位移的距离。
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)); } }
效果如下:
这样,到今天,我们可以轻易的实现:
也就是如下的效果:
完整的代码,你可以戳这里:Pure CSS Marquee
当然,硬要说的话,本方案还是存在一个缺陷,就是动画的时长是固定的,没法根据内容的长短响应式的进行适配。可能更适合文本内容相差不大的场景使用。
本案例 DEMO 由日服第一切图仔佐子哥倾情贡献。
好了,本文到此结束,希望本文对你有所帮助 :)
想 Get 到最有意思的 CSS 资讯,千万不要错过我的公众号 -- iCSS前端趣闻 😄
更多精彩 CSS 技术文章汇总在我的 Github -- iCSS ,持续更新,欢迎点个 star 订阅收藏。
如果还有什么疑问或者建议,可以多多交流,原创文章,文笔有限,才疏学浅,文中若有不正之处,万望告知。
The text was updated successfully, but these errors were encountered:
这里就个问题,如果我内容增加了,播放动画时长还是n秒走位 ,随着内容增多,动画会越来越快
Sorry, something went wrong.
O,是的是的,还是存在这个问题,动画的时长是固定的,没法根据内容的长短响应式的进行适配。可能更适合文本内容相差不大的场景使用。
No branches or pull requests
在许久之前,曾经写过这样一篇文章 -- 不定宽溢出文本适配滚动。我们实现了这样一种效果:
像是这样:
但是,之前的方案,有一个很明显的缺点,如果我们事先知道了容器的宽度,那么没问题,但是如果没法确定容器的宽度,也就文本宽度不确定,容器宽度也不确定的话,那么整个效果会有一点瑕疵。
瑕疵在于,当时的 CSS 技术,其实没法判断当前文本内容长度是否超过了其容器宽度,导致即便文本没有没有超长,Hover 上去也会进行一个来回滚动,像是这样:
容器查询 cqw 和 CSS 数学函数 max
背景描述大概是这样,感兴趣的同学,可以简单翻看一下上午提到的文章 -- 不定宽溢出文本适配滚动。
到今天,我们重新审视这个问题。看看到今天,我们可以如何更加简单便捷的解决这个问题!
首先,我们的问题其实可以抽象成:
那么,我们一步一步来。
假设我们的 HTML 结构如下:
其中,div 为容器,span 为文本内容。同时,我们利用容器查询,设置父容器
marquee
为容器查询的容器,并且将基于容器的inline-size
维度。继续,我们如何能够在 span 中得知,当前 span 的内容长度与父容器宽度谁比较大呢?
在之前,这是很难办到的,但是现在,我们有了 容器查询 后,可以靠容器查询单位 cqw 完成。
首先,什么是容器查询?容器查询它给予了 CSS,在不改变浏览器视口宽度的前提下,只是根据容器的宽度变化,对布局做成调整的能力。
容器查询带来了很多新的单位,其中有:
本文,我们会运用到其中的 cqw,1cqw 等于容器宽度的 1%。那么,当前容器的宽度,其实就是 100 cqw。
那么:
width: 100%
,对于 span 行内元素而言,其文本长度就是其整个的宽度,100% 代表的就是文本内容的长度width: 100cqw
表示的是设置了容器查询的.marquee
的宽度(也就是父容器的宽度)OK,有了
100%
和100cqw
怎么比较他们谁大谁小呢?其实我们的关键不是谁大谁小,而是:那么,我们的核心就变成了,0 与两个宽度差值的比较。刚好,CSS 中提供了比较大小数学函数
max()
和min()
。铺垫了这么久,最终,我们得到最为核心的一行代码:
当然,换一种思维,使用
min()
也是可以的:如果 span 内容长度,大于容器宽度,也就是
100% - 100cqw
大于0px
,那么其实也就得到了跑马灯效果应该位移的距离。我们顺便也就将整个效果的代码写完了,完整的代码:
效果如下:
这样,到今天,我们可以轻易的实现:
也就是如下的效果:
完整的代码,你可以戳这里:Pure CSS Marquee
当然,硬要说的话,本方案还是存在一个缺陷,就是动画的时长是固定的,没法根据内容的长短响应式的进行适配。可能更适合文本内容相差不大的场景使用。
最后
本案例 DEMO 由日服第一切图仔佐子哥倾情贡献。
好了,本文到此结束,希望本文对你有所帮助 :)
想 Get 到最有意思的 CSS 资讯,千万不要错过我的公众号 -- iCSS前端趣闻 😄
更多精彩 CSS 技术文章汇总在我的 Github -- iCSS ,持续更新,欢迎点个 star 订阅收藏。
如果还有什么疑问或者建议,可以多多交流,原创文章,文笔有限,才疏学浅,文中若有不正之处,万望告知。
The text was updated successfully, but these errors were encountered: