CSS实现虚拟变化主题键盘

1,259 阅读3分钟

我正在参加「码上掘金挑战赛」详情请看:码上掘金挑战赛来了!

作为程序员天天敲打着键盘,我就想能否通过css实现呢,今天我们就用css来实现一下虚拟键盘,为了不让他看起来那么单调,我们在给它添加一个变化主题色的功能

效果图

未变色前

企业微信截图_16625465761176.png

变色后

企业微信截图_16625465624906.png

实现思路

我们来分析下布局,这一个键盘是大盒子,然后大盒子里面有三个盒子,这三个盒子分别代表三行,每一行Y轴不对齐

企业微信截图_16625466331825.png

页面结构

三行盒子我们通过无序列表进行实现,键盘上有一个Fn键,他是用于控制键盘主题色变化的,我们把他单独拿出来

  <!-- 大盒子 -->
    <div id="app">
        <div id="btn">Fn</div>
        <ul>
            <!-- 键盘列 -->
            <li>
                <div>q</div>
                <div>w</div>
                <div>e</div>
                <div>r</div>
                <div>t</div>
                <div>y</div>
                <div>u</div>
                <div>i</div>
                <div>o</div>
                <div>p</div>
            </li>
            <li>
                <div>a</div>
                <div>s</div>
                <div>d</div>
                <div>f</div>
                <div>g</div>
                <div>h</div>
                <div>j</div>
                <div>k</div>
                <div>l</div>
            </li>
            <li>
                <div>z</div>
                <div>x</div>
                <div>c</div>
                <div>v</div>
                <div>b</div>
                <div>n</div>
                <div>m</div>
            </li>
        </ul>
    </div>

样式实现

我们先清除所有元素的基本样式,给在外面的大盒子设置好样式,高度我们让里面的内容把他撑起来

  * {
           box-sizing: border-box;
            list-style: none;
        }

        /* 大盒子 */
        #app {
            position: relative;

            width: 680px;
            margin: 13vh auto;
            display: flex;
            justify-content: center;
            border: 1px solid #ccc;
            border-radius: 10px;
        }

在设置键盘的每一行的位置,我们这里使用外边距属性让无序列表的子元素距离左边都有距离,这样第一列初始就不对齐,后面每一列自然不对齐

   ul {
            padding: 0;
        }

        /* 键盘每一列 */
        ul li {
            display: flex;
            overflow: hidden;
        }

        ul li:nth-child(2) {
            margin-left: 24px;
        }

        ul li:nth-child(3) {
            margin-left: 52px;
        }

实现键帽的样式,我们这里给键帽里面的文字设置一个发光样式,由于初始是白光,所以看不到,只有当变换主题色的时候才可以看到

        /* 键帽 */
        ul li div {
            display: flex;
            justify-content: center;
            align-items: center;
            width: 50px;
            height: 50px;
            text-transform: capitalize;
            margin: 8px;
            box-shadow: 0px 0px 3px 0px #ccc;
            border-radius: 10px;
            cursor: pointer;
            user-select: none;
            transition: background 0.05s;
            text-shadow: 0 0 10px #fff,
                0 0 20px #fff,
                0 0 30px #fff,
                0 0 40px #00a67c,
                0 0 70px #00a67c,
                0 0 80px #00a67c,
                0 0 100px #00a67c,
                0 0 150px #00a67c;
        }

        /* 键帽滑过 */
        ul li div:hover {
            background: #eee;

        }

企业微信截图_16625465856897.png

最后将Fn键样式写一下,在通过定位的方式定位到合适的位置即可

   /* 按钮 */
        #btn {
            position: absolute;
            bottom: 4px;
            right: 20px;
            margin: 20px auto;
            display: flex;
            justify-content: center;
            align-items: center;
            width: 130px;
            height: 50px;
            user-select: none;
            cursor: pointer;
            border-radius: 10px;
            background: #eee;
        }

主题色变换逻辑实现

           // 获取Fn键
        const btn = document.getElementById('btn');
        // 获取所有的键帽
        const keyupAll = document.querySelectorAll('ul li div');
        // 给Fn键绑定点击事件
        btn.onclick = function () {
            // 随机获取3个0~255之间的数用于更换背景色
            const R = Math.round(Math.random() * 255);
            const G = Math.round(Math.random() * 255);
            const B = Math.round(Math.random() * 255);
          
            // 把随机数添加到css的rgba属性中
            let rgba = `rgb(${R},${G},${B},${0.5})`
            // 按键也需要用到背景色,更换主题按钮的背景色和普通的键帽需要有区别所以给出区别
            this.style.backgroundColor = `rgb(${R},${G},${R},${0.5})`
            // 循环每个键帽并赋值背景色
            for (let i = 0; i < keyupAll.length; i++) {
                keyupAll[i].style.backgroundColor = rgba
            }
        }
        // 给键帽添加点击事件,当键帽点击弹出我们点击的按键内容
        keyupAll.forEach(function (R) {
            R.onclick = function () {
                alert(`您按下了${this.innerText}键`)
            }
        })

代码我放到码上掘金上了,感兴趣的可以看一看!

坚持努力,无惧未来!