CSS代码转SCSS后输入框focus与valid伪类自动触发如何解决
问题根因
- 浏览器默认规则下,未设置
required属性的输入框,空值状态也会被判定为符合验证规则(触发:valid伪类),所以页面加载后直接展示了输入完成后的样式 - 现有SCSS的状态判断逻辑没有过滤空输入场景,只要
:valid触发就会加载完成态样式
修复步骤
- 调整HTML中对应输入框的属性:添加
required属性,同时设置placeholder=" "(占位符内容为单个空格即可) - 修改SCSS中输入框的状态选择逻辑,新增空输入过滤规则,修正后的完整SCSS如下:
.root { height: 60vh; display: flex; justify-content: space-around; align-items: center; flex-direction: column; font-family: sans-serif; .colAuto { width: 50%; position: relative; height: auto; overflow: hidden; margin: 1rem auto; } .col { width: 50%; position: relative; height: 50px; overflow: hidden; margin: 1rem auto; } .form { width: 100%; } .col input { width: 100%; height: 100%; color: #595f6e; padding-top: 20px; border: none; padding-left: 5px; outline: none; // 清除浏览器默认focus轮廓 background: transparent; // 清除默认输入框背景 } .form label { position: absolute; bottom: 0px; left: 0; height: 100%; width: 100%; pointer-events: none; border: 1px solid black; &:after { content: ""; left: 0; bottom: 0; position: absolute; height: 100%; width: 100%; border-bottom: 3px solid black; transform: translateX(-100%); transition: all 0.3s ease; } } .contentName { position: absolute; bottom: 5px; left: 5px; transition: all 0.3s ease; } .form input { // 新增:not(:placeholder-shown)过滤空输入场景 &:focus + .labelName .contentName, &:valid:not(:placeholder-shown) + .labelName .contentName { transform: translateY(-150%); font-size: 14px; } &:focus + .labelName::after, &:valid:not(:placeholder-shown) + .labelName::after { transform: translateX(0%); } } .submitButton { border: 0; border-radius: 0; outline: 0; background: #4e68c7; box-shadow: 1px 0px 1px #203891,0px 1px 1px #3852b1,2px 1px 1px #203891,1px 2px 1px #3852b1,3px 2px 1px #203891,2px 3px 1px #3852b1,4px 3px 1px #203891,3px 4px 1px #3852b1,5px 4px 1px #203891,4px 5px 1px #3852b1,6px 5px 1px #203891; color: white; white-space: nowrap; width: 98%; font-weight: bold; padding: 0.6rem 0; font-size: 1.5rem; position: relative; transition: all 0.2s ease-in-out; &:hover, &:focus { background: #3d57b4; } &:active { box-shadow: 1px 0px 1px #203891,0px 1px 1px #3852b1,2px 1px 1px #203891,1px 2px 1px #3852b1,3px 2px 1px #203891; transform: translate(3px, 3px); letter-spacing: 0.2rem; } &:after { content: ""; position: absolute; top: 0; left: 0; right: -5px; bottom: -5px; } &:active:after { top: -3px; left: -3px; right: -2px; bottom: -2px; } } }
- 确认HTML结构匹配:输入框的直接下一个兄弟元素必须是class为
labelName的label标签,label内部需要包含class为contentName的提示文字容器。
内容的提问来源于stack exchange,提问作者Alex Motor
相关产品推荐
相关产品推荐

