You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CSS代码转SCSS后输入框focus与valid伪类自动触发如何解决

问题根因

  • 浏览器默认规则下,未设置required属性的输入框,空值状态也会被判定为符合验证规则(触发:valid伪类),所以页面加载后直接展示了输入完成后的样式
  • 现有SCSS的状态判断逻辑没有过滤空输入场景,只要:valid触发就会加载完成态样式

修复步骤

  1. 调整HTML中对应输入框的属性:添加required属性,同时设置placeholder=" "(占位符内容为单个空格即可)
  2. 修改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;
    }
  }
}
  1. 确认HTML结构匹配:输入框的直接下一个兄弟元素必须是class为labelName的label标签,label内部需要包含class为contentName的提示文字容器。

内容的提问来源于stack exchange,提问作者Alex Motor

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 00:09:01