Nano Hash - криптовалюты, майнинг, программирование

проблема с ‹select› и :after с CSS в WebKit

Я хотел бы добавить некоторый стиль в поле выбора с помощью псевдо :after (чтобы стилизовать поле выбора с двумя частями и без изображений). Вот HTML:

<select name="">
  <option value="">Test</option>
</select>

И это не работает. Я не знаю почему, и я не нашел ответа в спецификациях W3C. Вот CSS:

select {
  -webkit-appearance: none;
  background: black;
  border: none;
  border-radius: 0;
  color: white;
}

select:after {
  content: " ";
  display: inline-block;
  width: 24px; height: 24px;
  background: blue;
}

Так это нормально или есть подвох?

20.08.2010

  • Я полагаю, что это не было бы, не должно быть возможным, иначе было бы слишком легко изменять содержимое форм. Представьте себе простой фрагмент CSS, изменяющий отображаемую цену для чего-либо. Это может быть показано как более дешевое, чем оно есть на самом деле, обманом заставляя людей покупать что-то дороже, чем они ожидали. (Или, конечно, если у кого-то есть доступ к CSS страницы/таблицы стилей пользователя, то он, вероятно, мог бы сделать то же самое другими способами…) 07.07.2015
  • @Synetech - это неверно, автор страницы должен иметь полный контроль над всеми аспектами стиля страницы. Производители браузеров, пытающиеся предотвратить изменение стиля определенных элементов, потому что они могут использоваться для введения пользователей в заблуждение, не будут эффективными, поскольку существует почти безграничное количество способов обмануть систему или произвести ложные срабатывания. 07.01.2016
  • Возможный дубликат псевдоэлементов и тега SELECT 30.01.2017

Ответы:


1

Я не проверял это подробно, но у меня сложилось впечатление, что это (пока?) невозможно из-за того, как элементы select генерируются ОС, на которой работает браузер, а не самим браузером. .

