当前位置: 首页 > 科技观察

transform被占用引起的思考

时间:2023-03-16 16:55:17 科技观察

1.transform容易被占用众所周知,CSS中的transform是一个包含很多值的属性,例如:div{transform:translate(-50%,-50%)scale(1.5)}不过这不是简写,而是应该这样写,跟背景不一样。div{background:url('1xxx')10px10px/20px20px不重复;}/*相当于下面的写法*/div{background-image:url('1xxx');背景位置:10px10px;背景尺寸:20px20px;background-repeat:no-repeat;}分开写的好处是如果只需要改某个部分,很容易覆盖。div.div1{背景图片:url('2xxx');/*只改图片,不改其他的*/}回到前面,如果要改transform的某个部分,不好,必须把没改的部分也写一遍,变化的部分不能提取为公共样式。div.scale{transform:scale(2)/*这样不行,translate会丢失*/}/*必须完整*/div.scale{transform:translate(-50%,-50%)scale(2)}那么如何巧妙地解决这个问题呢?二、目前的几种思路1、用其他方法代替transform遇到这种情况,第一感觉可能是舍弃原来的transform属性,换成其他方法。比如translate(-50%,-50%)一般用来实现元素居中的效果,可以通过flex等其他方式实现。.parent{display:flex}div{margin:auto;/*Centerthroughmargin:auto*/}比如translate(10px,10px)的偏移可以通过left或者margin-left来实现。div{位置:相对;左:10px;top:10px;}或者干脆再包裹一层parent也可以避免transform被占用的问题。

