| <!DOCTYPE html>
|
| <html lang="ko">
|
| <head>
|
| <meta charset="UTF-8">
|
| <meta name="viewport" content="width=device-width, initial-scale=1.0">
|
| <title>인적자원관리 퀴즈</title>
|
| <style>
|
| * , *::before, *::after { box-sizing: border-box; }
|
| body {
|
| font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
|
| line-height: 1.6;
|
| margin: 0;
|
| background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
|
| color: #1a202c;
|
| min-height: 100vh;
|
| padding: 20px;
|
| overflow-x: hidden;
|
| }
|
| .container {
|
| max-width: 720px;
|
| margin: 0 auto;
|
| padding: 0 16px;
|
| }
|
| .quiz-header {
|
| background: rgba(255, 255, 255, 0.95);
|
| backdrop-filter: blur(20px);
|
| border-radius: 20px;
|
| padding: 30px;
|
| margin-bottom: 25px;
|
| box-shadow: 0 20px 40px rgba(0, 0, 0, 0.1);
|
| border: 1px solid rgba(255, 255, 255, 0.2);
|
| text-align: center;
|
| }
|
| .quiz-title {
|
| font-size: clamp(22px, 6vw, 28px);
|
| font-weight: 700;
|
| margin: 0 0 15px 0;
|
| background: linear-gradient(135deg, #667eea, #764ba2);
|
| -webkit-background-clip: text;
|
| -webkit-text-fill-color: transparent;
|
| background-clip: text;
|
| }
|
| .card {
|
| background: rgba(255, 255, 255, 0.95);
|
| backdrop-filter: blur(20px);
|
| border-radius: 16px;
|
| padding: 24px;
|
| margin: 16px 0;
|
| box-shadow: 0 20px 40px rgba(0, 0, 0, 0.1);
|
| border: 1px solid rgba(255, 255, 255, 0.2);
|
| }
|
| .question-text {
|
| font-size: clamp(16px, 4.5vw, 18px);
|
| font-weight: 500;
|
| line-height: 1.7;
|
| margin-bottom: 20px;
|
| color: #2d3748;
|
| }
|
| .choice {
|
| display: block;
|
| border: 2px solid #e2e8f0;
|
| border-radius: 12px;
|
| padding: 14px 16px;
|
| margin: 10px 0;
|
| background: white;
|
| cursor: pointer;
|
| transition: all 0.3s ease;
|
| font-weight: 500;
|
| font-size: clamp(16px, 5vw, 18px);
|
| color: #4a5568;
|
| width: 100%;
|
| text-align: left;
|
| }
|
| .choice:hover {
|
| border-color: #667eea;
|
| background: #f7fafc;
|
| transform: translateX(4px);
|
| }
|
| .choice.selected {
|
| border-color: #667eea;
|
| background: linear-gradient(135deg, #ebf4ff, #e6fffa);
|
| color: #2b6cb0;
|
| box-shadow: 0 4px 12px rgba(102, 126, 234, 0.2);
|
| }
|
| .btn {
|
| background: linear-gradient(135deg, #667eea, #764ba2);
|
| color: white;
|
| border: none;
|
| border-radius: 12px;
|
| padding: 12px 20px;
|
| cursor: pointer;
|
| font-weight: 500;
|
| font-size: 15px;
|
| transition: all 0.3s ease;
|
| box-shadow: 0 4px 15px rgba(102, 126, 234, 0.3);
|
| margin: 10px 5px;
|
| }
|
| .btn:hover:not(:disabled) {
|
| transform: translateY(-2px);
|
| box-shadow: 0 8px 25px rgba(102, 126, 234, 0.4);
|
| }
|
| .btn:disabled {
|
| opacity: 0.5;
|
| cursor: not-allowed;
|
| }
|
| .status-bar {
|
| background: rgba(255, 255, 255, 0.9);
|
| backdrop-filter: blur(10px);
|
| border-radius: 15px;
|
| padding: 12px 18px;
|
| margin-bottom: 16px;
|
| display: flex;
|
| justify-content: space-between;
|
| align-items: center;
|
| gap: 8px;
|
| box-shadow: 0 8px 20px rgba(0, 0, 0, 0.08);
|
| border: 1px solid rgba(255, 255, 255, 0.3);
|
| }
|
| .progress-info {
|
| font-weight: 500;
|
| color: #4a5568;
|
| }
|
| .score-display {
|
| background: linear-gradient(135deg, #48bb78, #38a169);
|
| color: white;
|
| padding: 8px 14px;
|
| border-radius: 20px;
|
| font-weight: 600;
|
| font-size: 14px;
|
| box-shadow: 0 4px 12px rgba(72, 187, 120, 0.3);
|
| }
|
|
|
|
|
| @media (max-width: 480px) {
|
| body { padding: 8px; }
|
| .container { padding: 0 6px; max-width: 100%; }
|
| .quiz-header { padding: 18px; border-radius: 16px; }
|
| .card { padding: 16px; border-radius: 14px; }
|
| .question-text { margin-bottom: 16px; }
|
| .choice { padding: 14px 16px; margin: 8px 0; font-size: clamp(17px, 5.4vw, 19px); }
|
| .status-bar { flex-direction: column; align-items: stretch; text-align: center; }
|
| .btn { padding: 12px 18px; font-size: 15px; }
|
| }
|
| </style>
|
| </head>
|
| <body>
|
| <div class="container">
|
| <div class="quiz-header">
|
| <h1 class="quiz-title">인적자원관리 퀴즈</h1>
|
| </div>
|
|
|
| <div class="status-bar">
|
| <div id="status" class="progress-info">문항 1/16</div>
|
| <div class="score-display">점수: <span id="score-text">0/16</span></div>
|
| </div>
|
|
|
| <div id="quiz"></div>
|
|
|
| <div style="text-align: center; margin-top: 20px;">
|
| <button id="prev" class="btn">← 이전</button>
|
| <button id="next" class="btn">다음 →</button>
|
| </div>
|
| </div>
|
|
|
| <script>
|
|
|
| const questions = [
|
| {
|
| "qtype": "mcq",
|
| "prompt": "조직이 더욱 커져 해외로 진출하거나 글로벌 지점을 늘리는 등 운영 범위가 확장될 때 나타납니다.해외 사업장의 법인장이나 임원들을 관리해야 할 필요성이 생기면서, 인사 담당 임원 (전무, 부사장, 상무 등)을 조직에 보직합니다. 이와 같은 인적자원관리의 유형을 무엇이라 하는가?",
|
| "choices": [
|
| "원시적인사관리(PPM)",
|
| "인사관리(PM)",
|
| "인적자원관리(HRM)",
|
| "전략적인적자원관리(SHRM)"
|
| ],
|
| "answer": "전략적인적자원관리(SHRM)"
|
| },
|
| {
|
| "qtype": "mcq",
|
| "prompt": "다음 중 직무분석에 활용에 대해 틀린 내용을 고르시오.",
|
| "choices": [
|
| "직무분석을 기초로 직무가치를 산정하고 보상체계에 반영할 수 있다.",
|
| "직무 분석은 조직 내에 존재하는 각 직무의 구체적인 내용, 요건, 역할과 책임을 체계적으로 분석하고 정의하는 활동. 인사 관리의 기초.",
|
| "직무 기술서는 직무 분석을 통해 도출된 결과물로, 특정 직무를 구성하는 일의 전체 내용(과업, 절차, 책임 등)을 기술한 문서. 채용, 평가, 교육 등의 기준으로 활용.",
|
| "경력개발을 위한 직무수행 요구조건(지식, 기술 등) 정립 및 이동, 승진을 위한 필요한 자료 제공 및 교육훈련 정보 제공"
|
| ],
|
| "answer": "직무분석을 기초로 직무가치를 산정하고 보상체계에 반영할 수 있다."
|
| }
|
| ];
|
|
|
| let idx = 0;
|
| let score = 0;
|
| let state = new Map();
|
| let finished = false;
|
|
|
| function getState(i) {
|
| if (!state.has(i)) {
|
| state.set(i, {selected: null, correct: false, revealed: false, scored: false});
|
| }
|
| return state.get(i);
|
| }
|
|
|
| function normalize(s) {
|
| return (s || '').toString().replace(/[\s ]+/g, '').toLowerCase();
|
| }
|
|
|
| function select(val) {
|
| const q = questions[idx];
|
| const st = getState(idx);
|
| if (st.revealed) return;
|
| st.selected = val;
|
| st.correct = normalize(val) === normalize(q.answer);
|
| render();
|
| }
|
|
|
| function render() {
|
| const quiz = document.getElementById('quiz');
|
| quiz.innerHTML = '';
|
|
|
| if (finished) {
|
| const done = document.createElement('div');
|
| done.className = 'card';
|
| done.innerHTML = `
|
| <div style="text-align: center;">
|
| <h2>퀴즈 완료! 🎉</h2>
|
| <p>최종 점수: ${score}/${questions.length} (${Math.round(score/questions.length*100)}%)</p>
|
| <button class="btn" onclick="restart()">다시 시작하기</button>
|
| </div>
|
| `;
|
| quiz.appendChild(done);
|
| return;
|
| }
|
|
|
| const q = questions[idx];
|
| const st = getState(idx);
|
|
|
| const card = document.createElement('div');
|
| card.className = 'card';
|
|
|
| const questionDiv = document.createElement('div');
|
| questionDiv.className = 'question-text';
|
| questionDiv.textContent = q.prompt;
|
| card.appendChild(questionDiv);
|
|
|
| if (q.choices && q.choices.length) {
|
| q.choices.forEach((c, i) => {
|
| const btn = document.createElement('button');
|
| btn.className = 'choice';
|
| btn.textContent = (i + 1) + '. ' + c;
|
| btn.onclick = () => select(c);
|
|
|
| const stNow = getState(idx);
|
| if (stNow.revealed) {
|
| btn.disabled = true;
|
| btn.style.cursor = 'default';
|
| if (normalize(c) === normalize(q.answer)) {
|
| btn.style.borderColor = '#48bb78';
|
| btn.style.background = 'linear-gradient(135deg, #f0fff4, #ebf8ff)';
|
| btn.style.color = '#2f855a';
|
| }
|
| }
|
|
|
| if (stNow.selected === c) {
|
| btn.classList.add('selected');
|
| }
|
|
|
| card.appendChild(btn);
|
| });
|
| }
|
|
|
| const btnWrap = document.createElement('div');
|
| btnWrap.style.textAlign = 'center';
|
| btnWrap.style.marginTop = '12px';
|
|
|
| const submitBtn = document.createElement('button');
|
| submitBtn.className = 'btn';
|
| submitBtn.textContent = '정답 확인';
|
| submitBtn.onclick = () => reveal();
|
|
|
| const nextBtn = document.createElement('button');
|
| nextBtn.className = 'btn';
|
| nextBtn.textContent = '다음 문항';
|
| nextBtn.onclick = () => gotoNext();
|
|
|
| btnWrap.appendChild(submitBtn);
|
| btnWrap.appendChild(nextBtn);
|
| card.appendChild(btnWrap);
|
|
|
| quiz.appendChild(card);
|
|
|
|
|
| document.getElementById('status').textContent = `문항 ${idx+1}/${questions.length}`;
|
| document.getElementById('score-text').textContent = `${score}/${questions.length}`;
|
|
|
|
|
| document.getElementById('prev').disabled = (idx === 0);
|
| document.getElementById('next').disabled = (idx >= questions.length - 1);
|
| }
|
|
|
| function reveal() {
|
| const st = getState(idx);
|
| if (st.revealed) return;
|
| const q = questions[idx];
|
| if (st.selected == null) return;
|
| st.revealed = true;
|
| if (!st.scored && st.correct) {
|
| score += 1;
|
| st.scored = true;
|
| }
|
| render();
|
| }
|
|
|
| function gotoNext() {
|
| if (idx < questions.length - 1) {
|
| idx += 1;
|
| render();
|
| } else {
|
| finished = true;
|
| render();
|
| }
|
| }
|
|
|
| function restart() {
|
| idx = 0;
|
| score = 0;
|
| state = new Map();
|
| finished = false;
|
| render();
|
| }
|
|
|
|
|
| document.getElementById('prev').addEventListener('click', () => {
|
| if (idx > 0) {
|
| idx -= 1;
|
| render();
|
| }
|
| });
|
| document.getElementById('next').addEventListener('click', () => {
|
| if (idx < questions.length - 1) {
|
| idx += 1;
|
| render();
|
| }
|
| });
|
|
|
|
|
| render();
|
| </script>
|
| </body>
|
| </html> |