玩转CSS:用ul li +JS 模拟select,避坑浏览器不兼容。

news2025/2/24 3:21:50

玩转CSS:用ul li +JS 模拟select,避坑浏览器不兼容。

在前端的工作中,经常会遇到 selcet控件,但我们用css来写它的样式时候,总是不那么令人满意,各种浏览器不兼容啊有没有?

那么,我本篇文章就给大家提供一个思路:用UL 和li 模拟 select 控件,让我们用起来可以避免令人心烦的调整样式问题。好了,接下来,我们看图:

本例图片

文档结构

<div class="model-select-box">
    <div id="model-select-text" class="model-select-text" value="" class="">请选择</div>
    <b class="bg1"></b>
    <ul class="model-select-option">
      <li data-option="red" class="red">红色</li>
      <li data-option="orange" class="orange">橙色</li>
      <li data-option="yellow" class="yellow">黄色</li>
      <li data-option="green" class="green">绿色</li>
      <li data-option="cyan" class="cyan">青色</li>
      <li data-option="blue" class="blue">蓝色</li>
      <li data-option="purple" class="purple">紫色</li>
    </ul>
  </div>

CSS样式

*{
    margin:0;
    padding: 0;
}
 ul {
      list-style: none;
    }

.model-select-box {  
  float: left;
  width: auto;
  min-width: 90px;
  height: auto;  
  line-height: 22px;
  margin-right: 10px;  
  position: relative;
  font-size: 0.8rem;
  box-sizing: border-box; 
  z-index: 99;
  transform: translateY(-5px);
  user-select: none;
  background: #ccc;
  border-radius: 5px;
}

.model-select-box:hover .model-select-option{  
  display: block;
}

.model-select-option {
  display: none;
  position: absolute;
  background: #fff;
  width: calc(100% - 2px);
  top:28px;  
  border-radius: 0 0 5px 5px;  
  border: 1px solid #ccc;
}

.model-select-option li {
  padding: 4px 10px;  
  text-align: center;   
}
.model-select-option li a{ 
  color: #666;
  display: block;
  width: 100%;
  height: 30px;
  line-height: 30px;

}

.model-select-option li+li{
  border-top:1px solid #ccc;
}

.model-select-option li:hover{
  color: #000;
  font-weight: 700;

}

/* 小三角 */
.bg1{
  position: absolute;
  top:12px;
  right:10px;
  border-width: 6px;
  border-style: solid;
  border-color: #666 transparent transparent transparent;  
}
.model-select-text{
  display: block;
  padding: 4px 10px;  
  padding-right: 20px;
}

.red,
.orange,
.yellow,
.green,
.cyan,
.blue,
.purple{
  display: block;
  padding: 4px 10px;  
  padding-right: 20px;
  cursor: pointer; 
  color: #666;   
}
.model-select-text{
  color: #666;
}

.red{  background: red;  }
.orange{ background:orange;  }
.yellow{ background:yellow;  }
.green{ background:green;  }
.cyan{ background:cyan;  }
.blue{ background:blue;   }
.purple{ background:purple;  }

在这里,我们预先隐层了UL,然后使用hover 显示了隐藏起来的ul。原理很简单,大家分析一下上面CSS样式表即可。

JQ代码

接下来,我们就要实现li 点击后,将li设置为选中状态,并且,将 被选中的li的value传递给 目标div。这里,必然需要用到js。那么,我们看代码:

/*
     * 模拟网页中所有的下拉列表select
     */
    function selectModel() {
      var $box = $('div.model-select-box');
      var $option = $('ul.model-select-option', $box);
      var $txt = $('div.model-select-text', $box);
      var speed = 10;
      var $bg = $('b.bg1',$box)

      
      // 点击小三角
      $bg.click(function(){
        $option.not($(this).siblings('ul.model-select-option')).slideUp(speed, function () {
        });
        $(this).siblings('ul.model-select-option').slideToggle(speed, function () {
          // int($(this));
        });
        return false;
      })
      /*
       * 单击某个下拉列表时,显示当前下拉列表的下拉列表框
       * 并隐藏页面中其他下拉列表
       */
      $txt.click(function (e) {
        $option.not($(this).siblings('ul.model-select-option')).slideUp(speed, function () {
        });
        $(this).siblings('ul.model-select-option').slideToggle(speed, function () {
          // int($(this));
        });
        return false;
      });
      //点击选择,关闭其他下拉
      /*
       * 为每个下拉列表框中的选项设置默认选中标识 data-selected
       * 点击下拉列表框中的选项时,将选项的 data-option 属性的属性值赋给下拉列表的 data-value 属性,并改变默认选中标识 data-selected
       * 为选项添加 mouseover 事件
       */
        $option.find('li').each(function(index,element){
          // console.log($(this) + '1');
          if($(this).hasClass('selected')){
            $(this).parent('.model-select-option').siblings('.model-select-text').text($(this).text())
          }
          
          $(this).mousedown(function(){
            $(this).parent().siblings('#model-select-text').text($(this).text()).attr('class', $(this).attr('data-option'));

              $option.slideUp(speed, function () {
              });
              $(this).addClass('selected').siblings('li').removeClass('selected');
              return false;
          })

          $(this).on('mouseover',function(){
            $(this).addClass('selected').siblings('li').removeClass('selected');
          })
        })
      //点击文档,隐藏所有下拉
      $(document).click(function (e) {
        $option.slideUp(speed, function () {
        });
      });      
    }
    selectModel();
  })

