Хотя кто-то может подумать, что обновление CSS относительно просто, здесь мы говорим о псевдоэлементах, которые иногда не так просты и зависят от браузера. Здесь мы сравним каждый подход и обсудим, когда какой использовать.

Некоторые соответствующие варианты использования, в которых вы можете столкнуться с этой проблемой:

  1. Полосы прокрутки (включая «большой палец» и т. д.)
  2. Кнопка ввода (тип = файл)
  3. Индикаторы выполнения (для тегов видео/аудио)
  4. Стили только для первой строки абзаца

В качестве примера мы будем использовать кнопку «выбрать файл» на входе (type = file).

Прежде чем читать дальше, получите следующие две вещи:

СОЗДАЙТЕ МЫШЛЕНИЕ
Смысл этих «тактик» в том, чтобы научиться думать и как бы знать план решения проблемы. Это позволяет вам быть самосознательными и продолжать заставлять себя узнавать следующий лакомый кусочек информации, так что это дает вам преимущество как программист.

СНАЧАЛА ПРОВЕРЬТЕ СЕБЯ
Вам не поможет просто прочитать эту статью. Сначала попробуйте предугадать, что я скажу, используя свои собственные знания, а затем проверьте, не говорю ли я вам что-то новое. ТАК ВЫ ЗАПОМНИТЕ ЭТО ЛУЧШЕ!

Метод 1: «D» для «Duh», «Documentation» и «DOM»

Подход

Вот такой ответ: посмотрите документацию; вы пытаетесь найти правильный селектор запросов, чтобы изменить свой CSS. Вот список всех псевдоэлементов, которые вам нужно знать (dw, их немного!)

Пример

  1. Вот как должен выглядеть CSS. Главный вывод здесь — это символы «::», и из этого вы должны усвоить, что всякий раз, когда мы говорим о псевдоэлементах, эти символы должны отображаться.

2. Вот как это будет выглядеть в Styled-components

"У меня нет доступа к документации, есть ли более простой способ?" ДА

Он называется теневой DOM (TL; DR: он отвечает за стиль браузера по умолчанию). Хотя по умолчанию он не отображается в консоли Chrome, вы можете зайти в настройки (открыть консоль → нажать на значок шестеренка), а затем выбрать следующее:

Мой совет, всегда держите это включенным и, возможно, даже до перехода к документации, сначала получите доступ к этому! Таким образом, вы, по крайней мере, будете знакомы с тем, что ищете в документации, чтобы избежать догадок и тонн гугления.

Когда я должен это сделать?

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

Способ 2: способ «показать = скрыть»

Подход

Общий принцип таков:

  1. Скрыть исходный элемент (CSS: «display: hidden»)
  2. Создайте альтернативный элемент, который выглядит так, как вы хотите.
  3. Вы связываете их (используя «useRef/refs» в React и получая доступ к идентификатору через vanilla JS)

Крутость этого подхода в том, что вы не создаете всю бизнес-логику с нуля, а сохраняете исходные элементы. Затем через refs (или выбрав «id», если вы используете vanilla JS) вы запускаете исходный элемент через новый элемент!

Пример:

Кнопка Medium «добавить изображение» (в их редакторе) использует этот метод. Обратите внимание, что хотя кнопка выглядит по-другому, нажатие на нее по-прежнему приводит к выбору файла (т. е. поведение такое же)!

Пример упрощенного кода того, как, вероятно, будет выглядеть этот компонент React. Обратите внимание, что ввод «скрыт» (здесь для простоты используется встроенный JS), а другой компонент расположен прямо под ним (не то чтобы это имело значение). Также обратите внимание, как ссылки используются здесь в функции «handleClick».

Когда я должен использовать его?

Я бы порекомендовал вам использовать этот метод в конкретных ситуациях. А именно:

  1. Если у вас уже есть предопределенный компонент, на который вы хотите, чтобы он выглядел, вы можете избежать репликации CSS esp. если вы используете стилизованные компоненты или аналогичную библиотеку.
  2. Если вы собираетесь добавить какое-то пользовательское поведение, которое вы бы добавили поверх того, что браузер делает по умолчанию.
  3. Если первая тактика (с использованием документации, предоставленной для псевдоэлемента браузера) отличается от браузера к браузеру, и вы хотите быть в безопасности при написании своего CSS.

Почему это проблематично?

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

Способ 3: метод «наложения»

Я не буду здесь вдаваться в подробности, так как этот метод очень похож на предыдущий (хотя, конечно, немного надежнее!)

Подход

Идея проста: у вас есть свой собственный компонент и оригинальный; и, по сути, вы пытаетесь разместить один компонент поверх другого, так что когда пользователь видит ваш пользовательский компонент, он фактически взаимодействует с исходным!

Итак, вы будете делать следующее:

  1. Вместо «display: none» для исходного компонента вы установите его «opacity: 0». Он по-прежнему скрыт, но по-другому!
  2. Затем вы убедитесь, что размеры двух компонентов точно такие же, чтобы взаимодействие с пользователем не мешало.
  3. Установите исходный компонент поверх другого, используя свойство z-index.
  4. Установите его так, чтобы исходный компонент и ваш пользовательский компонент не совпадали каждый раз; вы можете сделать это, установив значение их позиций
    (например, «position: absolute, top: 0, …»)

Мои мысли об этом подходе:

Честно говоря, я ненавижу эту идею из-за ее хакерства и из-за того, что это своего рода творчество, которое не дает вам большого преимущества в знании того, как работает браузер или JS.

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

Способ 4. Полностью настраиваемый с нуля

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

Я, честно говоря, для этого примера не могу придумать, зачем вам это нужно, но если хотите — вы знаете, что делать! По сути, вам нужно:

  1. Сначала создайте свою пользовательскую кнопку (это может быть даже не тег ввода)
  2. Вам нужно выяснить, как пользователь будет выбирать файл (опять же, этот подход предполагает, что вы не хотите открывать окно выбора файла); так что, если вы визуализировали совершенно новый метод или способ — это он.

Некоторые мысли, которые приходят на ум: я могу представить, как кто-то пытается сделать это с полосой прокрутки или с тегом видео, где они хотят, чтобы оно выглядело и вело себя совершенно по-другому! Помните: вещи, которые сегодня кажутся нам очевидными (например, режим видео "картинка в картинке"), когда-то были придуманы кем-то другим! Поэтому не отказывайтесь от этого полностью.

Резюме

Есть четыре способа, о которых я знаю до сих пор:

  1. Посмотрите документацию: это наш выбор.
  2. Скрыть оригинал; связать его с пользовательским компонентом
  3. Сделайте оригинал непрозрачным и поместите его прямо поверх пользовательского компонента.
  4. Создайте свой собственный с нуля, используя div и span.

Если вы думаете, что я что-то упускаю, пожалуйста, определите. комментарий и дайте мне знать!