最近工作时解决了一个前端小问题(如下图所示):在Safari中,select的控件之上有不和谐的灰色部分。 刚开始时我以为是backgrand或是border设置不当之类产生的问题,在搜索了很久之后终于找到了问题所在:这个灰色部分来自于Safari默认的select设计,所以我需要用 appearance: none 来去除默认设计,但是这样一来,右侧的小箭头就会消失。本文将会详细描述我是如何添加小箭头的,该方法灵感来自于上司,目前没有在网上找到类似答案(当然网上也有不少别的好方法:比如使用background添加一个url的小箭头图片)。

我先直接附上我的方法,采用了一个自己编的例子便于讲解。

 <html>
<head>
<style type="text/css">
#selectDiv select {
-webkit-appearance: none;
-moz-appearance: none;
-ms-appearance: none;
width: 100px;
background-color: transparent;
font-size: 16px;
padding: 3px 15px;
margin: 0;}
#selectDiv {
width: 100px;
}
#selectDiv:after {
content: '<>';
font: 13px Consolas,monospace;
color: #000;
font-weight: 700;
-webkit-transform: rotate(90deg);
-moz-transform: rotate(90deg);
-ms-transform: rotate(90deg);
transform: rotate(90deg);
position: absolute;
left: 85px;
top: 14px;
pointer-events: none;
}
</style>
</head>
<body>
<div id="selectDiv">
<select>
<option value="apple">Apple</option>
<option value="banana">Banana</option>
<option value="orange">Orange</option>
<option value="pear">Pear</option>
</select>
</div>
</body>
</html>

Safari (11.1)和Chrome (66.0.3359.139) 中最终的效果如下图:

Firefox (59.0.2) 中最终的效果如下图:

以上存在差别是由于依然还有默认的border设置,所以只需要再加上自定义的border设置就好了。

(如果你看懂了上面的代码,那你就不需要继续看下面的解释;如果你对其中的css有疑惑,那么你可能可以从下文中找到答案。如果你看完本文后有任何意见,欢迎留言。)

 

基本思路

简而言之,就是将<>符号旋转九十度就能得到一个类似于向上向下的小箭头,很简洁,而且可以根据自己的喜好调整大小粗细和风格。

部分CSS详解及注意事项

1.  ::after (:after)

这是伪元素,两个冒号是CSS3中的写法,是为了将其与伪类(:hover/:active等)区分。一个冒号是CSS2中的写法,但是为了兼容,很多浏览器依然支持一个冒号的写法。这个能产生一个在原有元素之后的元素,默认是与原有元素在同一行的。我认为用这个伪元素比另建一个div更方便。

2.  -webkit-appearance: none; -moz-appearance: none; -ms-appearance: none; 

这个作用就是去除浏览器中默认的格式,-webkit- 作用于Chrome,-moz-作用于Firfox,-ms-作用于IE,相同的道理也适用于之后的transform

3. <>字体需要挑选

这两个符号在某些字体时可能会连接在一起或是形状不合适,所以需要挑选合适的字体以得到满意的图案。效果图中展示的是Consolas字体,另外我还写了另一个字体monospace备选。后者的形状会尖一些。建议大家再尝试看看别的字体,也许有更合适的。另外,符号是否加粗和字体大小就全凭个人感觉了。

4.  pointer-events: none;

加上这句的效果直接体现在点击符合与点击框中别的地方的效果相同,如果少了这段文字,则会使点击符号时选项不会展开。某官方解释是“元素永远不会成为鼠标事件的target。但是,当其后代元素的pointer-events属性指定其他值时,鼠标事件可以指向后代元素,在这种情况下,鼠标事件将在捕获或冒泡阶段触发父元素的事件侦听器。”大家自行理解一下。

5. 在select之外包裹div

我在select之外加了父元素,因为我发现我无法直接添加select:after。(如果有人知道原因,欢迎留言!)

