> 웹 프론트엔드 > CSS 튜토리얼 > 바닐라 JavaScript 및 CSS로 다중 단계 양식을 만드는 방법

바닐라 JavaScript 및 CSS로 다중 단계 양식을 만드는 방법

William Shakespeare
풀어 주다: 2025-03-07 16:55:11
원래의
272명이 탐색했습니다.

How to Create Multi-Step Forms With Vanilla JavaScript and CSS 다중 단계 양식은 양식이 크고 많은 컨트롤이있을 때 좋은 선택입니다. 아무도 모바일 장치에서 매우 긴 형태를 스크롤하고 싶지 않습니다. 화면별로 컨트롤을 그룹화함으로써 길고 복잡한 형태를 채우는 경험을 향상시킬 수 있습니다. 그러나 마지막으로 다단계 형식을 개발 한 시간은 언제입니까? 당신에게도 재미있게 들리나요? 생각해야 할 것이 너무 많고 관리 해야하는 많은 움직이는 조각이 너무 많아서 양식 라이브러리 또는 심지어 모든 것을 처리하는 일부 유형의 양식 위젯에 의지 할 때 당신을 비난하지 않을 것입니다.

. 그러나 손으로 그것을하는 것은 좋은 운동이며 기본을 연마하는 좋은 방법 일 수 있습니다. 첫 번째 멀티 스텝 양식을 어떻게 만들었는지 보여 드리겠습니다. 어떻게 접근하기 쉬운 지 알 수있을뿐만 아니라 내 작업을 더 좋게 만들기 위해 영역을 발견 할 수도 있습니다.

. 우리는 구조를 함께 걸을 것입니다. 우리는 구직 응용 프로그램을 구축 할 것입니다. 우리 중 많은 사람들이 최근이 시절과 관련 될 수 있다고 생각합니다. 기준선 HTML, CSS 및 JavaScript를 먼저 발판 한 다음 접근성 및 검증에 대한 고려 사항을 살펴 봅니다. 도중에 참조하려면 최종 코드에 대한 github 리포지토리를 만들었습니다. 예제 코드를 얻으십시오 다중 단계 형태 의 구조

우리의 작업 신청서에는 네 개의 섹션이 있으며, 마지막은 요약보기이며, 여기서 제출하기 전에 사용자에게 모든 답변을 보여줍니다. 이를 달성하기 위해 HTML을 각각 ID로 식별 된 4 개의 섹션으로 나누고 페이지 하단에 탐색을 추가합니다. 다음 섹션에서 기준선 HTML을 드리겠습니다.

섹션을 통해 사용자를 탐색한다는 것은 또한 어떤 단계에 있는지, 얼마나 많은 단계가 남아 있는지에 대한 시각적 표시기도 포함한다는 것을 의미합니다. 이 표시기는 활성 단계 또는 더 멋진 진행 막대 유형의 표시기에 따라 업데이트되는 간단한 동적 텍스트 일 ​​수 있습니다. 우리는 사물을 단순하게 유지하고 형태의 다단계 특성에 집중하기 위해 전자를 할 것입니다. 구조와 기본 스타일 우리는 논리에 더 집중할 것이지만, 코드 스 니펫과 끝에있는 전체 코드 링크를 제공 할 것입니다.

. 페이지를 잡을 수있는 폴더를 만들부터 시작하겠습니다. 그런 다음 index.html 파일을 만들고 다음을 붙여 넣습니다.

html 를 열십시오

코드를 살펴보면 세 섹션과 내비게이션 그룹을 볼 수 있습니다. 섹션에는 양식 입력이 포함되어 있으며 기본 양식 검증이 없습니다. 기본 양식 유효성 검사가 제출 버튼을 클릭 할 때만 트리거되기 때문에 오류 메시지 표시를 더 잘 제어 할 수 있습니다.

