参考资料

  1. HTML DOM 修改
  2. HTML DOM 改变链接的target属性实例
  3. HTML DOM 返回一个iframe中的name属性的值
  4. HTML DOM 返回一个锚的名字 实例
  5. HTML DOM 返回图像映射的某个区域的port 实例
  6. HTML DOM 返回图像映射的某个区域的pathname 实例
  7. HTML DOM为表格指定规则
  8. HTML DOM改变单元格的内容

HTML DOM 将下拉列表变成多行列表

详细介绍

HTML DOM 可以通过 JavaScript 将传统的 <select> 下拉列表转换为多行显示的可选列表。这种转换通常通过将 <select> 元素替换为 <div> 或其他容器元素,并添加自定义样式和交互逻辑来实现。

主要标签

  • <select>: 原始下拉列表

  • <div>: 用于创建多行列表容器

  • <ul>/<li>: 可选方案,用于构建列表项

  • <input type="checkbox">: 用于多选功能

基本用法

<!-- 原始下拉列表 -->
<select id="mySelect" multiple>
  <option value="1">选项1</option>
  <option value="2">选项2</option>
  <option value="3">选项3</option>
</select>

<!-- 转换后的多行列表容器 -->
<div id="multiSelectContainer"></div>

<script>
  // 转换逻辑
  const select = document.getElementById('mySelect');
  const container = document.getElementById('multiSelectContainer');
  
  // 隐藏原始下拉
  select.style.display = 'none';
  
  // 创建多行列表
  Array.from(select.options).forEach(option => {
    const item = document.createElement('div');
    item.textContent = option.text;
    item.dataset.value = option.value;
    container.appendChild(item);
    
    // 添加点击事件
    item.addEventListener('click', () => {
      option.selected = !option.selected;
      item.classList.toggle('selected', option.selected);
    });
  });
</script>

完整实例

<!DOCTYPE html>
<html>
<head>
  <style>
    .multi-select {
      border: 1px solid #ccc;
      max-height: 200px;
      overflow-y: auto;
    }
    .multi-select-item {
      padding: 8px;
      cursor: pointer;
      border-bottom: 1px solid #eee;
    }
    .multi-select-item:hover {
      background-color: #f5f5f5;
    }
    .multi-select-item.selected {
      background-color: #007bff;
      color: white;
    }
  </style>
</head>
<body>
  <select id="fruitSelect" multiple style="display:none;">
    <option value="apple">苹果</option>
    <option value="banana">香蕉</option>
    <option value="orange">橙子</option>
    <option value="grape">葡萄</option>
    <option value="pear">梨</option>
  </select>
  
  <div id="multiSelect" class="multi-select"></div>
  
  <script>
    document.addEventListener('DOMContentLoaded', function() {
      const select = document.getElementById('fruitSelect');
      const multiSelect = document.getElementById('multiSelect');
      
      // 创建多行列表
      Array.from(select.options).forEach(option => {
        const item = document.createElement('div');
        item.className = 'multi-select-item';
        item.textContent = option.text;
        item.dataset.value = option.value;
        
        if (option.selected) {
          item.classList.add('selected');
        }
        
        item.addEventListener('click', function() {
          option.selected = !option.selected;
          this.classList.toggle('selected');
        });
        
        multiSelect.appendChild(item);
      });
    });
  </script>
</body>
</html>

功能扩展

  1. 搜索过滤:添加搜索框过滤选项

  2. 分组显示:按类别分组选项

  3. 全选/反选:添加全选按钮

  4. 动态加载:支持异步加载选项

  5. 拖拽排序:允许用户拖拽排序选项

CSS 扩展

/* 增强样式 */
.multi-select {
  width: 300px;
  border-radius: 4px;
  box-shadow: 0 2px 4px rgba(0,0,0,0.1);
}

.multi-select-header {
  padding: 8px;
  background-color: #f8f9fa;
  border-bottom: 1px solid #ddd;
}

.multi-select-search {
  width: 100%;
  padding: 6px;
  box-sizing: border-box;
  border: 1px solid #ddd;
  border-radius: 3px;
}

.multi-select-footer {
  padding: 8px;
  background-color: #f8f9fa;
  border-top: 1px solid #ddd;
  text-align: right;
}

.multi-select-item.highlighted {
  background-color: #e9f7fe;
}