css - 尝试创建像文本框这样的材料设计,输入验证问题
问题描述
我正在尝试创建一个受材料设计启发的文本框。
我已经阅读了类似的问题/答案。但是,我的问题略有不同,请继续阅读。
这是我的页面样式表 -
.textBoxContainer{
height:50px;
position:relative;
margin:20px;
}
.textbox{
border-bottom: solid 2px #984343;
border-top: none;
border-left: none;
font-family: Candara;
width: 30%;
}
.textbox + .lbl{
position:absolute;
top:0px;
left:0px;
transition:all .2s ease-out;
}
.textbox:focus{
border-bottom: solid 2px #4CAF50;
outline:none;
}
.textbox:focus + label, input:valid+label{
top:-15px;
font-size:10px;
}
这是我要创建的文本框-
<div class='textBoxContainer'>
<input class='textbox' type="text" />
<label class='lbl'>
phone no....
</label>
</div>
它工作得很好,就像一个受材料设计启发的文本框,文本在输入时向上移动。
但是,在输入完成后,如果我移出文本框,则标签会再次折叠在文本框上。
我在想'输入:有效'将有助于防止它发生,但它没有。我可以用 javascript 解决这个问题,但是有没有不使用 js 的方法?
我也尝试过在输入字段中添加“必需”,但这也无济于事。
如果我应该进一步解释,请告诉我。
解决方案
我相信这需要使用 javaScript。如果您不想使用 javascript,只需将标签保留在 textField 顶部,或者仅使用占位符。
使用 JavaScript 实现它的方法如下:
将onfocusout
事件侦听器添加到您希望该标签保持不变的所有文本字段。
<input class='textbox' type="text" onfocusout="leaveFocus(event)" />
接下来,您必须创建每次 textField 失去焦点时调用的函数。
function leaveFocus(event) {
const textField = event.target;
// Check if textField is empty
if (textField.value !== '') {
textField.classList.add('has-text);
} else {
// Otherwise, textFiled has text
textField.classList.remove('has-text);
}
}
该函数检查 textField 是否为空。如果是,则删除 的类has-text
,如果有文本,则添加 的类has-text
。
现在在您的 中css
,您必须添加has-text
标签的所有样式,如下所示:
.textbox:focus, .has-text{
border-bottom: solid 2px #4CAF50;
outline:none;
}
.textbox:focus + label, .has-text + label, input:valid+label{
top:-15px;
font-size:10px;
}
如果这回答了您的问题,请告诉我,如果您需要更多帮助,请告诉我。
推荐阅读
- c# - 使用 WPF 工具包将 ComboBox 转换为 AutoCompleteBox
- ios - 在 Xcode 12 / Swift 5 中将 SwiftUI 按钮链接到视图控制器
- c# - `scalr` 变量在哪里
- python - 从字典和列表框中删除项目
- reactjs - 如何重置嵌套导航器(react-navigation v5)
- mysql - 此查询的最佳索引是什么?
- r - 如何在R中计算所有国家和美国之间的地理和语言距离
- java - 列表流过滤不正确
- performance - 无法解决灯塔警告“考虑使用链接 rel=preload”
- python - 更改所有 QLabel 对象 PyQt5 的字体大小