. 다음, Styles.css 파일을 만들고 이것에 붙여 넣습니다.
열린 기본 스타일
<form >
  <section  >
    <div >
      <div >
        <label for="name">Name <span style="color: red;">*</span></label>
        <input type="text"  name="name" placeholder="Enter your name">
      </div>

      <div >
        <label for="idNum">ID number <span style="color: red;">*</span></label>
        <input type="number"  name="idNum" placeholder="Enter your ID number">
      </div>
    </div>

    <div >
      <div >
        <label for="email">Email <span style="color: red;">*</span></label>
        <input type="email"  name="email" placeholder="Enter your email">
      </div>

      <div >
        <label for="birthdate">Date of Birth <span style="color: red;">*</span></label>
        <input type="date"  name="birthdate" max="2006-10-01" min="1924-01-01">
      </div>
    </div>
  </section>

  <section  >
    <div >
      <label for="document">Upload CV <span style="color: red;">*</span></label>
      <input type="file" name="document" >
    </div>

    <div >
      <label for="department">Department <span style="color: red;">*</span></label>
      <select  name="department">
        <option value="">Select a department</option>
        <option value="hr">Human Resources</option>
        <option value="it">Information Technology</option>
        <option value="finance">Finance</option>
      </select>
    </div>
  </section>

  <section  >
    <div >
      <label for="skills">Skills (Optional)</label>
      <textarea  name="skills" rows="4" placeholder="Enter your skills"></textarea>
    </div>

    <div >
      <input type="checkbox" name="terms" >
      <label for="terms">I agree to the terms and conditions <span style="color: red;">*</span></label>
    </div>

    <button  type="submit">Confirm and Submit</button>
  </section>
  
  <div >
    <button type="button" >Previous</button>
    <span ></span>
    <button type="button" >Next</button>
  </div>
</form>

<script src="script.js"></script>
로그인 후 복사
로그인 후 복사
로그인 후 복사
브라우저에서 HTML 파일을 열면 다음 스크린 샷에서 2 열 레이아웃과 같은 것을 가져와 현재 페이지 표시기 및 탐색으로 완성해야합니다. 바닐라 javaScript 로 기능 추가
이제 HTML 및 CSS 파일과 동일한 디렉토리에 script.js 파일을 작성하고 다음 JavaScript를 붙여 넣습니다.

열린 기본 스크립트

이 스크립트는 양식 섹션의 ID에 해당하는 FormStep 값에 따라 섹션을 표시하고 숨기는 메소드를 정의합니다. 양식의 현재 활성 섹션으로 StepInfo를 업데이트합니다. 이 동적 텍스트는 사용자에게 진행 지표 역할을합니다.

그런 다음 페이지가로드하고 내비게이션 버튼에 이벤트를로드하고 클릭 할 수있는 논리를 추가하여 다른 양식 섹션을 통해 순환 할 수 있습니다. 페이지를 새로 고치면 멀티 단계 양식이 예상대로 작동한다는 것을 알 수 있습니다.

다중 단계 양식 내비게이션 위의 JavaScript 코드가하는 일에 대해 더 깊이 빠져 들자. updatestepvisibility () 함수에서 먼저 모든 섹션을 깨끗한 슬레이트로 숨 깁니다.

그런 다음, 우리는 현재 활성화 된 섹션을 보여줍니다
다음으로, 우리는 지표가 양식을 통해 진행되는 텍스트를 업데이트합니다. 마지막으로, 우리는 첫 번째 단계에 있다면 이전 버튼을 숨기고 마지막 섹션에 있으면 다음 버튼을 숨 깁니다. 페이지가로드 될 때 어떤 일이 발생하는지 살펴 보겠습니다. 먼저 첫 번째 섹션에서 양식이로드되면 이전 버튼을 숨 깁니다.
:root {
  --primary-color: #8c852a;
  --secondary-color: #858034;
}

body {
  font-family: sans-serif;
  line-height: 1.4;
  margin: 0 auto;
  padding: 20px;
  background-color: #f4f4f4;
  max-width: 600px;
}

h1 {
  text-align: center;
}

form {
  background: #fff;
  padding: 40px;
  border-radius: 5px;
  box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
  display: flex;
  flex-direction: column;
}

.form-group {
  display: flex;
  gap: 7%;

}

.form-group > div {
  width: 100%;
}

input:not([type="checkbox"]),
select,
textarea {
  width: 100%;
  padding: 8px;
  border: 1px solid #ddd;
  border-radius: 4px;
}

.form-control {
  margin-bottom: 15px;
}

