系统皮肤切换没新意?!教你用css来做套彩铅版皮肤

844 阅读3分钟

这是我参与11月更文挑战的第14天,活动详情查看:2021最后一次更文挑战

介绍

相信很多同学做皮肤切换往往都是下拉找个颜色选择器来完成,有没有想过换一种方式,来增加新鲜感和用户体验。本期将会做一个套彩铅版系统皮肤切换功能,整个项目由vite搭建,用petite-vue写js逻辑和绑定,但我们的重点还是怎么去用scss绘制出这些来。先让我们康康效果吧:

VID_20211113_180526.gif

不知道你有思路了没,后面将向大家讲解,scss怎么去扩展和遍历,如何用clip-path绘制一支铅笔,js是如何改变全局颜色等方面的内容,还等什么,我们这就出发~

正文

1.基本结构

<body>
	<div class="pencil"></div>
</body>
:root{
    --bg-color:white;
}

html,body{
    width: 100%;
    min-height: 100vh;
    overflow: hidden;
    display: flex;
    flex-direction: column;
    align-items: flex-end;
    justify-content: center;
    background-image: repeating-linear-gradient(90deg, hsla(196,0%,79%,0.06) 0px, hsla(196,0%,79%,0.06) 1px,transparent 1px, transparent 96px),repeating-linear-gradient(0deg, hsla(196,0%,79%,0.06) 0px, hsla(196,0%,79%,0.06) 1px,transparent 1px, transparent 96px),repeating-linear-gradient(0deg, hsla(196,0%,79%,0.09) 0px, hsla(196,0%,79%,0.09) 1px,transparent 1px, transparent 12px),repeating-linear-gradient(90deg, hsla(196,0%,79%,0.09) 0px, hsla(196,0%,79%,0.09) 1px,transparent 1px, transparent 12px),linear-gradient(90deg, var(--bg-color),rgb(255,255,255));
}

我们先在body中放一个div.pencil等下我们就用他先绘制出一支铅笔来,当然我们先写个网格背景铺满全屏,其中底色默认是白色。

微信截图_20211113200114.png

2.绘制彩笔

@use "sass:math";
$len:280px;
$h:28px;
$num:24;
%shape {
  clip-path: polygon(
    50px 0,
    0 50%,
    50px 100%,
    calc(100% - 8px) 100%,
    100% calc(100% - 8px),
    100% 8px,
    calc(100% - 8px) 0
  );
}
.pencil {
    @extend %shape;
    margin:2px;
    width: $len;
    height: $h;
    position: relative;
    box-sizing: border-box;
    background-color: #000;
}

我们先用clip-path做个不规则图形写出铅笔的轮廓shape,这里有点类似于svg的path,找到对应的几个顶点即可。用 @extend %shape引入到铅笔里面,我们先别背景涂成黑色先康康轮廓是否正确。

微信截图_20211113181525.png

我们通过background渐变再给其添加颜色,当然我们后面为了让其修改颜色比较方便用了css3的变量, --skin-color为主色,--skin-line为分界线颜色。

.pencil {
    --skin-color:#71a86b;
    --skin-line:#50744c;
    // ...
    background: linear-gradient(
        var(--skin-color) 7px,
        var(--skin-line) 8px,
        var(--skin-color) 7px,
        var(--skin-color) calc(100% - 8px),
        var(--skin-line) calc(100% - 7px),
        var(--skin-color) calc(100% - 8px)
    );
}

微信截图_20211113181548.png

这样彩铅的笔身就完成了,接下来,我们会用伪类来完成他的头部。

.pencil {
    &::before {
        content: "";
        @extend %shape;
        position: absolute;
        box-sizing: border-box;
        left: 0;
        top: 50%;
        transform: translateY(-50%);
        width: 54px;
        height:$h;
        background-color: #f3c7b4;
    }

    &::after {
        content: "";
        z-index: 2;
        position: absolute;
        left: 0;
        top: 50%;
        transform: translateY(-50%);
        width: 24px;
        height: $h;
        border-radius: 50%;
        background-color: var(--skin-color);
    }
}

笔头分两部分,用before来完成削出来的木头部分和用after完成笔芯部分。因为在clip-path内部的原因,所以你写在里面的东西多余部分都会裁切掉。所以不用担心过界的问题,用绝对定位放心大胆地搞吧。

微信截图_20211113181634.png

这样我们一直绿色的彩铅就完成了,接下来我们将会讲解一下用petite-vue与scss配合完成24支不同颜色的画笔。

3.批量生成

我们引入一下petite-vue,其绑定语法基本上和vue一样,没什么学习成本。

<body>
    <div class="pencil" v-for="(item,index) in 24" :key="index"></div>

    <script type="module">
        import { createApp } from 'https://unpkg.com/petite-vue?module'
        createApp({
            
        }).mount()

    </script>
</body>

这样我们就生成了24支画笔,但是颜色都很单一,而且我们还要把放到平面最右面且还要截掉一块。

html,body{
    // ...
    flex-direction: column;
    align-items: flex-end;
    // ...
}

我们先就改下弹性盒子让其纵向排布,而且方向变成最右。

.pencil {
    right: -30px;
    transition: .2s right;
    &:hover{
        right: -15px;
    }
    @for $i from 1 through $num {
        &:nth-child(#{$i}) {
            width:#{$len - math.div($len, 2) * random()};
            --skin-line:hsl(#{math.div(360, $num) * $i}, 70%, 70%);
            --skin-color:hsl(#{math.div(360, $num) * $i}, 60%, 50%);
        }
     }
}

我们先写个移入动画。然后后面一步遍历才是生成不同颜色的关键,我们遍历这24支彩铅,赋予其不同的颜色,为了更加自然,使用hsl色盘来完成,并且也随机出了不同长度,显得桌面杂乱更加真实。

微信截图_20211113181734.png

4.切换事件

我们切换系统颜色,其实就是更改一开始的--bg-color这个root的变量。期望的是移入或者点击画笔就更改其色值。所以,我们先在彩铅上绑定事件。

<div class="pencil" v-for="(item,index) in 24" :key="index" @mouseMove="getSkinColor" @click="getSkinColor"></div>
createApp({
    getSkinColor(e){
        let bgColor = getComputedStyle(e.target).getPropertyValue('--skin-color') || "white";
        document.documentElement.style.setProperty('--bg-color',bgColor )
    }
}).mount()

我们用getComputedStyle(el).getPropertyValue(name)就可以拿到他的彩铅的css变量,然后我们再通过style.setProperty更改root的变量。

微信截图_20211113181746.png

写到这里,就已经大功告成了,还是很简单吧,在线演示

结语

本期算是一个创意效果吧,不知道同学看完是否有些收获,比如scss怎么扩展,怎么遍历,怎么随机取值等等。还有发没发现petite-vue非常的轻巧,要不要去深入探索一下。本身我也是在抛砖引玉吧,希望同学们能写出有更多的创意效果,一起加油鸭~