1. HTML: 问卷的结构和内容。
  2. CSS: 问卷的样式,使其看起来美观、整洁。
  3. JavaScript: 处理用户提交、收集答案并在页面上显示结果的功能。

您可以直接复制下面的代码,保存为一个 .html 文件(survey.html),然后用浏览器打开它即可。

简单的问卷调查网页代码
(图片来源网络,侵删)

完整代码 (survey.html)

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">简单的问卷调查</title>
    <style>
        /* --- 全局样式 --- */
        body {
            font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
            background-color: #f4f7f6;
            color: #333;
            line-height: 1.6;
            margin: 0;
            padding: 20px;
        }
        /* --- 问卷容器 --- */
        .survey-container {
            max-width: 600px;
            margin: 40px auto;
            background-color: #ffffff;
            padding: 30px 40px;
            border-radius: 10px;
            box-shadow: 0 4px 15px rgba(0, 0, 0, 0.1);
        }
        h1 {
            text-align: center;
            color: #2c3e50;
            margin-bottom: 30px;
        }
        /* --- 问题样式 --- */
        .question {
            margin-bottom: 25px;
        }
        .question label {
            display: block;
            font-weight: bold;
            margin-bottom: 10px;
            color: #34495e;
        }
        /* --- 输入控件样式 --- */
        input[type="text"],
        input[type="email"],
        textarea,
        select {
            width: 100%;
            padding: 12px;
            border: 1px solid #ccc;
            border-radius: 5px;
            box-sizing: border-box; /* 确保 padding 不会影响宽度 */
        }
        textarea {
            resize: vertical; /* 允许用户垂直调整大小 */
            min-height: 100px;
        }
        /* --- 单选按钮和复选框的包装器 --- */
        .radio-group, .checkbox-group {
            display: flex;
            flex-direction: column;
            gap: 8px; /* 选项之间的间距 */
        }
        .radio-option, .checkbox-option {
            display: flex;
            align-items: center;
            gap: 8px;
        }
        input[type="radio"],
        input[type="checkbox"] {
            margin: 0;
            width: auto; /* 恢复单选/复选框的原始大小 */
        }
        /* --- 提交按钮 --- */
        .submit-btn {
            display: block;
            width: 100%;
            padding: 15px;
            background-color: #3498db;
            color: white;
            border: none;
            border-radius: 5px;
            font-size: 16px;
            font-weight: bold;
            cursor: pointer;
            transition: background-color 0.3s ease;
        }
        .submit-btn:hover {
            background-color: #2980b9;
        }
        /* --- 结果显示区域 --- */
        #results {
            margin-top: 30px;
            padding: 20px;
            background-color: #eafaf1;
            border: 1px solid #d4edda;
            border-radius: 5px;
            display: none; /* 默认隐藏 */
        }
        #results h2 {
            margin-top: 0;
            color: #155724;
        }
        .result-item {
            margin-bottom: 10px;
        }
        .result-label {
            font-weight: bold;
            display: inline-block;
            min-width: 150px;
        }
    </style>
