【问题标题】:Designing select tag设计选择标签
【发布时间】:2013-10-21 15:41:18
【问题描述】:

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

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

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

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

这里是fiddle

<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;
}

【问题讨论】:

  • +1 喜欢您正在创建的插件
  • 我不知道它是否可能仅使用 CSS(使用背景图像除外),但我能得到的最好的是这样的。 jsfiddle.net/PhuTS/1,
  • @user1671639 谢谢 :) 不过在你们的帮助下是不可能的。
  • 你是如何绕过“没有附带代码的 JS Fiddle 链接”规则的?

标签: html css


【解决方案1】:

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

FIDDLE

注意: IE10- 不支持 pointer-events 属性(不过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; /* <-- */
}

【讨论】:

  • @ Daniel - 添加指针事件:无;直接到 .select-wrapper (而不是 :before 或 :after)不起作用。你能帮我理解为什么吗? +1 答案:)
  • @VijetaShetty :如果将其添加到包含整个选择元素的包装器中 - 则不会在整个选择元素上注册指针事件。
  • 谢谢..这很有趣..顺便说一句,我仍在尝试使用尽可能多的嵌套包装元素来实现这一点。如果我失败了,我会将您的帖子标记为答案。 (这会使我的帖子重复)。
  • @Danield 为什么需要在.select-wrapper:after.select-wrapper:before 中指定pointer-events:none。如果我只保留一个(在 beforeafter 中),它只注册点击文本输入段而不是按钮。为什么我应该将它保留在样式定义中?如果您能解释一下输出.select-wrapper:after.select-wrapper:before 的含义,我会非常高兴。等待您的回复。
  • @RajeshPaul:单击选择标签会触发下拉菜单。如果我在顶部添加(绝对定位的)图层 - 那么显然单击上述图层不会触发下拉菜单。现在psedo元素之前和之后都是选择之上的层。前面包含箭头,后面包含背景
【解决方案2】:

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

Demo

.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;
}

【讨论】:

    【解决方案3】:

    我使用了一个 css3 属性。

        pointer-events:none
    

    查看fiddle

    【讨论】:

    • 我在做小提琴。我没有看到他的回答。正在学习和检查。但是感谢 Vaibhav 的鼓励。
    • 哦,这太棒了,我会接受我的评论,如果是这样,我也会投票赞成:)
    【解决方案4】:

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

    Working Fiddle

    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 **/
    }
    

    Sample fiddle

    【讨论】:

    • 请注意,选项突出到选择元素的右侧。我详细写过这个解决方案here (Approach #1)
    • @Danield 是的......我妥协了。实际上,由于不支持 IE(至少 IE9),我不能使用指针事件。无论如何,我会将您的帖子标记为答案,因为您之前已经解释过了..
    • 谢谢,@Mr_Green。我也喜欢你的设计。 :-)
    【解决方案5】:

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

    你可以在这里下载示例

    https://github.com/yanivsuzana/new_select

    【讨论】:

      猜你喜欢
      • 2021-08-12
      • 1970-01-01
      • 2020-03-13
      • 1970-01-01
      • 2019-04-08
      • 1970-01-01
      • 2014-02-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多