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

纯CSS实现常见UI效果

时间:2023-03-22 16:31:49 科技观察

前言切图是大多数前端自嘲的名字。相信很多人在平时写页面的时候,大部分时间都花在了剪图、排图等等。这里不是否定切图本身,而是质疑:一直切图对自己功力的增长有什么好处?想想UI丢给你一个好看的界面,但是你只需要一个img标签,或者一个background-image属性就搞定了,但是以后某处需要调整一些外观(颜色,文字等),你不是要让UI修改之前的材质,然后替换吗?这样就完全受制于UI,不能发挥自己的主动性。那么,如何打破这个僵局呢?很简单,如果你擅长CSS,你就不需要做裁图这种枯燥的工作了。那些界面和元素是你自己亲手创造的。虽然创造它们可能需要付出一些努力,但带来的回报也是巨大的。您不仅可以自由控制您创建的元素,还可以大大提高您的CSS技能。在用纯CSS实现这些效果之前,笔者先介绍几个常用的SCSSMixins和一个强大的武器,用它们来制作会事半功倍——cover@mixincover($top:0,$left:0,$width:100%,$height:100%){position:absolute;top:$top;left:$left;width:$width;height:$height;}当你想在originalelement》一个元素,覆盖在上面,你会用到它的demo地址:https://codepen.io/alphardex/pen/GRjEoBZembed-inset@mixininset($inset:0){position:absolute;top:$inset;left:$inset;right:$inset;bottom:$inset;}同理,这是在原元素的基础上复制一个元素,但是这个元素的位置和原元素一样,大小相同会在原有元素的基础上进行不同的增减。比如你想创建多个不同半径的同心圆,这个Mixin会有帮助。aqua.cssaqua.css是一个优雅、轻量级的CSS框架openso被作者逼的。里面有很多常用的组件和常用的样式类。用它来写CSS体验会很爽。在codepen上,作者准备了一个aqua.css模板,你可以用它来制作CSS。常见UI效果条纹效果2首先我们要把握好“框架”这个词,如何制作一个特殊的框架?如果通用的CSS属性无法实现,可以考虑使用伪元素来实现。思路是这样的:在原元素下创建一个背景为条纹的伪元素,并保证原元素将其覆盖,从而模拟边框的效果。那么如何创建条纹背景呢?这里我们将使用repeating-linear-gradient来实现Loremipsum...