button {
  display: block;
  width: 100%;
  padding: 10px;
  color: white;
  background-color: var(--primary-color);
  border: none;
  border-radius: 4px;
  cursor: pointer;
  font-size: 16px;

}

button:hover {
  background-color: var(--secondary-color);
}

.group-two, .group-three {
  display: none;
}

.arrows {
  display: flex;
  justify-content: space-between
  align-items: center;
  margin-top: 10px;
}

#navLeft, #navRight {
  width: fit-content;
}

@media screen and (max-width: 600px) {
  .form-group {
    flex-direction: column;
  }
}
로그인 후 복사
로그인 후 복사
로그인 후 복사
그런 다음 다음 버튼을 가져 와서 현재 단계 수를 조건부로 증가시키는 클릭 이벤트를 추가 한 다음 updatestepvisibility () 함수를 호출 한 다음 표시 할 새 섹션을 업데이트합니다.
마지막으로, 우리는 이전 버튼을 잡고 같은 일을하지만 반대로합니다. 여기서 우리는 조건부로 단계 수를 줄이고 updatestepvisibility ()를 호출하고 있습니다.

처리 오류 당신은 그것을 제출하기 위해 양식을 작성하고 모호한 오류를 얻기 위해 양식을 작성하는 데 10 분을 보낸 적이 있습니까? 양식이 제출 버튼에 도달하기 전에

을 수정할 수 있도록 양식이 즉시 무언가가 잘못되었다는 것을 알려 주면 선호합니다. 그것이 우리가 우리 형태로 할 일입니다.

우리의 원칙은 어떤 컨트롤에 오류가 있고 의미있는 오류 메시지를 제공하는지 명확하게 나타내는 것입니다. 사용자가 필요한 조치를 취함에 따라 오류가 발생합니다. 우리 양식에 검증을 추가합시다. 먼저 필요한 입력 요소를 잡고 기존 요소에 추가하겠습니다.

그런 다음 단계를 확인하기 위해 함수를 추가하십시오
유효성 검사 스크립트
<form >
  <section  >
    <div >
      <div >
        <label for="name">Name <span style="color: red;">*</span></label>
        <input type="text"  name="name" placeholder="Enter your name">
      </div>

      <div >
        <label for="idNum">ID number <span style="color: red;">*</span></label>
        <input type="number"  name="idNum" placeholder="Enter your ID number">
      </div>
    </div>

    <div >
      <div >
        <label for="email">Email <span style="color: red;">*</span></label>
        <input type="email"  name="email" placeholder="Enter your email">
      </div>

      <div >
        <label for="birthdate">Date of Birth <span style="color: red;">*</span></label>
        <input type="date"  name="birthdate" max="2006-10-01" min="1924-01-01">
      </div>
    </div>
  </section>

  <section  >
    <div >
      <label for="document">Upload CV <span style="color: red;">*</span></label>
      <input type="file" name="document" >
    </div>

    <div >
      <label for="department">Department <span style="color: red;">*</span></label>
      <select  name="department">
        <option value="">Select a department</option>
        <option value="hr">Human Resources</option>
        <option value="it">Information Technology</option>
        <option value="finance">Finance</option>
      </select>
    </div>
  </section>

  <section  >
    <div >
      <label for="skills">Skills (Optional)</label>
      <textarea  name="skills" rows="4" placeholder="Enter your skills"></textarea>
    </div>

    <div >
      <input type="checkbox" name="terms" >
      <label for="terms">I agree to the terms and conditions <span style="color: red;">*</span></label>
    </div>

    <button  type="submit">Confirm and Submit</button>
  </section>
  
  <div >
    <button type="button" >Previous</button>
    <span ></span>
    <button type="button" >Next</button>
  </div>
</form>

<script src="script.js"></script>
로그인 후 복사
로그인 후 복사
로그인 후 복사
여기서, 우리는 필요한 각 입력에 약간의 값이 있는지 확인하고 이메일 입력에 유효한 입력이 있는지 확인합니다. 그런 다음, 우리는 그에 따라 isvalid boolean을 설정했습니다. 우리는 또한 아직 정의하지 않은 샤워러 () 함수를 호출합니다.
이 코드를 validatestep () 함수 위에 붙여 넣습니다

이제 스타일 시트에 다음 스타일을 추가하십시오