20.08.2010
  • Сейчас 2019 год, а он все тот же 15.02.2019
  • Сейчас 2020 год, а все по-прежнему 07.01.2020
  • Ознакомьтесь с CSS Houdini, если вы хотите иметь собственный выбор/флажок в CSS. Единственная проблема заключается в том, что поддержка браузеров пока невелика. Медленно, но дела налаживаются. 20.09.2020
  • Сейчас 2021 год, а все по-прежнему 01.01.2021

  • 2

    Я искал то же самое, так как фон моего выбора такой же, как цвет стрелки. Как упоминалось ранее, пока невозможно добавить что-либо, используя :before или :after для элемента select. Мое решение состояло в том, чтобы создать элемент-оболочку, в который я добавил следующий код :before.

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

    И это мой выбор

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

    Я использовал FontAwesome.io для своей новой стрелки, но вы можете использовать все, что захотите. Очевидно, что это не идеальное решение, но в зависимости от ваших потребностей этого может быть достаточно.

    29.08.2014
  • Это визуально идеально. Но вы не можете щелкнуть этот значок, и выбранный элемент не откроется: / Есть предложения? 29.06.2015
  • события-указатели: нет; должен позаботиться об этом. Была проблема с моим кодом выше. Я заменю любой sass выше на css, чтобы устранить путаницу. 06.07.2015
  • Имеет ли значение, какой псевдоселектор (до или после) используется? 11.07.2015
  • Вы можете использовать тот или иной 12.07.2015
  • Это отличное решение, но при его реализации я обнаружил, что по какой-то причине :before работает, а НЕ :after. Я не знаю почему. 23.07.2015

  • 3

    По моему опыту, это просто не работает, если вы не хотите обернуть свой <select> в какую-то обертку. Но вместо этого вы можете использовать фоновое изображение SVG. Например.

        .archive .options select.opt {
        -moz-appearance: none;
        -webkit-appearance: none;
        padding-right: 1.25EM;
        appearance: none;
        position: relative;
        background-color: transparent;
        background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' version='1.1' height='10px' width='15px'%3E%3Ctext x='0' y='10' fill='gray'%3E%E2%96%BE%3C/text%3E%3C/svg%3E");
        background-repeat: no-repeat;
        background-size: 1.5EM 1EM;
        background-position: right center;
        background-clip: border-box;
        -moz-background-clip: border-box;
        -webkit-background-clip: border-box;
    }
    
        .archive .options select.opt::-ms-expand {
            display: none;
        }
    

    Просто будьте осторожны с правильной кодировкой URL из-за IE. Вы должны использовать charset=utf8 (а не только utf8), не используйте двойные кавычки (") для разделения значений атрибутов SVG, вместо этого используйте апострофы ('), чтобы упростить себе жизнь. URL-encode s (%3E). Если у вас есть для печати любых символов, отличных от ASCII, вы должны получить их представление UTF-8 (например, BabelMap может помочь вам в этом), а затем предоставить это представление в форме URL-кодирования, например, для ▾ (U+25BE ЧЕРНЫЙ МАЛЕНЬКИЙ ТРЕУГОЛЬНИК, УКАЗАННЫЙ ВНИЗ) UTF- 8 представлено \xE2\x96\xBE, которое равно %E2%96%BE при кодировании URL.

    19.02.2017
  • Это красивое и элегантное решение 20.02.2018
  • Это фантастическое, простое и элегантное решение, не требующее дополнительного HTML, а это именно то, что я искал! Спасибо! Это должен быть выбранный ответ ИМО. 31.07.2018

  • 4

    Этот пост может помочь http://bavotasan.com/2011/style-select-box-using-only-css/

    Он использует внешний div с классом для решения этой проблемы.

    <div class="styled-select">
      <select>
        <option>Here is the first option</option>
        <option>The second option</option>
      </select>
    </div>
    
    14.05.2013

    5

    Столкнулся с той же проблемой. Вероятно, это может быть решением:

    <select id="select-1">
        <option>One</option>
        <option>Two</option>
        <option>Three</option>
    </select>
    <label for="select-1"></label>
    
    #select-1 {
        ...
    }
    
    #select-1 + label:after {
        ...
    }
    
    15.01.2013
  • Можете ли вы добавить стили, необходимые для того, чтобы метка располагалась поверх выбранного элемента? 16.10.2014

  • 6

    Что делать, если изменение разметки невозможно?

    Вот решение, которое не требует обёртки: оно использует SVG в фоновом изображении. Возможно, вам потребуется использовать декодер объектов HTML, чтобы понять, как изменить цвет заливки.

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

    Взято из CSS-Tricks.

    02.07.2019
  • Это хороший трюк. Очень раздражает, что мы до сих пор не можем выбрать стиль в 2020 году. 27.02.2020

  • 7

    Это решение похоже на решение от sroy, но с треугольником css вместо веб-шрифта:

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

    01.07.2016

    8

    Это современное решение, которое я придумал с помощью font-awesome. Расширения поставщика для краткости опущены.

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

    Если ваш элемент выбора имеет определенный цвет фона, то это не сработает, поскольку этот фрагмент по существу помещает значок шеврона за элементом выбора (чтобы можно было щелкнуть поверх значка, чтобы по-прежнему инициировать действие выбора).

    Тем не менее, вы можете придать оболочке выбора тот же размер, что и элементу выбора, и стиль его фона для достижения того же эффекта.

    Проверьте мой CodePen, чтобы увидеть рабочую демонстрацию, которая показывает этот фрагмент кода как на темном, так и на светлом фоне. тематическое поле выбора с использованием обычной метки и метки-заполнителя, а также других очищенных стилей, таких как границы и ширина.

    P.S. Это ответ, который я опубликовал на другой дублирующий вопрос ранее в этом году.

    08.11.2016

    9
    <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>
    

    Вместо стилизации выбора, почему бы вам не добавить div вне выбора.

    и стиль затем в 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;
    }
    
    18.04.2019
  • нажатие на элемент :after не активирует выбор 09.04.2021
  • Установите для событий указателя значение none после 10.04.2021
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..