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

你不知道的CSS负值技巧和细节

时间:2023-03-30 22:49:05 CSS

写这篇文章的原因是有一天在群里,一个同学说他用负值outline-offset来实现加号的时候犯了一个错误。嗯?很好奇,我立即尝试了一下。如何使用negativeoutline-offset实现加号?使用负的outline-offset来实现加号假设我们有这样一个简单的结构:

div{width:200px;高度:200px;大纲:20px实心#000;outline-offset:10px;}修改outline-offset为合适的负值,则轮廓边框会在合适的时候缩进为加号。经过一番尝试,将上述div的outline-offset修改为-118px。div{宽度:200px;高度:200px;大纲:20px实心#000;outline-offset:-118px;}添加一个动画效果,大概是这样的:CodePenDemo--用outline实现加号很有意思,尝试了很多不同的情况,最后总结出一个简单的规则,有一些使用负的outline-offset生成加号的简单限制:容器必须是正方形轮廓边框本身的宽度不能太小outline-offset负值x的取值范围是:-(一半的containerwidth+halfoftheoutlinewidth)<偏移量-y><模糊半径>?<扩散半径>?<颜色>?]]#}以box-shadow:1px2px3px4px#333为例,4个值的含义分别是x方向的偏移值,y方向的偏移值,模糊半径,以及扩张半径。这里有个小技巧,展开半径可以为负。继续,如果阴影的模糊半径与负扩散半径重合,那么我们将看不到任何阴影,因为生成的阴影将包含在原始元素下,除非它被赋予方向偏移。所以这个时候,我们可以通过给一个方向的偏移值来实现单边投影:CodePenDemo--css单边投影使用scale(-1)实现翻转。通常,我们想要实现一个元素的180°翻转,我们会使用transform:rotate(180deg),这里有一个小技巧,使用transform:scale(-1)可以达到同样的效果。看一个演示:CSSNagativeScale(-1)

.scale{transform:scale(1);animation:scale10sinfinitelinear;}@keyframesscale{50%{transform:scale(-1);}100%{转换:比例(-1);}}看效果:(GIF中第一行是使用transform:rotate(180deg)的效果)CodePenDemo--使用scale(-1)实现元素翻转,使用negativeletter-spacing反向排列文字命令。它与上面带有负字母间距的scale(-1)具有相同的效果。letter-spacing属性定义文本的间距行为。一般来说,除了关键字normal,我们还可以指定一个size来表示文字的间距。像这样:倒序排列文本

.letter_spacing{font-size:36px;字母间距:0px;动画:无限移动10s;}@keyframes移动{40%{字母间距:36px;}80%{字母间距:-72px;}100%{字母间距:-72px;}}我们设置文本的letter-spacing从0->36px->-72px,观察不同的变化:CodePenDemo--Arrangetextinreverseorderwithnegativeletter-spacing英文或不同的字体,以及倒序,不建议使用这种方式来倒序排列文字。transition-delay和animation-delay的负值用于立即开始动画。我们知道cssanimation和transition提供了一个delay属性,可以延迟动画。考虑以下动画:简单代码如下所示:
.item{transform:rotate(0)translate(-80px,0);}.item:nth-child(1){animation:rotate3sinfinitelinear;}.item:nth-child(2){animation:rotate3sinfinite1slinear;}.item:nth-child(3){animation:rotate3sinfinite2slinear;}@keyframesrotate{100%{变换:rotate(360deg)翻译(-80px,0);}}如果我们要去掉这个延迟,我们希望在进入页面的时候,3个球同时移动。这时候只需要将正向的animation-delay改为负向即可。.item:nth-child(1){animation:rotate3sinfinitelinear;}.item:nth-child(2){animation:rotate3sinfinite-1slinear;}.item:nth-child(3){animation:rotate3sinfinite-2slinear;}这里有个小技巧,animation-dealy设置为负值的动画会立即执行,起始位置是它的其中一个动画阶段。因此,开始时的动画如下:以上面的动画为例,定义执行3s的动画,如果animation-delay为-1s,则起点相当于正常执行,在第2(3-1)次位置。CodePenDemo--使用negativeanimation-delay提前执行动画Negativemargin负边距在CSS中被广泛使用,元素的外边距可以设置为负值。在flexbox布局规范流行之前,要实现多行等高布局还是花了不少功夫。其中一种方法是使用positivepadding和negativemargin来抵消。有一个布局如下:左右两列内容不确定,即高度是未知的。但是我希望无论左边内容多还是右边内容多,两列的高度总是一样的。OK,Hack方法之一就是用一个大的正填充和相同的负边距填充左右两列:.g-left{...padding-bottom:9999px;margin-bottom:-9999px;}.g-right{...padding-bottom:9999px;margin-bottom:-9999px;}就可以了不管左右两列的高度如何变化,高度较低的那一列会随着另一列变化,具体代码可以看这里:CodePenDemo——-positivepadding和negativemarig实现多列等高布局另外还有一些比较知名的没有单独列出,比如:usenegativemarign实现元素水平和垂直居中使用负marign隐藏列表li使用负text-indent隐藏文本使用负z-index参与堆叠上下文关于排序还有一些深奥的东西。比如张新旭在今年的CSS大会上分享的,在CSS中使用negativeopacity实现伪条件判断,使用CSS自定义属性实现360°饼图使用纯CSS效果:CSS创意与视觉表现第五届CSS大会主题分享最后,CSS负值的一些使用场景虽然确实有用,但同时可能会带来代码可读性的下降。有当我看到这些代码时,我不得不小心翼翼地抚摸它们以克服我的感觉。我又叹了口气,原来如此。如果还有其他更好更容易理解的实现方式,在实现的时候要慎重权衡。好了,本文到此结束,希望对你有所帮助:)更多精彩的CSS技术文章汇总在我的Github——iCSS,持续更新中。欢迎点个星订阅收藏。有什么问题或者建议可以多交流。原创文章文笔有限,知识匮乏。如果文章中有任何不准确的地方,请告诉我。