열린 유효성 검사 스타일

:root {
  --primary-color: #8c852a;
  --secondary-color: #858034;
}

body {
  font-family: sans-serif;
  line-height: 1.4;
  margin: 0 auto;
  padding: 20px;
  background-color: #f4f4f4;
  max-width: 600px;
}

h1 {
  text-align: center;
}

form {
  background: #fff;
  padding: 40px;
  border-radius: 5px;
  box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
  display: flex;
  flex-direction: column;
}

.form-group {
  display: flex;
  gap: 7%;

}

.form-group > div {
  width: 100%;
}

input:not([type="checkbox"]),
select,
textarea {
  width: 100%;
  padding: 8px;
  border: 1px solid #ddd;
  border-radius: 4px;
}

.form-control {
  margin-bottom: 15px;
}

button {
  display: block;
  width: 100%;
  padding: 10px;
  color: white;
  background-color: var(--primary-color);
  border: none;
  border-radius: 4px;
  cursor: pointer;
  font-size: 16px;

}

button:hover {
  background-color: var(--secondary-color);
}

.group-two, .group-three {
  display: none;
}

.arrows {
  display: flex;
  justify-content: space-between
  align-items: center;
  margin-top: 10px;
}

#navLeft, #navRight {
  width: fit-content;
}

@media screen and (max-width: 600px) {
  .form-group {
    flex-direction: column;
  }
}
로그인 후 복사
로그인 후 복사
로그인 후 복사
양식을 새로 고치면 입력이 유효한 것으로 간주 될 때까지 버튼이 다음 섹션으로 이동하지 않음을 알 수 있습니다. 마지막으로, 사용자가 올바른 정보를 입력하기 시작하면 오류가 사라지도록 실시간 오류 처리를 추가하려고합니다. validatestep () 함수 : 아래 에이 함수를 추가하십시오

실시간 유효성 검사 스크립트를 열어
이 함수는 입력 및 이벤트를 변경하여 이벤트를 변경 한 다음 오류를 지우기 위해 함수를 호출하여 입력이 더 이상 유효하지 않은 경우 오류를 지 웁니다. 샤워러 () 1 : 아래에 clearerRor () 함수를 붙여 넣습니다
const stepInfo = document.getElementById("stepInfo");
const navLeft = document.getElementById("navLeft");
const navRight = document.getElementById("navRight");
const form = document.getElementById("myForm");
const formSteps = ["one", "two", "three"];

let currentStep = 0;

function updateStepVisibility() {
  formSteps.forEach((step) => {
    document.getElementById(step).style.display = "none";
  });

  document.getElementById(formSteps[currentStep]).style.display = "block";
  stepInfo.textContent = `Step ${currentStep + 1} of ${formSteps.length}`;
  navLeft.style.display = currentStep === 0 ? "none" : "block";
  navRight.style.display =
  currentStep === formSteps.length - 1 ? "none" : "block";
}

document.addEventListener("DOMContentLoaded", () => {
  navLeft.style.display = "none";
  updateStepVisibility();
  navRight.addEventListener("click", () => {
    if (currentStep < formSteps.length - 1) {
      currentStep++;
      updateStepVisibility();
    }
  });

  navLeft.addEventListener("click", () => {
    if (currentStep > 0) {
      currentStep--;
      updateStepVisibility();
    }
  });
});
로그인 후 복사
그리고 이제 사용자가 올바른 값을 입력 할 때 오류가 명확 해집니다. 멀티 단계 양식은 이제 오류를 우아하게 처리합니다. 양식이 끝날 때까지 오류를 유지하기로 결정한 경우 최소한 사용자를 오류 형식 컨트롤로 다시 뛰어 넘어 수정해야 할 오류 수에 대한 표시를 표시하십시오.
. 처리 양식 제출

다단계 형식으로, 제출하기 전에 마지막에 모든 답변에 대한 요약을 사용자에게 보여주고 필요한 경우 답변을 편집 할 수있는 옵션을 제공하는 것이 가치가 있습니다. 그 사람은 뒤로 탐색하지 않고는 이전 단계를 볼 수 없으므로 마지막 단계에서 요약을 보여 주면 확신과 실수를 수정할 수 있습니다. 마크 업에 네 번째 섹션을 추가 하여이 요약보기를 보유하고 제출 버튼을 움직입니다. index.html의 세 번째 섹션 바로 아래에 붙여 넣습니다