.border-stripe{--stripe-width:0.5rem;--stripe-deg:-45deg;--stripe-color-1:var(--grey-color-1);--stripe-offset-1:2px;--stripe-color-2:var(--skin-color-2);--stripe-offset-2:1rem;--stripe-radius:15px;--stripe-in??set:calc(var(--stripe-width)*-1);&::before{@includeinset(var(--stripe-in??set));content:"";z-index:-1;background:repeating-linear-gradient(var(--stripe-deg),var(--stripe-color-1)0var(--stripe-offset-1),var(--stripe-color-2)0var(--stripe-offset-2));border-radius:var(--stripe-radius);}}为了保证复用性,抽象成一个border-stripe类,里面的值可以通过CSS变量动态调整demo地址:https://codepen.io/alphardex/pen/VwKWvdG光泽效果看到光泽,相信大家可能会想到一个关键的作用——径向渐变,通过它我们可以创建一个放射状的图案,而光泽就是也是径向的,然后根据背景的特点叠加即可,轻松实现光泽效果ShineButton1ShineButton2
:root{--blue-color-1:#08123d;--gold-color-1:#dcb687;--brown-color-1:#50301f;--brown-color-2:#936237;--gold-grad-1:radial-gradient(circleat50%5%,#{transparentize(white,0.5)},#eba262),#eba262;--gold-grad-2:linear-gradient(88deg,#e7924e0%,#f8ffee50%,#e7924e100%);--blue-grad-1:radial-gradient(circleat50%5%,#{transparentize(white,0.8)},#091344),#091344;--primary-color:var(--blue-grad-1);--info-color:var(--gold-grad-1);}.btn{&-primary{border:4pxsolidvar(--gold-color-1);span{background-image:var(--gold-grad-2);}}&-info{color:var(--brown-color-1);border:none;}&-depth{box-shadow:0-5px0var(--brown-color-2);}}demo地址:https://codepen.io/alphardex/details/vYXZNez不规则形状首先我们观察上面丝带造型的基本形状有哪些:中间一个长方形,长方形下面2个三角形,左右各切一个长方形一提到裁剪,就可以想到clip-path属性,这样问题就迎刃而解了PureCSSRibbon
.ribbon{--ribbon-color-1:var(--yellow-color-1);--ribbon-color-2:var(--yellow-color-2);--ribbon-color-3:var(--yellow-color-3);position:relative;padding:0.5rem1rem;color:white;background:var(--ribbon-color-1);.block{&:nth-child(1),&:nth-child(2){position:absolute;bottom:-20%;width:20%;高度:20%;背景:var(--ribbon-color-2);剪辑路径:多边形(00,100%100%,100%0);}&:nth-child(1){left:0;}&:nth-child(2){right:0;transform:scaleX(-1);}&:nth-child(3),&:nth-child(4){position:absolute;z-index:-1;顶部:20%;宽度:40%;高度:100%;背景:var(--ribbon-color-3);剪辑路径:多边形(00,25%50%,0100%,100%100%,100%0);}&:nth-child(3){left:-20%;}&:nth-child(4){right:-20%;transform:scaleX(-1);}}}注意有一行代码transform:scaleX(-1);,起到了水平翻转的作用,防止clip-pathdemo地址被又写了一遍:https://codepen.io/alphardex/pen/OJRvaaR浮雕效果通过仔细观察,你会发现它是由2个同心圆元素组成的,所以你很自然地想到创建2个同心圆元素后的insetMixin,然后找到也是一种创造浮雕光泽的方法。这里的光泽可以用box-shadow来实现。通过叠加多个阴影,我们可以模拟出浮雕的效果。浮雕按钮:root{--red-color-1:#af2222;--red-color-2:#c1423e;--red-color-3:#c62a2a;--red-color-4:#951110;--green-color-1:#486433;--green-color-2:#2b361a;--red-grad-1:linear-gradient(toright,var(--red-color-1)50%,var(--red-color-2)0);}.embossed{--emboss-radius:1rem;--emboss-out:6px;--emboss-out-minus:calc(var(--emboss-out)*-1);--emboss-inset:2px;--emboss-inset-minus:calc(var(--emboss-inset)*-1);--emboss-blur:1px;--emboss-bg-1:var(--red-color-3);--emboss-bg-2:var(--green-color-1);--emboss-color-1:white;--emboss-color-2:var(--red-color-4);--emboss-color-3:var(--green-color-2);position:relative;box-sizing:border-box;white-space:nowrap;&::before{@includeinset(var(--emboss-out-minus));content:"";background:var(--emboss-bg-1);box-shadow:insetvar(--emboss-inset-minus)var(--emboss-inset-minus)var(--emboss-blur)var(--emboss-color-1),insetvar(--emboss-inset)var(--emboss-inset)var(---emboss-blur)var(--emboss-color-2);border-radius:calc(var(--emboss-radius)+var(--emboss-out));}&::after{@includeinset;@includeflex-center;content:attr(data-text);color:white;font-weight:bold;background:var(--emboss-bg-2);box-shadow:insetvar(--emboss-inset)var(--emboss-inset)var(--emboss-blur)var(--emboss-color-1),insetvar(--emboss-inset-minus)var(--emboss-inset-minus)var(--emboss-blur)var(--emboss-color-3);border-radius:var(--emboss-radius);}}演示地址:https://codepen.io/alphardex/pen/poEEERM?editors=0110课后作业,尝试用纯CSS实现下图的效果,不许剪图~我的方案:https://codepen.io/alphardex/pen/gOweBBE