还有,别忘了引用 JQ库

<script src="jquery-3.6.3.min.js"></script>

大功告成

好了,至此,这个用ul li模拟select的功能代码就算完成了,具体表现可以通过修改样式表来实现。

看完了的同学,请帮忙点赞+关注+评论!谢谢!

完整代码下载点这里

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1954395.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Datawhale AI 夏令营——AI+逻辑推理——Task1

# Datawhale AI 夏令营 夏令营手册&#xff1a;从零入门 AI 逻辑推理 比赛&#xff1a;第二届世界科学智能大赛逻辑推理赛道&#xff1a;复杂推理能力评估 代码运行平台&#xff1a;魔搭社区 比赛任务 本次比赛提供基于自然语言的逻辑推理问题&#xff0c;涉及多样的场景&…

27K star!有没有显卡都能搞,快速基于LLM构建本地智能知识库

觉得搞一个AI的智能问答知识库很难吗&#xff1f;那是你没有找对方向和工具&#xff0c; 今天我们分享一个开源项目&#xff0c;帮助你快速构建基于Langchain 和LLM 的本地知识库问答&#xff0c;在GitHub已经获得27K star&#xff0c;它就是&#xff1a;Langchain-Chatchat L…

在Spring项目中使用Maven和BCrypt来实现修改密码功能

简介 在数字时代&#xff0c;信息安全的重要性不言而喻&#xff0c;尤其当涉及到个人隐私和账户安全时。每天&#xff0c;无数的用户登录各种在线服务&#xff0c;从社交媒体到银行账户&#xff0c;再到电子邮件和云存储服务。这些服务的背后&#xff0c;是复杂的系统架构&am…

进程间关系

目录 亲缘关系 进程组关系 会话关系 孤儿态进程 亲缘关系 亲缘关系主要体现于父子进程&#xff0c;子进程父进程创建&#xff0c;代码继承于父进程&#xff0c;父进程负责回收&#xff0c;子进程诞生至结束父进程全程参与&#xff0c;这种称为强亲缘关系。 系统开机后&…

企业级数据分析平台合集介绍

企业发展离不开数据分析&#xff0c;数据分析推动着企业运营、决策和战略规划。它正逐步深入到各行各业的核心业务流程中&#xff0c;从传统的金融、零售、制造业扩展到医疗健康、教育、能源等更多领域。企业正通过数据分析平台实现数据资源的最大化利用&#xff0c;推动业务与…

wireshark--流量分析利器

&#x1f3bc;个人主页&#xff1a;金灰 &#x1f60e;作者简介:一名简单的大一学生;易编橙终身成长社群的嘉宾.✨ 专注网络空间安全服务,期待与您的交流分享~ 感谢您的点赞、关注、评论、收藏、是对我最大的认可和支持&#xff01;❤️ &#x1f34a;易编橙终身成长社群&#…

基于微信小程序的课堂考勤系统的设计与实现(论文+源码)_kaic

基于微信小程序的课堂考勤系统的设计与实现 摘 要 在高校教育普及的今天&#xff0c;学生人数日益增多&#xff0c;为保证课堂质量&#xff0c;教师多要在课前进行考勤。因此本设计提出基于微信小程序的课堂考勤系统&#xff0c;增加了定位功能&#xff0c;避免了“假打卡”…

探索大型语言模型LLama 2:原理揭秘与代码实践

一、引言 1.1 大型语言模型的重要性 大型语言模型作为人工智能领域的重要研究方向&#xff0c;近年来取得了显著的成果。这些模型在自然语言处理、机器翻译、对话系统、文本生成等领域展现了强大的能力&#xff0c;为人类带来了诸多便利。大型语言模型的出现&#xff0c;使得…

卓码软件测评:软件功能测试和非功能测试详情介绍