不过这些方法都是翻墙方法,官方其实也有解决办法。2.transform的单独赋值前面说了,transform不是简写属性,所以没有办法像background这样给某个部分赋值。为了解决这个问题,从Chrome104开始,浏览器终于??正式支持单独赋值。有兴趣的可以参考这篇文章:解放生产力!transform支持单独的分配更改[1]。拿前面的例子来说:div{transform:translate(-50%,-50%)scale(1.5)}可以写成。div{翻译:-50%-50%;scale:1.5}这样,如果需要改变某个部分,只需要像普通属性一样覆盖即可。div.scale{scale:2}不过目前兼容性不好,慎用!(适合内部项目的尝鲜者)。3.借助CSS变量拆分属性前面transform的单独赋值是好的,但是太新了,不能马上在项目中使用。下面介绍一种兼容性更好、使用更放心的方案。还是上面的例子:div{transform:translate(-50%,-50%)scale(1.5)}splittransformthroughCSSvariables;div{--翻译:-50%,-50%;--规模:1.5;transform:translate(var(--translate))scale(var(--scale))}这样拆分之后,CSS变量就变成了独立的属性。如果需要覆盖,只需要修改其中一个即可。不需要关注--translate是什么样子的,这样改的部分可以单独作为publicstyle使用,如下:.div1{--translate:-50%,-50%;}.div1{--translate:10px,10px;}div.scale{--scale:2;/*不需要关注其他transforms,可以作为publicstyle使用*/}是不是很清楚了?以下是演示demo;[type="checkbox"]:checked+div{--scale:1.5}效果如下:完整代码可在以下任一链接查看:CSStransform(codepen.io)[2]CSStransform-关于代码掘金(juejin.cn)[3]CSS变换(runjs.work)[4]四、使用@property实现转场动画上面的实现看似完美,但是还是有问题,比如加个动画。由于拆分成css变量写法,所以动画的变化对象也变成css自定义属性(--scale),如下:div{/**/animation:scale1sinfinitelinearalternate;}@keyframesscale{from{--scale:1}到{--scale:1.5}}实际效果是这样的:运动在动,但是没有过渡,太生硬了,怎么解决呢?这需要使用@property[5],它是做什么用的?简而言之,您可以自定义属性以允许自定义变量像颜色一样进行过渡和动画处理。换句话说,现在执行动画的是--scale属性,而不是变换。因此,要实现转场动画,只需要通过@property定义这个自定义属性即可,如下:@property--scale{syntax:'';继承:假的;initial-value:1;}effect下面和传统实现一样,但是代码更优雅。完整代码可以在以下任一链接查看:CSStransform@property(codepen.io)[6]CSStransform@property-代码掘金(juejin.cn)[7]CSStransform@property(runjs.work)[8]5,不只是下面的变换来扩展和打开你的格局。除了转换之外,还有许多其他复杂的CSS属性。如果现阶段不分离,这种传递CSS变量的方式就完美了,比如filter。el{filter:brightness(0.4)invert(75%)grayscale(50%);}由CSS变量分隔;el{--亮度:0.4;--反转:75%;--灰度:50%;filter:brightness(0.4)invert(75%)grayscale(50%);}这样在做一些图像调整的时候,可以直接用一个单独的变量来控制,比如keynote。再比如rgb颜色值,写成一个变量就很难控制,拆分成三个变量就容易多了。el{--r:255;--克:255;--b:255;color:rgb(var(--r),var(--g),var(--b));}这样做一些颜色调整在交互的时候很方便,在keynote中还是有例子。还有一些属性是可以无限叠加的,比如background-image,是的,又是这个,可以说是相当复杂了,当背景有多层的时候,背景又是一个长长的base64,就变成了像这。el{background-image:url("data:image/svg+xml,%3Csvgxmlns='http://www.w3.org/2000/svg'viewBox='00512512'%3E%3Cpathd='M2568C119881198256S111248248248248-111248-248S39382568ZM0448C-110.50-200-89.5-200-200-200-200-200S145.55625625625656S200-67c-10.70-1612.9-8.520.5l9999c4.74.712.34.7170l99-99c7.6-7.62.2-20.5-8.5-20.5h-67V140c0-6.6-5.4-12-12-12h-40c-6.60-125.4-1212z'%3E%3C/path%3E%3C/svg%3E"),url("data:image/svg+xml,%3Csvgxmlns='http://www.w3.org/2000/svg'viewBox='00512512'%3E%3Cpathd='M2568C119881198256s111248248248248-111248-248S39382568zm0448c-110.50-250-89200S145.55625656S20089.5200-200200-89.5200-200-200zm-32-316v116h-67c-10.70-1612.9-8.520.5L99999999999999C4.74.74.712.34.712.34.717170L99-99-99-99-99c7.6-7.6-7.6-7.6-7.62.2-2-2-2-2-2-2-2-2-2-2-2-2-5-5-5-5-20.5h-67V140c0-6.6-5.4-12-12-12h-40c-6.60-125.4-1212z'%3E%3C/路径%3E%3C/svg%3E"),url("data:image/svg+xml,%3Csvgxmlns='http://www.w3.org/2000/svg'viewBox='00512512'%3E%3Cpathd='M2568C119881198256s111248248248248-111248-248S39382568zm0448c-110.50-200-104.2055.5-20556s20089.5200200-89.5200-200200zm-32-316v116h-67c-10.70-1612.9-8.520.5l9999c4.74.712.34.7170569-20h7.28-2.46-7-516-67-6712h-40c-6.60-125.4-1212z'%3E%3C/path%3E%3C/svg%3E")}这样一段css就像是乱码,很不利于阅读,而且它很难分清哪个是哪个,此时可以借助css变量重写成如下形式:root{--背景1:url("data:image/svg+xml,%3Csvgxmlns='http://www.w3.org/2000/svg'viewBox='00512512'%3E%3CpathD='M2568C119881198256S111248248248248248-111248-248S39382568ZM0448C-110.50-200-89.5-200-200-200-200-200S145.556256256256256SS200-316v116h-67c-10.70-1612.9-8.520.5l9999c4.74.712.34.7170l99-99c7.6-7.62.2-20.5-8.5-20.5h-67V140c0-6.6-5.4-12-12-12h-4-6.60-125.4-1212z'%3E%3C/path%3E%3C/svg%3E");--背面2:url("data:image/svg+xml,%3Csvgxmlns='http://www.w3.org/2000/svg'viewBox='00512512'%3E%3Cpathd='M2568C119881198256s111248248248248-111248-248S39382568zm0448c-110.50-200-89.5-200-200S145.55625656s20089.5200200-89.5200-200200zm-32-316v116h-67c-10.70-1612.9-8.520.5l9999c4.73.7c4.71794.7c-179-7.62.2-20.5-8.5-20.5h-67V140c0-6.6-5.4-12-12-12h-40c-6.60-125.4-1212z'%3E%3C/路径%3E%3C/svg%3E");--背面3:url("data:image/svg+xml,%3Csvgxmlns='http://www.w3.org/2000/svg'viewBox='00512512'%3E%3Cpathd='M2568C119881198256s111248248248248-111248-248S39382568zm0448c-110.50-2502-0652.56506556S20089.5200-200200-89.5200-200200zm-32-316V116H-67C-10.70-1612.9-8.520.5l9999c4.74.74.712.34.712.34.7170L999-27.2065.6-12h-40c-6.60-125.4-1212z'%3E%3C/路径%3E%3C/svg%3E");}el{背景图像:var(--background1),var(--background2),var(--background3)}这样,对于el来说,到底用了哪些背景就清楚了吗?6.综上所述,以上就是本文的全部内容,也是一些实用的小技巧CSS变量,这里总结一下:有些CSS属性比较复杂,比如transform,很容易被占用,通常的解决办法是避开,比如改成居中的方式,或者使用left,top等。transform的separate属性可以解决这个问题,目前比较新,只适合内部项目尝鲜,借助CSSvariables,复杂的属性可以拆分。在@property的帮助下,CSS自定义属性可以支持过渡动画。属性可以采用这样的思路。参考文献[1]解放生产力!transform支持单独赋值和改变:https://juejin.cn/post/7152331836578856967[2]CSStransform(codepen.io):https://codepen.io/xboxyan/pen/BaVLMpv[3]CSStransform-代码掘金(juejin.cn):https://code.juejin.cn/pen/7161704312681758755[4]CSS变换(runjs.work):https://code.juejin.cn/pen/7161704312681758755njs.work/projects/4714accc300d441a[5]@property:https://developer.mozilla.org/zh-CN/docs/Web/CSS/@property[6]CSStransform@property(codepen.io):https://codepen.io/xboxyan/pen/OJERdpr[7]CSStransform@property-代码掘金(juejin.cn):https://code.juejin.cn/pen/7161709269698478083[8]CSStransform@property(runjs.工作):https://runjs.work/projects/377a051b84d54bf6