一个select元素自定义设计的新思路:appearance: none之后利用<>符号制造小箭头的更多相关文章

  1. javascript操作select元素一例

    熟悉一下js对select元素的操作,html页面中建立一个form,其中包含一个select元素和submit按钮. 当选择select中某一项时改变其文字,当select中所有项的文字都改变后,重 ...

  2. 【笔记】css 自定义select 元素的箭头样式

    原文链接:https://www.imooc.com/qadetail/187585?t=281881 最近项目需要自定义select 元素的样式,搜索了一下发现了通过设置select 元素 css ...

  3. add() 方法用于向 <select> 添加一个 <option> 元素。

    //add() 方法用于向 <select> 添加一个 <option> 元素. //new Option() 创建一个option标签 school.add(new Opti ...

  4. 如何改变 select 元素的高度

    mozilla 对于美化 select 元素的样式有这样一段描述(用 CSS 美化 Select 元素): 众所周知,select 元素很难用 CSS 进行高效的设计.你可以影响任何元素的某些方面 - ...

  5. 解密jQuery事件核心 - 自定义设计(三)

    接上文http://www.cnblogs.com/aaronjs/p/3447483.html 本文重点:自定义事件 “通过事件机制,可以将类设计为独立的模块,通过事件对外通信,提高了程序的开发效率 ...

  6. jquery美化select,自定义下拉框样式

    select默认的样式比较丑,有些应用需要美化select,在网上找到一个很好的美化样式效果,本人很喜欢,在这里分享一下. <!DOCTYPE html PUBLIC "-//W3C/ ...

  7. petshop4.0 具体解释之中的一个(系统架构设计)

    前言:PetShop是一个范例,微软用它来展示.Net企业系统开发的能力.业界有很多.Net与J2EE之争,很多数据是从微软的PetShop和Sun的PetStore而来.这样的争论不可避免带有浓厚的 ...

  8. Mybatis --- 映射文件、参数处理、参数值的获取、select元素

    映射文件:指导着MyBatis如何进行数据库增删改查, 有着非常重要的意义:   - cache   命名空间的二级缓存配置 - cache-ref   其他命名空间缓存配置的引用. - result ...

  9. select元素中设置padding效果

    更新2016-9-17:这个bug是在mac os上的发生,在window系统中不存在这个问题! 给select元素增加:padding-left:20px;但是未生效,如下图所示: 在select上 ...

随机推荐

  1. C++Primer第五版学习笔记

    <C++ Primer>Learning Note 程序实例下载地址:http://www.informit.com/title/0321714113 第一章            开始 ...

  2. python——python3.6环境搭建(Windows10,64位)

    1.python软件资源下载 1.1 打开python官网地址:https://www.python.org 1.2 根据自己电脑的设置选择下载合适的python3.6.2 1.3 此处选择windo ...

  3. redis.clients.jedis.exceptions.JedisDataException: ERR invalid DB index

    添加redis配置文件, 启动后,调用报错  redis.clients.jedis.exceptions.JedisDataException: ERR invalid DB index ERR i ...

  4. 【Python 12】汇率兑换5.0(Lambda函数)

     1.案例描述 设计一个汇率换算程序,其功能是将美元换算成人民币,或者相反. 2.0增加功能:根据输入判断是人民币还是美元,进行相应的转换计算 3.0增加功能:程序可以一直运行,知道用户选择退出 4. ...

  5. 【Python 05】Python开发环境搭建

    Python3安装和使用 1.安装 Python管方下载地址 选择Customize installation安装,并且勾选Add Python 3.X to PATH. 勾选Documentatio ...

  6. 新建swap分区的规划、挂载和自动挂载示例

    注:来自Linux系统管理_磁盘分区和格式化的扩展 Linux系统管理_磁盘分区和格式化:http://murongqingqqq.blog.51cto.com/2902694/1361918 思路: ...

  7. JS库创建

    建立js库模板 (function (){ function $(){ alert("被调用到喽!"); /*alert()是JavaScript脚本语言中窗口window对象的一 ...

  8. canvas如何自适应屏幕大小

    可以用JS监控屏幕大小,然后调整Canvas的大小.在代码中加入JS $(window).resize(resizeCanvas);  function resizeCanvas() {        ...

  9. 洛谷 P1049 装箱问题

    \[传送门在这呢!!\] 题目描述 有一个箱子容量为\(V\)(正整数,\(0 \le V \le 20000\)),同时有\(n\)个物品(\(0<n \le 30\),每个物品有一个体积(正 ...

  10. Linux内存管理 (1)物理内存初始化

    专题:Linux内存管理专题 关键词:用户内核空间划分.Node/Zone/Page.memblock.PGD/PUD/PMD/PTE.lowmem/highmem.ZONE_DMA/ZONE_NOR ...