problem with <select> and :after with CSS in WebKit

后端 未结 9 605
无人及你
无人及你 2020-11-27 04:59

I would like to add some style on a select box with the pseudo :after (to style my select box with 2 parts and without images). Here\'s the HTML:


                        
    
提交评论

  • 2020-11-27 05:43

    This solution is similar to the one from sroy, but with css triangle instead of web font:

    .select-wrapper {
      position: relative;
      width: 200px;
    }
    .select-wrapper:after {
      content: "";
      width: 0;
      height: 0;
      border-left: 5px solid transparent;
      border-right: 5px solid transparent;
      border-top: 6px solid #666;
      position: absolute;
      right: 8px;
      top: 8px;
      pointer-events: none;
    }
    select {
      background: #eee;
      border: 0 !important;
      border-radius: 0;
      -webkit-appearance:none;
      -moz-appearance:none;
      appearance:none;
      text-indent: 0.01px;
      text-overflow: "";
      font-size: inherit;
      line-height: inherit;
      width: 100%;
    }
    select::-ms-expand {
      display: none;
    }
    <div class="select-wrapper">
      <select>
        <option value="1">option 1</option>
        <option value="2">option 2</option>
        <option value="3">option 3</option>
      </select>
    </div>

    0 讨论(0)
  • 2020-11-27 05:45

    This is a modern solution I cooked up using font-awesome. Vendor extensions have been omitted for brevity.

    HTML

    <fieldset>
        <label for="color">Select Color</label>
        <div class="select-wrapper">
            <select id="color">
                <option>Red</option>
                <option>Blue</option>
                <option>Yellow</option>
            </select>
            <i class="fa fa-chevron-down"></i>
        </div>
    </fieldset>
    

    SCSS

    fieldset {
        .select-wrapper {
            position: relative;
    
            select {
                appearance: none;
                position: relative;
                z-index: 1;
                background: transparent;
    
                + i {
                    position: absolute;
                    top: 40%;
                    right: 15px;
                }
            }
        }
    

    If your select element has a defined background color, then this won't work as this snippet essentially places the Chevron icon behind the select element (to allow clicking on top of the icon to still initiate the select action).

    However, you can style the select-wrapper to the same size as the select element and style its background to achieve the same effect.

    Check out my CodePen for a working demo that shows this bit of code on both a dark and light themed select box using a regular label and a "placeholder" label and other cleaned up styles such as borders and widths.

    P.S. This is an answer I had posted to another, duplicate question earlier this year.

    0 讨论(0)
  • 2020-11-27 05:47

    What if modifying the markup isn't an option?

    Here's a solution that has no requirements for a wrapper: it uses an SVG in a background-image. You may need to use an HTML entity decoder to understand how to change the fill colour.

    -moz-appearance: none;
    -webkit-appearance: none;
    appearance: none;
    
    background-image: url('data:image/svg+xml;charset=US-ASCII,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22292.4%22%20height%3D%22292.4%22%3E%3Cpath%20fill%3D%22%23000000%22%20d%3D%22M287%2069.4a17.6%2017.6%200%200%200-13-5.4H18.4c-5%200-9.3%201.8-12.9%205.4A17.6%2017.6%200%200%200%200%2082.2c0%205%201.8%209.3%205.4%2012.9l128%20127.9c3.6%203.6%207.8%205.4%2012.8%205.4s9.2-1.8%2012.8-5.4L287%2095c3.5-3.5%205.4-7.8%205.4-12.8%200-5-1.9-9.2-5.5-12.8z%22%2F%3E%3C%2Fsvg%3E');
    background-repeat: no-repeat;
    background-position: right .7em top 50%;
    background-size: .65em auto;
    

    Pinched from CSS-Tricks.

    0 讨论(0)
  • 2020-11-27 05:48
    <div class="select">
    <select name="you_are" id="dropdown" class="selection">
    <option value="0" disabled selected>Select</option>
    <option value="1">Student</option>
    <option value="2">Full-time Job</option>
    <option value="2">Part-time Job</option>
    <option value="3">Job-Seeker</option>
    <option value="4">Nothing Yet</option>
    </select>
    </div>
    

    Insted of styling the select why dont you add a div out-side the select.

    and style then in CSS

    .select{
        width: 100%;
        height: 45px;
        position: relative;
    }
    .select::after{
        content: '\f0d7';
        position: absolute;
        top: 0px;
        right: 10px;
        font-family: 'Font Awesome 5 Free';
        font-weight: 900;
        color: #0b660b;
        font-size: 45px;
        z-index: 2;
    
    }
    #dropdown{
        -webkit-appearance: button;
           -moz-appearance: button;
                appearance: button;
                height: 45px;
                width: 100%;
            outline: none;
            border: none;
            border-bottom: 2px solid #0b660b;
            font-size: 20px;
            background-color: #0b660b23;
            box-sizing: border-box;
            padding-left: 10px;
            padding-right: 10px;
    }
    
    0 讨论(0)
  • 2020-11-27 05:52

    I was looking for the same thing since the background of my select is the same as the arrow color. As previously mentioned, it is impossible yet to add anything using :before or :after on a select element. My solution was to create a wrapper element on which I added the following :before code.

    .select-wrapper {
        position: relative;
    }
    
    .select-wrapper:before {
        content: '\f0d7';
        font-family: FontAwesome;
        color: #fff;
        display: inline-block;
        position: absolute;
        right: 20px;
        top: 15px;
        pointer-events: none;
    }
    

    And this my select

    select {
        box-sizing: border-box;
        -webkit-box-sizing: border-box;
        -moz-box-sizing: border-box;
        width: 100%;
        padding: 10px 20px;
        background: #000;
        color: #fff;
        border: none;
        -webkit-appearance: none;
        -moz-appearance: none;
        appearance: none;
    }
    
    select::-ms-expand {
        display: none;
    }
    

    I have used FontAwesome.io for my new arrow, but you can use whatever else you want. Obviously this is not a perfect solution, but depending on your needs it might be enough.

    0 讨论(0)
  • 提交回复
    热议问题