8

我正在尝试设计一个 Select 标签,如下图所示:

在此处输入图像描述

不知何故,我设法通过将选择标签包装在一个 div 中来设计它。但问题是,当我单击设计的箭头时,选择标签无法正常工作或显示所有列表。

我期望的是,当我单击箭头时,选择标签应该显示所有选项。这不会发生,因为箭头部分是使用父包装元素伪元素生成的。我没有使用伪元素选择器选择标签,因为它似乎不起作用

我可以使用父包装器来解决这个问题background-image,但是由于我拥有更改 html 的全部权利,我正在寻找更好的方法,而不使用图像或 JavaScript,即仅使用 CSS。

这是小提琴

<div class="select-wrapper">
    <select>
        <option>EEE</option>
        <option>ECE</option>
        <option>EIE</option>
    </select>
</div>
.select-wrapper {
    display:inline-block;
    border:1px solid #bbbbbb;
    position:relative;
    width:120px;
    -webkit-border-radius:5px;
    -moz-border-radius:5px;
    border-radius:5px;
    margin-top: 10px;
}
.select-wrapper:before{
    content: "";
    position:absolute;
    right: 5px;
    top:8px;
    border-width: 5px 5px 5px 5px;
    border-style: solid;
    border-color: #666666 transparent  transparent  transparent ;
    z-index:3;
}
.select-wrapper:after {
    content:"";
    display:block;
    position:absolute;
    top:0px;
    bottom:0px;
    width:20px;
    right:0px;
    border-left:1px solid #bababa;
    background-color:#ededed;
    -webkit-border-top-right-radius:5px;
    -moz-border-top-right-radius:5px;
    border-top-right-radius:5px;
    -webkit-border-bottom-right-radius:5px;
    -moz-border-bottom-right-radius:5px;
    border-bottom-right-radius:5px;
}
select {
    width:100%;
    background-color:#ededed;
    border:none;
    outline:none;
    padding:0px;
    margin:0px;
    position:relative;
}
4

5 回答 5

4

添加pointer-events:none;到您的伪元素类。

小提琴

注意: IE10- 不支持指针事件属性(caniuse说 IE11 会支持)

所以对于 IE:

要么您必须解决箭头不可点击的问题,要么

您可以使用Modernizr来检测是否支持指针事件 - 如果不支持 (IE10-) - 则恢复为内置箭头的标准。(在这种情况下不使用您的特殊样式类)

.select-wrapper:before{
    content: "";
    position:absolute;
    right: 5px;
    top:8px;
    border-width: 5px 5px 5px 5px;
    border-style: solid;
    border-color: #666666 transparent  transparent  transparent ;
    z-index:3;
    pointer-events:none; /* <-- */
}
.select-wrapper:after {
    content:"";
    display:block;
    position:absolute;
    top:0px;
    bottom:0px;
    width:20px;
    right:0px;
    border-left:1px solid #bababa;
    background-color:#ededed;
    -webkit-border-top-right-radius:5px;
    -moz-border-top-right-radius:5px;
    border-top-right-radius:5px;
    -webkit-border-bottom-right-radius:5px;
    -moz-border-bottom-right-radius:5px;
    border-bottom-right-radius:5px;
    pointer-events:none; /* <-- */
}
于 2013-10-14T05:53:41.323 回答
2

使用:after, :beforepseudo 创建一个虚拟元素,您将其覆盖在您的选择框上,因此您无法触发您的select元素。最好的办法是在background-image这里使用。我从头开始制作了以下内容,您可以查看一下。

演示

.select_wrap {
    width: 180px;  /* Make sure it is less than the select width */
    overflow: hidden;  /* Hide default arrow */
    border: 2px solid #515151;
    border-radius: 5px;
}

select {
    width: 220px; /* Your wish, make sure it overflows parent */
    padding: 5px;
    border: 0;
    background: #f5f5f5; /* Fall back */
    background: url(http://s2.postimg.org/s44rm4vbp/Untitled_1.png), linear-gradient(to bottom,  #f5f5f5 0%,#f6f6f6 47%,#dddddd 100%);
    background-repeat: no-repeat;
    background-size: 30px 30px, auto auto;
    background-position: 150px 0, center center;
}
于 2013-10-14T05:53:03.760 回答
1

我使用了一个 css3 属性。

    pointer-events:none

检查小提琴

于 2013-10-14T06:02:21.360 回答
1

这似乎是设计选择标签的最接近的解决方案。

工作小提琴

HTML

<div class="parent">
    <div class="select-wrapper">
        <select>
            <option>EEE</option>
            <option>ECE</option>
            <option>EIE</option>
        </select>
    </div>
</div>

CSS

.select-wrapper {
    display:inline-block;
    position:relative;
    width:140px;
    -webkit-border-radius:5px;
    -moz-border-radius:5px;
    border-radius:5px;
    margin-top: 10px;
    overflow:hidden;
    background-color:#ededed;
    margin-left:-20px;
    border-right: 1px solid #bababa;
}
.select-wrapper:before {
    content:"";
    position:absolute;
    right: 5px;
    top:8px;
    border-width: 5px 5px 5px 5px;
    border-style: solid;
    border-color: #666666 transparent transparent transparent;
    z-index:3;
}
.select-wrapper:after {
    content:"";
    display:block;
    position:absolute;
    top:0px;
    bottom:0px;
    width:20px;
    right:0px;
    border-left:1px solid #bababa;
    background-color:#ededed;
    -webkit-border-top-right-radius:5px;
    -moz-border-top-right-radius:5px;
    border-top-right-radius:5px;
    -webkit-border-bottom-right-radius:5px;
    -moz-border-bottom-right-radius:5px;
    border-bottom-right-radius:5px;
}
select {
    width:100%;
    background-color:transparent;
    border:none;
    outline:none;
    padding:0px;
    margin:0px;
    position:relative;
    z-index:4;
    margin-left:20px;
    border: 1px solid #bababa;
    border-right: 0px;
    -webkit-border-radius:5px;
    -moz-border-radius:5px;
    border-radius:5px;
}
.parent {
    display:inline-block;
    overflow:hidden;
}

您还可以将选择器与/伪元素选择器:active结合使用,使其更加出色。像这样的东西::after:before

.select-wrapper:active:before{
    /** css here **/
}
.select-wrapper:active:after{
    /** css here **/
}

样品小提琴

于 2013-10-14T07:01:44.570 回答
0

你可以使用我的自定义选择我创建一个新的设计选择元素基于原始的 css 和 jquery

你可以在这里下载示例

https://github.com/yanivsuzana/new_select

于 2014-04-13T16:19:59.547 回答