input:valid {
    border: 2px solid green;
    background-color: beige;
}
<form>
    <fieldset>
        <legend>사용자 정보 입력 확인</legend>
        <p>
            <label for="username">이름(필수)</label>
            <input id="username" type="text" required> <!-- 필수 입력 -->
        </p>
        <p>
            <label for="useremail">이메일</label>
            <!-- 이메일 형식을 올바로 입력한 상태의 요소: 유효성 검사를 충족 함-->
            <input id="useremail" type="email" value="account@exmaple.com">
        </p>
        <p>
            <button type="submit">확인</button>
        </p>
    </fieldset>
</form>
실제 적용된 모습 이메일 형식을 올바르지 않게 고쳐보세요.
올바른 이메일 주소(account@exmaple.com)를 account@@@@example.com처럼 잘못된 형식으로 수정하면, 이메일 입력 필드의 스타일이 바뀌고 유효성 검사를 충족하지 못할 것입니다. 또한 필수 입력 값인 이름에 글자를 입력해 보세요. 유효성 검사를 충족해서 스타일이 바뀔겁니다.
:valid {
    /* ... */
}
input:valid {
    border: 2px solid green;
    background-color: beige;
}
<form>
        <p>
            <label for="username">이름</label>
            <!-- 제약 조건 유효성 검사(constraint validation)을 적용할 수 있이나 
                 제약 조건이 없어서
                 당연히 유효성 검사를 충족한 컨트롤 요소 -->
            <input id="username" type="text">
        </p>
        <p>
            <label for="useremail">이메일</label>
            <!-- 이메일 형식을 올바로 입력한 상태의 요소: 유효성 검사를 충족 함-->
            <input id="useremail" type="email" value="account@exmaple.com">
        </p>
</form>
실제 적용된 모습
input:valid {
    border: 2px solid green;
    background-color: beige;
}
<form>
    <label for="maxlength">최소 글자수 (수정 시점)</label>
    <input id="maxlength" type="text" minlength="5" value="123">
    <small>최소 5글자</small>
</form>
실제 적용된 모습
form:valid {
    border: 2px solid green;
    background-color: beige;
}
form {
    padding: 1em;
}
<form>
    <fieldset>
        <legend>사용자 정보 입력 확인</legend>
        <p>
            <label for="username">이름(필수)</label>
            <input id="username" type="text"  value="홍길동" required> <!-- 필수 입력 -->
        </p>
        <p>
            <label for="useremail">이메일</label>
            <!-- 이메일 형식을 올바로 입력한 상태의 요소: 유효성 검사를 충족 함-->
            <input id="useremail" type="email" value="account@exmaple.com">
        </p>
        <p>
            <button type="submit">확인</button>
        </p>
    </fieldset>
</form>
실제 적용된 모습 이메일 형식을 올바르지 않게 고쳐보세요.
올바른 이메일 주소(account@exmaple.com)를 account@@@@example.com처럼 잘못된 형식으로 수정하면, 폼 영역의 스타일이 바뀌고 유효성 검사를 충족하지 못할 것입니다. 또한 필수 입력 값인 이름의 글자를 지워도 :valid로 적용된 폼 영역의 스타일이 지워집니다.
fieldset:valid {
    border: 2px solid green;
    background-color: beige;
}
form {
    padding: 1em;
}
<form>
    <fieldset>
        <legend>사용자 정보 입력 확인</legend>
        <p>
            <label for="username">이름(필수)</label>
            <input id="username" type="text"  value="홍길동" required> <!-- 필수 입력 -->
        </p>
        <p>
            <label for="useremail">이메일</label>
            <!-- 이메일 형식을 올바로 입력한 상태의 요소: 유효성 검사를 충족 함-->
            <input id="useremail" type="email" value="account@exmaple.com">
        </p>
        <p>
            <button type="submit">확인</button>
        </p>
    </fieldset>
</form>
실제 적용된 모습 이메일 형식을 올바르지 않게 고쳐보세요.
올바른 이메일 주소(account@exmaple.com)를 account@@@@example.com처럼 잘못된 형식으로 수정하면, 필드셋 영역의 스타일이 바뀌고 유효성 검사를 충족하지 못할 것입니다. 또한 필수 입력 값인 이름의 글자를 지워도 :valid로 적용된 필드셋 영역의 스타일이 지워집니다.
input:valid {
    border: 2px solid green;
    background-color: beige;
}
<form>
    <fieldset>
        <legend>웹사이트 등록 정보 확인</legend>
        
        <p>
            <label for="sitename">사이트명(필수):</label>
            <input type="text" id="sitename" required value="샘플 사이트">
        </p>

        <p>
            <label for="siteurl">사이트 주소:</label>
            <input type="url" id="siteurl" value="https://example.com">
        </p>

        <p>
            <label for="rating">추천 점수(1~5):</label>
            <input type="number" id="rating" min="1" max="5" value="3">
        </p>
        <p>
            <button type="submit">확인</button>
        </p>
    </fieldset>
</form>
실제 적용된 모습