html 를 열십시오

그런 다음 JavaScript의 Formstep을 읽으려면 마지막으로, 다음 클래스를 Styles.css에 추가하십시오
formSteps.forEach((step) => {
  document.getElementById(step).style.display = "none";
});
로그인 후 복사
이제, 다른 성단도는 다음과 같은 Script.js 파일의 상단에 다음을 추가합니다.
그런 다음이 함수를 Scripts.js에 추가하십시오

이것은 입력 값을 양식의 요약 섹션에 동적으로 삽입하고 파일 이름을 잘라냅니다. 필요하지 않은 입력에 대한 폴백 텍스트를 제공합니다. 그런 다음 updatestepvisibility () 함수를 업데이트하여 새 함수를 호출합니다.

마지막으로, 이것을 domcontentloaded 이벤트 리스너에 추가하십시오 :
<form >
  <section  >
    <div >
      <div >
        <label for="name">Name <span style="color: red;">*</span></label>
        <input type="text"  name="name" placeholder="Enter your name">
      </div>

      <div >
        <label for="idNum">ID number <span style="color: red;">*</span></label>
        <input type="number"  name="idNum" placeholder="Enter your ID number">
      </div>
    </div>

    <div >
      <div >
        <label for="email">Email <span style="color: red;">*</span></label>
        <input type="email"  name="email" placeholder="Enter your email">
      </div>

      <div >
        <label for="birthdate">Date of Birth <span style="color: red;">*</span></label>
        <input type="date"  name="birthdate" max="2006-10-01" min="1924-01-01">
      </div>
    </div>
  </section>

  <section  >
    <div >
      <label for="document">Upload CV <span style="color: red;">*</span></label>
      <input type="file" name="document" >
    </div>

    <div >
      <label for="department">Department <span style="color: red;">*</span></label>
      <select  name="department">
        <option value="">Select a department</option>
        <option value="hr">Human Resources</option>
        <option value="it">Information Technology</option>
        <option value="finance">Finance</option>
      </select>
    </div>
  </section>

  <section  >
    <div >
      <label for="skills">Skills (Optional)</label>
      <textarea  name="skills" rows="4" placeholder="Enter your skills"></textarea>
    </div>

    <div >
      <input type="checkbox" name="terms" >
      <label for="terms">I agree to the terms and conditions <span style="color: red;">*</span></label>
    </div>

    <button  type="submit">Confirm and Submit</button>
  </section>
  
  <div >
    <button type="button" >Previous</button>
    <span ></span>
    <button type="button" >Next</button>
  </div>
</form>

<script src="script.js"></script>
로그인 후 복사
로그인 후 복사
로그인 후 복사
형식 실행, 요약 섹션에 입력 된 모든 값이 표시되고 정보를 제출하기 전에 사용자가 편집 할 수 있음을 알 수 있습니다. 그리고 이제 우리는 양식을 제출할 수 있습니다 :

우리의 다중 단계 양식은 이제 사용자가 제출하기 전에 제공하는 모든 정보를 편집하고 볼 수 있습니다. 접근성 팁

다단계 양식에 접근 할 수있는 것은 기본 사항으로 시작됩니다 :

시맨틱 html 사용.

이것은 전투의 절반입니다. 적절한 양식 레이블을 사용하여 밀접하게 뒤따른다.
:root {
  --primary-color: #8c852a;
  --secondary-color: #858034;
}

body {
  font-family: sans-serif;
  line-height: 1.4;
  margin: 0 auto;
  padding: 20px;
  background-color: #f4f4f4;
  max-width: 600px;
}

h1 {
  text-align: center;
}

form {
  background: #fff;
  padding: 40px;
  border-radius: 5px;
  box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
  display: flex;
  flex-direction: column;
}

.form-group {
  display: flex;
  gap: 7%;

}

.form-group > div {
  width: 100%;
}

input:not([type="checkbox"]),
select,
textarea {
  width: 100%;
  padding: 8px;
  border: 1px solid #ddd;
  border-radius: 4px;
}

