CSS的奇思妙想(1) | 神奇的 div

630 阅读2分钟

“这是我参与8月更文挑战的第1天,活动详情查看: 8月更文挑战 juejin.cn/post/698796…

这是“CSS的奇思妙想”系列开篇第一章,会持续更新

这里会有自己对于各种 CSS 的奇思妙想

有趣使用,才是王道~~

话不啰嗦,直接开搞!

我不是真的输入框,我只是一个div

经常开发移动端的小伙伴应该都会遇到过这样的一个问题:

  • 产品经理:系统自带的输入键盘太丑了,我们能不能自己实现一个?
  • 我:这不简单嘛,完全哦得k

一个小时后~~

我满头大汗的坐在电脑前,想:

“我是自己写辞职信呢,还是等他开除我呢,这是个问题”

为啥?

因为原本一个看似简简单单的需求,差点阴沟里翻车

不过好在聪明机智在两个小时候终于如期完成任务

解决方案

input 一旦获取焦点,在移动端设备上,会直接调起系统键盘

就像这样

拦都拦不住

1.gif

那怎么办

禁用它,添加点击事件

input 添加禁用属性

// index.html
<input type="text" disabled="disabled" >

父级元素,并增加点击事件

为啥要添加父级? 还不是因为input禁用后事件失效

// html
<div class="input_parent" onclick="onInputClick()">
    <input type="text" disabled="disabled" >
</div>

<div class="keys">
    自定义键盘
</div>

// script
function onInputClick(){
    // 调起自定义键盘
    document.getElementsByClassName('keys')[0].style.display = 'flex'
}

效果

2.gif

可以是可以了,但是

光标呢?没有光标还算是个输入框吗?

这当然不算

得,回炉重造

这次我们不用 input 我们用万能的 div + 伪类元素 :after

第一步

一个 div ,一个 :after,在来一个小小的动画

// html
<div class="input"></div>

// style
.input{
    min-height: 2rem;
    width: 15rem;
    font-size: 2rem;
    border: 0.1rem solid #8A8A8A;
    padding: 0.5rem;
}
		
.input::after{
    content:'|';
    color: #8A8A8A;
    animation:cursor 1.5s linear infinite;
}
@keyframes cursor{
    0%{
        opacity: 1;
    }
    50%{
        opacity: 0;
    }
    100%{
        opacity: 1;
    }
}

看看效果

3.gif

我们加上事件逻辑,再来看看效果

4.gif

最后

完整代码

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8" />
		<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no" />
		<title></title>
	</head>
	<style>
		body{
			display: flex;
			height: 100vh;
			width: 100vw;
			overflow: hidden;
		}
		.box{
			margin: auto;
		}
		
		.input{
			min-height: 2rem;
			width: 15rem;
			font-size: 2rem;
			border: 0.1rem solid #8A8A8A;
			padding: 0.5rem;
		}
		
		.input::after{
			content:'|';
			color: #8A8A8A;
			animation:cursor 1.5s linear infinite;
		}
		
		@keyframes cursor{
			0%{
				opacity: 1;
			}
			50%{
				opacity: 0;
			}
			100%{
				opacity: 1;
			}
		}
		
		.keys{
			position: fixed;
			height: 30vh;
			bottom: 0;
			left: 0;
			right: 0;
			display: none;
			justify-content: center;
			align-items: center;
			background: #8a8a8a;
			box-sizing: border-box;
			flex-wrap: wrap;
		}
		
		.keys_item{
			width: calc(100% / 2 - 2rem);
			height: calc(100% / 3 - 1rem);
			margin: 0.1rem;
			background: indianred;
			color: #fff;
			display: flex;
			justify-content: center;
			align-items: center;
			font-size: 2rem;
		}
		.
	</style>
	<body>
		<div class="box">
			<div class="input" onclick="onInputClick()">

			</div>
		</div>

		<div class="keys">
			<div class="keys_item" onclick="onKeyClick(1)">1</div>
			<div class="keys_item" onclick="onKeyClick(2)">2</div>
			<div class="keys_item" onclick="onKeyClick(3)">3</div>
			<div class="keys_item" onclick="onKeyClick(4)">4</div>
			<div class="keys_item" onclick="onKeyClick(5)">5</div>
			<div class="keys_item" onclick="onKeyClick(6)">6</div>
		</div>
	</body>
</html>
<script type="text/javascript">
	function onInputClick() {
		// 调起自定义键盘
		document.getElementsByClassName('keys')[0].style.display = 'flex'
	}
        
	function onKeyClick(number) {
		const n_input = document.getElementsByClassName('input')[0];

		n_input.textContent += number
	}
</script>