浏览器自动填充建议框重叠浮动标签输入字段
Browser autofill suggestion box overlapping floating label input field
我的表单设计带有浮动标签,Edge 和 Chrome 自动填充建议框存在问题。单击输入字段后,它会向下移动 30 像素 (margin-top
) 以便为标签腾出位置。
问题是自动填充建议 select 框不会向下移动那 30px,它会覆盖输入字段 ()。
当我再次点击输入框时,它会像我想要的那样向下移动。
现在我的问题是:是否可以将浏览器建议框向下移动到输入旁边,或者模拟对输入的第二个焦点以刷新自动填充框位置。
编辑
意见箱不是DOM内容的一部分,不能直接改。这并不奇怪。
我要问的是,在我的输入完成动画后,是否有任何已知的解决方法可以让它移动到正确的位置。
浮动标签很常见,我是第一个遇到这个问题的吗?
意见框的位置只需要刷新,手动点击输入框第二次就可以了,但是真的没有干净的自动化方式吗?
如果真的没有,我清楚地认为这是一个浏览器错误,因为建议框在错误的位置完全显示。浏览器是否已经存在一个问题,要求他们在移动时也将建议框放在输入字段的正下方(或上方)? “关注”输入字段没有意义吗?
我的自动完成建议仅在输入具有名称属性时弹出。这让我想知道我是否可以在 transitionend 之后通过注入 name 属性(使用标签的 htmlFor 属性)来触发它。它有效,但需要第二次点击才能触发建议。
我知道这不是一个完美的答案,但希望它能让人们更接近更好的解决方法。
const inputgroups = document.querySelectorAll('.form-input-group');
inputgroups.forEach( inputgroup => {
inputgroup.addEventListener('transitionend', (e) => {
if(e.propertyName === "transform") {
const input = e.target.previousElementSibling
label = e.target.htmlFor
if(input.name) {
input.name = '';
input.autocomplete = '';
} else {
input.name=label;
input.autocomplete= label;
}
}
})
})
.form-input-group input:valid~label {
transform: translate(0, -200%);
}
.form-input-group input:valid {
margin-top: 30px;
}
.form-input-group input:focus~label {
transform: translate(0, -200%);
}
.form-input-group input:focus {
outline: none;
background: #ff4a56;
color: white;
margin-top: 30px;
}
.form-input-group label,
.form-input-group input {
transition: all 0.25s cubic-bezier(0.53, 0.01, 0.35, 1.5);
}
.form-input-group {
position: relative;
padding: 10px 0;
}
.form-input-group:first-of-type {
padding-top: 0;
}
.form-input-group:last-of-type {
padding-bottom: 0;
}
.form-input-group label {
transform-origin: left center;
color: #ff4a56;
font-weight: 100;
letter-spacing: 0.01em;
font-size: 17px;
box-sizing: border-box;
padding: 10px 15px;
display: block;
position: absolute;
transform: translate(0, -100%);
z-index: 2;
pointer-events: none;
}
.form-input-group input {
appearance: none;
background-color: none;
border: 1px solid #ff4a56;
line-height: 0;
font-size: 17px;
width: 100%;
display: block;
box-sizing: border-box;
padding: 10px 15px;
border-radius: 60px;
color: #ff4a56;
font-weight: 100;
letter-spacing: 0.01em;
position: relative;
z-index: 1;
}
<form action="" method="get">
<div class="form-input-group">
<input type="text" required/>
<label for="given-name">First Name</label>
</div>
<div class="form-input-group">
<input type="text" required/>
<label for="family-name">Last Name</label>
</div>
<div class="form-input-group">
<input type="text" required/>
<label for="email">Email Address</label>
</div>
<div class="form-input-group">
<input type="password" required/>
<label>Email Confirm</label>
</div>
</form>
我的表单设计带有浮动标签,Edge 和 Chrome 自动填充建议框存在问题。单击输入字段后,它会向下移动 30 像素 (margin-top
) 以便为标签腾出位置。
问题是自动填充建议 select 框不会向下移动那 30px,它会覆盖输入字段 (
当我再次点击输入框时,它会像我想要的那样向下移动。
现在我的问题是:是否可以将浏览器建议框向下移动到输入旁边,或者模拟对输入的第二个焦点以刷新自动填充框位置。
编辑
意见箱不是DOM内容的一部分,不能直接改。这并不奇怪。
我要问的是,在我的输入完成动画后,是否有任何已知的解决方法可以让它移动到正确的位置。
浮动标签很常见,我是第一个遇到这个问题的吗?
意见框的位置只需要刷新,手动点击输入框第二次就可以了,但是真的没有干净的自动化方式吗?
如果真的没有,我清楚地认为这是一个浏览器错误,因为建议框在错误的位置完全显示。浏览器是否已经存在一个问题,要求他们在移动时也将建议框放在输入字段的正下方(或上方)? “关注”输入字段没有意义吗?
我的自动完成建议仅在输入具有名称属性时弹出。这让我想知道我是否可以在 transitionend 之后通过注入 name 属性(使用标签的 htmlFor 属性)来触发它。它有效,但需要第二次点击才能触发建议。
我知道这不是一个完美的答案,但希望它能让人们更接近更好的解决方法。
const inputgroups = document.querySelectorAll('.form-input-group');
inputgroups.forEach( inputgroup => {
inputgroup.addEventListener('transitionend', (e) => {
if(e.propertyName === "transform") {
const input = e.target.previousElementSibling
label = e.target.htmlFor
if(input.name) {
input.name = '';
input.autocomplete = '';
} else {
input.name=label;
input.autocomplete= label;
}
}
})
})
.form-input-group input:valid~label {
transform: translate(0, -200%);
}
.form-input-group input:valid {
margin-top: 30px;
}
.form-input-group input:focus~label {
transform: translate(0, -200%);
}
.form-input-group input:focus {
outline: none;
background: #ff4a56;
color: white;
margin-top: 30px;
}
.form-input-group label,
.form-input-group input {
transition: all 0.25s cubic-bezier(0.53, 0.01, 0.35, 1.5);
}
.form-input-group {
position: relative;
padding: 10px 0;
}
.form-input-group:first-of-type {
padding-top: 0;
}
.form-input-group:last-of-type {
padding-bottom: 0;
}
.form-input-group label {
transform-origin: left center;
color: #ff4a56;
font-weight: 100;
letter-spacing: 0.01em;
font-size: 17px;
box-sizing: border-box;
padding: 10px 15px;
display: block;
position: absolute;
transform: translate(0, -100%);
z-index: 2;
pointer-events: none;
}
.form-input-group input {
appearance: none;
background-color: none;
border: 1px solid #ff4a56;
line-height: 0;
font-size: 17px;
width: 100%;
display: block;
box-sizing: border-box;
padding: 10px 15px;
border-radius: 60px;
color: #ff4a56;
font-weight: 100;
letter-spacing: 0.01em;
position: relative;
z-index: 1;
}
<form action="" method="get">
<div class="form-input-group">
<input type="text" required/>
<label for="given-name">First Name</label>
</div>
<div class="form-input-group">
<input type="text" required/>
<label for="family-name">Last Name</label>
</div>
<div class="form-input-group">
<input type="text" required/>
<label for="email">Email Address</label>
</div>
<div class="form-input-group">
<input type="password" required/>
<label>Email Confirm</label>
</div>
</form>