.form-control {
  margin-bottom: 15px;
}

button {
  display: block;
  width: 100%;
  padding: 10px;
  color: white;
  background-color: var(--primary-color);
  border: none;
  border-radius: 4px;
  cursor: pointer;
  font-size: 16px;

}

button:hover {
  background-color: var(--secondary-color);
}

.group-two, .group-three {
  display: none;
}

.arrows {
  display: flex;
  justify-content: space-between
  align-items: center;
  margin-top: 10px;
}

#navLeft, #navRight {
  width: fit-content;
}

@media screen and (max-width: 600px) {
  .form-group {
    flex-direction: column;
  }
}
로그인 후 복사
로그인 후 복사
로그인 후 복사
형태를보다 접근 할 수있는 다른 방법은 작은 화면을 클릭 해야하는 요소에 충분한 공간을 제공하고 양식 내비게이션 및 진행 지표에 대한 의미있는 설명을 제공하는 것이 포함됩니다. 사용자에게 피드백을 제공하는 것이 중요한 부분입니다. 일정 시간 후에는 자동 디스 미스 사용자 피드백이 아니라 사용자가 스스로 해고 할 수 있도록하는 것은 좋지 않습니다. 대비와 글꼴 선택에주의를 기울이는 것도 중요합니다. 둘 다 양식이 얼마나 읽을 수 있는지에 영향을 미치기 때문입니다.

보다 기술적 인 접근성을 위해 마크 업을 다음과 같은 조정을하겠습니다.

기술 1을 제외한 모든 입력에 aria required = "true"를 추가합니다.

이것은 스크린 리더에게 기본 검증에 의존하지 않고 필드가 필요하다는 것을 알 수 있습니다. acd add acd acd add add add add add add add add add add add add add add add add add add add ad add add add ad add ad add ad ad add ad add ad add ad ad add ad add ad ad ad add prans.

이것은 스크린 리더가 입력이 오류 상태에있을 때 중요성을 줄 수 있도록 도와줍니다. . add add add add add add add add add add add add add add add add add add add add add add add add add add add add add add add add add add add add add add add add add add add add add add add add add add ad add ad add add add ad add ad add ad add ad add add ad add ad add ad add ad add ad add ad add ad add add ad add aia-live = "polite".

스크립트 파일에서 샤워러 () 및 clearerRor () 함수를 다음과 함께 바꾸십시오. 여기서, 우리는 입력을 오류 범위와 명시 적으로 묶는 속성을 프로그래밍 방식으로 추가하고 제거하고 그것이 잘못된 상태에 있음을 보여줍니다. . 마지막으로, 모든 섹션의 첫 번째 입력에 중점을 두자. updatestepvisibility () 함수 끝에 다음 코드를 추가하십시오. 그리고 그로 인해 멀티 단계 양식은 훨씬 더 접근 가능합니다.

결론 우리는 구직 응용 프로그램을위한 4 부분으로 된 다중 단계 양식입니다! 이 기사의 맨 위에서 말했듯이, 저글링 할 것이 많습니다. 너무 많은 상자 솔루션을 찾는 것에 대해 잘못을 겪지 않을 것입니다.

. 그러나 다단계 양식을 핸드 롤해야한다면 이제 사형 선고가 아니라는 것을 알기를 바랍니다. 좋은 접근 가능한 관행에서 벗어나지 않고 내비게이션과 검증으로 완성 된 행복한 길이 있습니다.

그리고 이것은 내가 어떻게 접근했는지입니다! 다시, 나는 이것을 내가 얼마나 멀리 얻을 수 있는지 알기 위해 개인적인 도전으로 이것을 취했고, 나는 그것에 매우 만족합니다. 그러나 나는 당신이 이것을 사용자 경험과 접근성을 더욱 염두에 두어 할 수있는 추가 기회가 있는지 알고 싶습니다.

.

참조 다음은이 기사를 쓸 때 내가 언급 한 몇 가지 관련 링크입니다.

웹 양식 (MDN)을 구조화하는 방법 다중 페이지 양식 (w3c.org)
액세스 가능한 양식을 작성 (A11y Project)

위 내용은 바닐라 JavaScript 및 CSS로 다중 단계 양식을 만드는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