如何正确设置浮动标签的样式以使其不停留在输入字段的顶部?
How do I style correctly a floating label to not stay on top of input field?
我正在尝试制作一个浮动标签输入表单。不知道怎么命名。
.form input,
label {
transition: all 500ms;
touch-action: manipulation;
}
.form input {
border: none;
border-bottom: 1px solid #ddd;
height: 1.5em;
margin: 0.5em 0;
width: 100%;
}
.form label {
display: block;
transform-origin: left bottom;
transform: translate(1.5em, -2em);
}
.form input:focus {
border: none;
outline-width: 0;
border-bottom: 1px solid #5fa8d3;
}
.form input:focus+label {
transform: translate(0, -3.4em);
}
<form action="get" class="login-form">
<h1>Log In</h1>
<input type="text" name="username" id="username" autocomplete="none" required />
<label for="username">Username:</label>
<input type="password" name="password" id="password" required />
<label for="password">Password:</label>
</form>
我也试过在.form input:focus + label
上加overflow: hidden
但是没用,输入的内容被标签覆盖了。
您在 css 中的 form
之前添加了 .
标记,.form
的名称中没有 class。如果你想将它应用到 form
元素上,那么在没有 .
选择器的情况下使用它。
并且要保持标签的悬停状态,必须确定 input
元素是否已填充。我们可以使用 javascript 并在输入元素中添加一个属性 filled=true
如果它已填充并在它为空时删除
document.addEventListener('input', function(event) {
if (event.target.nodeName && event.target.nodeName === "INPUT") {
if (event.target.value) {
event.target.setAttribute('filled', 'true')
} else {
event.target.removeAttribute('filled')
}
}
})
form input,
label {
transition: all 500ms;
touch-action: manipulation;
}
form input {
border: none;
border-bottom: 1px solid #ddd;
height: 1.5em;
margin: 0.5em 0;
width: 100%;
}
form label {
display: block;
transform-origin: left bottom;
transform: translate(1.5em, -2em);
}
form input:focus {
border: none;
outline-width: 0;
border-bottom: 1px solid #5fa8d3;
}
form input:focus+label {
transform: translate(0, -3.4em);
}
form input[filled="true"]+label {
transform: translate(0, -3.4em);
}
<form action="get" class="login-form">
<h1>Log In</h1>
<input type="text" name="username" id="username" autocomplete="none" required />
<label for="username">Username:</label>
<input type="password" name="password" id="password" required />
<label for="password">Password:</label>
</form>
在您的特定情况下,您可以使用 :valid
伪 class 在输入数据后使标签保持浮动(您只能这样做,因为字段被标记为 'required' ! !)
.login-form input:focus+label
.login-form input:valid+label {
transform: translate(0, -3.4em);
}
(旁注:您的原始代码说 .form
但我想您的意思是 .login-form
?)
如果您希望能够对所有字段执行此操作,而不仅仅是必填字段,您要么必须使用 javascript 跟踪其中的值并相应地设置 class,或者使用使用占位符的 'hack' 位:
<input type="password" name="password" id="password" placeholder=" " />
<label for="password">Password:</label>
form input:not(:placeholder-shown) + label
form input:not(:-ms-input-placeholder) + label {
transform: translate(0, -3.4em);
}
(如果您不需要 IE 支持,您可以省略 :-ms-input-placeholder
)
我正在尝试制作一个浮动标签输入表单。不知道怎么命名。
.form input,
label {
transition: all 500ms;
touch-action: manipulation;
}
.form input {
border: none;
border-bottom: 1px solid #ddd;
height: 1.5em;
margin: 0.5em 0;
width: 100%;
}
.form label {
display: block;
transform-origin: left bottom;
transform: translate(1.5em, -2em);
}
.form input:focus {
border: none;
outline-width: 0;
border-bottom: 1px solid #5fa8d3;
}
.form input:focus+label {
transform: translate(0, -3.4em);
}
<form action="get" class="login-form">
<h1>Log In</h1>
<input type="text" name="username" id="username" autocomplete="none" required />
<label for="username">Username:</label>
<input type="password" name="password" id="password" required />
<label for="password">Password:</label>
</form>
我也试过在.form input:focus + label
上加overflow: hidden
但是没用,输入的内容被标签覆盖了。
您在 css 中的 form
之前添加了 .
标记,.form
的名称中没有 class。如果你想将它应用到 form
元素上,那么在没有 .
选择器的情况下使用它。
并且要保持标签的悬停状态,必须确定 input
元素是否已填充。我们可以使用 javascript 并在输入元素中添加一个属性 filled=true
如果它已填充并在它为空时删除
document.addEventListener('input', function(event) {
if (event.target.nodeName && event.target.nodeName === "INPUT") {
if (event.target.value) {
event.target.setAttribute('filled', 'true')
} else {
event.target.removeAttribute('filled')
}
}
})
form input,
label {
transition: all 500ms;
touch-action: manipulation;
}
form input {
border: none;
border-bottom: 1px solid #ddd;
height: 1.5em;
margin: 0.5em 0;
width: 100%;
}
form label {
display: block;
transform-origin: left bottom;
transform: translate(1.5em, -2em);
}
form input:focus {
border: none;
outline-width: 0;
border-bottom: 1px solid #5fa8d3;
}
form input:focus+label {
transform: translate(0, -3.4em);
}
form input[filled="true"]+label {
transform: translate(0, -3.4em);
}
<form action="get" class="login-form">
<h1>Log In</h1>
<input type="text" name="username" id="username" autocomplete="none" required />
<label for="username">Username:</label>
<input type="password" name="password" id="password" required />
<label for="password">Password:</label>
</form>
在您的特定情况下,您可以使用 :valid
伪 class 在输入数据后使标签保持浮动(您只能这样做,因为字段被标记为 'required' ! !)
.login-form input:focus+label
.login-form input:valid+label {
transform: translate(0, -3.4em);
}
(旁注:您的原始代码说 .form
但我想您的意思是 .login-form
?)
如果您希望能够对所有字段执行此操作,而不仅仅是必填字段,您要么必须使用 javascript 跟踪其中的值并相应地设置 class,或者使用使用占位符的 'hack' 位:
<input type="password" name="password" id="password" placeholder=" " />
<label for="password">Password:</label>
form input:not(:placeholder-shown) + label
form input:not(:-ms-input-placeholder) + label {
transform: translate(0, -3.4em);
}
(如果您不需要 IE 支持,您可以省略 :-ms-input-placeholder
)