随着信息技术的不断发展&#xff0c;软件在我们日常生活与工作中扮演着越来越重要的角色。然而&#xff0c;软件质量的好坏直接关系到使用者的体验和企业的声誉。在软件开发过程中&#xff0c;功能测试和非功能测试作为保证软件质量的重要手段&#xff0c;受到了越来越多的关注…

web后端--Spring事务管理

事务也要日志配置 !!!!debug前面记得加空格 logging:level:org.springframework.jdbc.support.JdbcTransactionManager: debugrollbackFor 默认情况下&#xff0c;只有出现RunTimeException才会回滚事务&#xff0c;rollbackfor属性用于控制出现何种异常类型&#xff0c;回滚…

Flink内存管理机制

前言 在Flink的后台界面&#xff0c;可以看到整个Flink的内存情况。 如JobManager的内存情况&#xff1a; TaskManager的内存情况 一、Flink内存管理 Flink TaskManager内存组成整体结构图如下&#xff1a; 二、总内存管理 三、JobManager内存管理内存管理 四、TaskManager内…

运算符优先级、赋值运算符、一元运算符、逻辑运算符

运算符优先级 字符串 布尔 null undefined 赋值运算符 一元运算符 逻辑运算符 && 逻辑与 ||逻辑或 &#xff1f;&#xff1f;空值合并运算符 称为空值合并运算符&#xff0c;它是ES6的一个新特性&#xff0c;它的作用是当一个表达式是nul或者undefined时为变量设…

Pip换源使用帮助

PyPI 镜像使用帮助 PyPI 镜像帮助提高包安装的速度&#xff0c;特别是当默认源访问较慢时。镜像每次同步成功后&#xff0c;每隔 5 分钟进行更新&#xff0c;确保镜像内容尽量与官方源保持一致。 pip 临时使用 如果您只想在一次安装中使用镜像&#xff0c;可以使用以下命令&…

嵌入式到底是啥嵌入了啥?

嵌入式系统&#xff08;Embedded System&#xff09;是指一个专用的计算机系统&#xff0c;它作为一个装置或系统的一部分被嵌入其中&#xff0c;来实现特定的功能。我收集归类了一份嵌入式学习包&#xff0c;对于新手而言简直不要太棒&#xff0c;里面包括了新手各个时期的学习…

项目比赛经验分享:如何让即兴发言出彩

项目比赛经验分享&#xff1a;如何让即兴发言出彩 前言1. 顺势趁便法2. 词语撮要法3. 起承转合法4. 数字串连法结语 在项目管理和比赛的激烈竞争中&#xff0c;即兴发言往往成为展示个人魅力和团队精神的重要环节。如何在短时间内组织语言&#xff0c;表达清晰、有力的观点&…

Python代码规范!详细说明!

背景 最近在协作开发过程中&#xff0c;遇到了诸多问题。总结下来主要有两点大问题 代码风格不统一&#xff0c;代码习惯问题严峻。系统解耦不清晰&#xff0c;信息传输不清晰。 于是打算针对市面上常见的代码规范进行强调&#xff0c;结果在查看Google python代码规范文档的…

098、Python 通过编程实现发送邮件的方法

要通过Python编程实现发送邮件&#xff0c;首先得先登录自己的发送邮箱对发送进行相关设置。 一、进行发送邮箱相关设置 1、如下图&#xff0c;点击设置->POP3/SMTP/IMAP 2、然后开启POP3/SMTP服务&#xff0c;并获取授权码和SMTP服务器的地址&#xff0c;如下图&#xff…

Dify中HTTP请求节点的常见操作

HTTP节点包括API请求类型&#xff08;GET、POST、HEAD、PATCH、PUT、DELETE&#xff09;&#xff0c;鉴权类型&#xff08;无、API-Key基础、API-Key Bearer、API-Key自定义&#xff09;&#xff0c;HEADERS键值设置&#xff0c;PARAMS键值设置&#xff0c;BODY&#xff08;non…

springboot高校生就业系统-计算机毕业设计源码99877

基于内容过滤算法的高校生就业系统的设计与实现 摘 要 在当今信息时代&#xff0c;学校以学生信息管理为导向&#xff0c;企业以学生就业持续创新为目标。为满足这一需求&#xff0c;设计一款高校生就业信息管理系统至关重要。该系统涵盖了系统用户管理、岗位信息管理、企业展示…

Channel应用示例

本地文件写数据,如果没有文件创建文件 /*** 使用ByteBuffer(缓冲)和FileChannel(通道),将Hello NIO写入到file01.txt文件中* 如果文件不存在创建文件* author hrui* date 2024/7/27 22:27*/ public class NIOFileChannel01 {public static void main(String[] args) throws I…