当前位置: 首页 > Web前端 > HTML

CSS实现自适应文字头像

时间:2023-03-28 01:38:14 HTML

欢迎来到我的公众号:前端侦探Ant-design中就有这样一个头像组件。当字符串较长时,可以根据头像的宽度自动调整字体大小。效果如下当然,这里是通过JS根据字符数自动缩放文字来实现的。现在,类似的效果只能通过CSS实现。下面我们一起来看看吧。也可以提前访问在线demo:CSSavator(runjs.work)1.CSSContainerSizeUnits要实现这个效果需要使用containersizeunits。这些单元与CSS容器查询一起出现。容器查询有以下几种类型,可以参考这篇文章:介绍2022年最受期待和官方支持的CSS容器容器查询),本文不涉及具体容器查询语句的比例cqw容器查询宽度(Container查询宽度)。1cqw等于容器宽度的1%。假设容器宽度为1000px,那么1cqw对应的计算值为10px。cqh容器查询高度(ContainerQueryHeight)的比例。1cqh等于容器高度的1%。cqi表示容器查询内联大小(ContainerQueryInline-Size)的比例。这是逻辑属性单元,默认相当于cqwcqb容器查询块级方向大小(ContainerQueryBlock-Size)的比例。同上,默认等于cqhcqmin容器查询较小尺寸(ContainerQueryMin)的比例。取cqw和cqh中较小的cqmax表示容器查询中较大尺寸(ContainerQueryMin)的比例。取cqw和cqh中的较大者。有了这些大小单位,就很容易实现文本大小随容器大小的变化。下面是一个例子大家好,欢迎关注前端神探

在没有声明容器类型的情况下,cqw相当于vw,意思是把整个页面看成一个容器。这里我们希望使用这个div作为引用对象。预先声明容器类型,如下所示。con{container-type:inline-size;}.text{font-size:10cqw;}效果如下,轻松实现文字缩放效果。原理很简单,如何应用呢?2.自适应文字头像回过头来看实际案例,如何让字体大小根据头像的宽度自适应呢?也就是说,文字越多,字体越小。一个比较简单的思路就是文字越多占的宽度越大,然后根据前面的原则,让文字大小随着宽度变化,但是这里是成反比的,宽度越宽,字体越小.假设HTML是这样的Detective
只需修改它。对齐项目:居中;证明内容:居中;宽度:40px;高度:40px;边界半径:8px;背景:素瓷;颜色:RGB(250、84、28);white-space:nowrap;}效果如下。方法是根据文本的宽度查询容器,怎么办?我的想法是创建一个相同的文本,让外部容器(A)的宽度由内部文本确定,然后将容器框(B)的宽度设置为与(A)的宽度相同,所以那容器没有完成查询?按照这个思路,HTML可以转化为这个Detective
可以通过伪元素生成外层容器A的文字。avator-inner::before{内容:attr(alt);font-size:40px;}这时候外层容器A,也就是.avator-inner的大小被伪元素::before完全展开,如下.avator-container设置为与外层容器A相同,可以采用绝对定位方式。avator-container{position:absolute;插图:0;容器类型:内联大小;文本-居中对齐;显示:弹性;证明内容:居中;align-items:center;}这样容器框可以随着伪元素的大小自动变化,然后给内部的文字设置一个合适的大小,因为是反比例的,所以可以采取方法减法,如下。avator-containerspan{font-size:calc(24px-10cqw);}效果如下,然后更改文字。文字越小,正是我们需要的效果。现在把伪元素生成的文字隐藏起来,就可以得到文章开头的效果了。以下是完整代码。avator{display:flex;对齐项目:居中;证明内容:居中;宽度:40px;高度:40px;边界半径:8px;背景:素瓷;颜色:RGB(250、84、28);空白:nowrap;}.avator-inner{位置:相对;}.avator-inner::before{内容:attr(alt);可见性:隐藏;font-size:40px;}.avator-container{position:absolute;插图:0;容器类型:内联大小;:中心;显示:弹性;证明内容:居中;align-items:center;}.avator-containerspan{字体大小:calc(24px-10cqw);溢出:隐藏;最大宽度:40px;text-overflow:ellipsis;}也可以访问在线demo:CSSavator(runjs.work)3.容器查询的一些限制虽然之前已经实现过这个效果,但是不是很优雅,主要是因为由于容器查询的诸多局限性1.首先,容器查询只对容器的子元素有效,对自身无效,导致结构有些冗余。上面的例子中,div容器中还包含了一个p元素,而文字大小是在p元素上设置好像多余,直接在div上设置可以吗?这样可以省去一层标签。答案是不!下面是直接在div上设置的效果。您可以看到文本大小取决于页面视图的宽度。所以,如果直接设置在div上,那么此时cqw所引用的容器就不再是自己了,而是继续向上查找,直到最外层,也就是说cqw查找的对象是最近的父容器元素,并且不包含自身,这个需要多加注意2.另外,容器查询框本身的大小不能由内部元素决定。为什么要在上面的示例中创建相同文本的副本?是这个原因,比如在containerbox本身没有设置width的情况下,一个正常的inline-block元素的width应该由内部文本来决定,但是设置了container之后就不行了——类型,而且根本没有宽度,这就是为什么必须通过绝对定位直接设置宽度的原因。但是道理很容易理解:假设这是真的,如果子元素的字体大小改变,容器的宽度也会改变,容器的宽度会改变字体大小。这样会造成死循环,所以这种情况是不允许的。3、最后,容器查询size对应的具体size是一个size单位,这就导致很多属性无法应用,比如scale。在上面的例子中,通过font-size改变了文字的大小。其实最好的办法就是scale,因为浏览器有最小字号限制,而scale没有这个限制,但是单位cqw不能用在scale上,有点遗憾,如果有百分比单位,当然,如果不嫌麻烦,可以使用@容器进行精准控制4.总结以上就是本文的全部内容。主要是利用容器大小单位来实现自适应文字大小的效果,总结了目前一些容器查询的局限性。下面总结一下容器大小单位是与CSS容器查询一起出现的新单位包括cqw、cqh、cqi、cqb、cqmin和cqmax。头像的宽度是固定的,不能直接根据容器的文字宽度查询。必须创建相同文本的副本才能创建容器。优雅,HTML结构比较多,主要是容器查询限制比较多。容器查询只对容器的子元素有效,对自身无效,导致结构冗余。容器查询框本身的大小无法由内部元素决定,会导致无限循环容器查询大小对应具体大小,不支持相对单位,如百分比。然而,尽管有很多限制,容器查询仍然是目前最有价值的新特性之一。很多以前需要用到的技巧和窍门可以用新的方式来实现,后面会分享。最后,如果觉得对你有好处和帮助,欢迎点赞、收藏、转发???欢迎关注我的公众号:前端大侦探