</head>
<body>
    <div class="survey-container">
        <h1>用户体验调查问卷</h1>
        <form id="surveyForm">
            <!-- 问题1: 文本输入 -->
            <div class="question">
                <label for="userName">1. 您的姓名:</label>
                <input type="text" id="userName" name="userName" required>
            </div>
            <!-- 问题2: 邮箱输入 -->
            <div class="question">
                <label for="userEmail">2. 您的电子邮箱:</label>
                <input type="email" id="userEmail" name="userEmail" required>
            </div>
            <!-- 问题3: 单选按钮 -->
            <div class="question">
                <label>3. 您是如何了解到我们的产品的?</label>
                <div class="radio-group">
                    <div class="radio-option">
                        <input type="radio" id="source1" name="source" value="搜索引擎">
                        <label for="source1">搜索引擎</label>
                    </div>
                    <div class="radio-option">
                        <input type="radio" id="source2" name="source" value="社交媒体">
                        <label for="source2">社交媒体</label>
                    </div>
                    <div class="radio-option">
                        <input type="radio" id="source3" name="source" value="朋友推荐">
                        <label for="source3">朋友推荐</label>
                    </div>
                    <div class="radio-option">
                        <input type="radio" id="source4" name="source" value="其他">
                        <label for="source4">其他</label>
                    </div>
                </div>
            </div>
            <!-- 问题4: 下拉选择 -->
            <div class="question">
                <label for="satisfaction">4. 您对我们的产品满意度如何?</label>
                <select id="satisfaction" name="satisfaction" required>
                    <option value="" disabled selected>-- 请选择 --</option>
                    <option value="非常满意">非常满意</option>
                    <option value="满意">满意</option>
                    <option value="一般">一般</option>
                    <option value="不满意">不满意</option>
                    <option value="非常不满意">非常不满意</option>
                </select>
            </div>
            <!-- 问题5: 复选框 -->
            <div class="question">
                <label>5. 您希望我们增加哪些功能?(可多选)</label>
                <div class="checkbox-group">
                    <div class="checkbox-option">
                        <input type="checkbox" id="feature1" name="features" value="数据分析">
                        <label for="feature1">数据分析</label>
                    </div>
                    <div class="checkbox-option">
                        <input type="checkbox" id="feature2" name="features" value="自动化报告">
                        <label for="feature2">自动化报告</label>
                    </div>
                    <div class="checkbox-option">
                        <input type="checkbox" id="feature3" name="features" value="团队协作">
                        <label for="feature3">团队协作</label>
                    </div>
                    <div class="checkbox-option">
                        <input type="checkbox" id="feature4" name="features" value="移动端应用">
                        <label for="feature4">移动端应用</label>
                    </div>
                </div>
            </div>
            <!-- 问题6: 文本域 -->
            <div class="question">
                <label for="feedback">7. 您有任何其他建议或意见吗?</label>
                <textarea id="feedback" name="feedback" placeholder="请在此输入您的宝贵意见..."></textarea>
            </div>
            <!-- 提交按钮 -->
            <button type="submit" class="submit-btn">提交问卷</button>
        </form>
        <!-- 结果显示区域 -->
        <div id="results">
            <h2>感谢您的参与!</h2>
            <p>您的反馈信息如下:</p>
            <div id="resultsContent"></div>
        </div>
    </div>
    <script>
        // 获取表单和结果区域元素
        const surveyForm = document.getElementById('surveyForm');
        const resultsDiv = document.getElementById('results');
        const resultsContentDiv = document.getElementById('resultsContent');
        // 监听表单的提交事件
        surveyForm.addEventListener('submit', function(event) {
            // 阻止表单的默认提交行为(即刷新页面)
            event.preventDefault();
            // 创建一个对象来存储所有答案
            const formData = new FormData(surveyForm);
            const answers = {};
            // 遍历 FormData,将答案存入 answers 对象
            // 对于复选框,需要特殊处理,因为一个 name 可以对应多个 value
            for (let [key, value] of formData.entries()) {
                if (answers[key]) {
                    // 如果这个 key 已经存在,说明是复选框,将其转换为数组
                    if (Array.isArray(answers[key])) {
                        answers[key].push(value);
                    } else {
                        answers[key] = [answers[key], value];
                    }
                } else {
                    answers[key] = value;
                }
            }
            // 显示结果
            displayResults(answers);
            // 滚动到结果区域
            resultsDiv.scrollIntoView({ behavior: 'smooth' });
        });
        // 显示结果的函数
        function displayResults(answers) {
            let resultsHTML = '';
            // 遍历 answers 对象,生成结果HTML
            for (const question in answers) {
                const label = getQuestionLabel(question);
                let value = answers[question];
                // 如果是复选框的值(数组),将其格式化为字符串
                if (Array.isArray(value)) {
                    value = value.join(', ');
                }
                resultsHTML += `
                    <div class="result-item">
                        <span class="result-label">${label}:</span>
                        <span>${value}</span>
                    </div>
                `;
            }
            resultsContentDiv.innerHTML = resultsHTML;
            resultsDiv.style.display = 'block'; // 显示结果区域
        }
        // 根据表单元素的 name 属性,获取对应的标签文本
        function getQuestionLabel(name) {
            const labelMap = {
                'userName': '您的姓名',
                'userEmail': '您的电子邮箱',
                'source': '您了解到我们的产品的途径',
                'satisfaction': '您对我们的产品满意度',
                'features': '您希望增加的功能',
                'feedback': '其他建议或意见'
            };
            return labelMap[name] || name;
        }
    </script>
</body>
</html>

代码结构解析

HTML (<body> 部分)

  • <form id="surveyForm">: 整个问卷的容器,id 用于让 JavaScript 找到它。
  • <div class="question">: 每个问题的包装器,方便用 CSS 进行样式控制。
  • <label>: 问题的描述,for 属性关联到对应的 input,点击标签时可以聚焦到输入框。
  • 输入控件:
    • type="text": 单行文本输入。
    • type="email": 邮箱输入,浏览器会自动验证格式。
    • type="radio": 单选按钮,同一组(name 相同)的按钮只能选一个。
    • type="checkbox": 复选框,同一组(name 相同)的按钮可以多选。
    • <select>: 下拉选择框。
    • <textarea>: 多行文本输入域。
  • <button type="submit">: 提交按钮,点击它时会触发 formsubmit 事件。
  • <div id="results">: 用于存放提交后显示的结果,默认是隐藏的 (display: none)。

CSS (<style> 部分)

  • body: 设置全局字体、背景色和间距。
  • .survey-container: 问卷的主体样式,如宽度、背景色、阴影和圆角,使其居中显示。
  • .question: 设置每个问题区域的下边距,使布局更清晰。
  • 输入控件样式: 统一了 input, textarea, select 的宽度、内边距和边框,使它们看起来更协调。
  • .radio-group, .checkbox-group: 使用 Flexbox 布局,让单选/复选框的选项垂直排列并对齐,更美观。
  • .submit-btn: 提交按钮的样式,包括背景色、悬停效果等,使其更醒目。
  • #results: 结果区域的样式,使用不同的背景色和边框来区分。

JavaScript (<script> 部分)

  • event.preventDefault(): 这是关键,当用户点击提交按钮时,浏览器默认会刷新页面或跳转,这行代码阻止了默认行为,让我们可以在页面内处理数据。
  • new FormData(surveyForm): FormData 是一个非常方便的 API,它可以自动从 <form> 元素中收集所有输入控件的值,并将其格式化为键值对。
  • 处理复选框: 由于复选框允许多选,同一个 name 会有多个 value,代码中通过检查 answers[key] 是否已存在,来决定是创建一个新数组还是向现有数组添加值,从而正确处理多选情况。
  • displayResults(answers): 这个函数负责将收集到的答案对象,格式化成 HTML 字符串,并插入到 #resultsContent div 中。
  • resultsDiv.style.display = 'block': 将结果区域从隐藏变为显示。
  • resultsDiv.scrollIntoView(...): 在显示结果后,平滑滚动到结果区域,提升用户体验。

这个例子涵盖了网页表单的常见元素和基本交互,是一个很好的起点,您可以根据自己的需求修改问题、选项和样式。

简单的问卷调查网页代码
(图片来源网络,侵删)