Как применить цвет фона только к половине текста при выборе?

Когда я выбираю текст, цвет фона меняется на желтый.

body p::selection {
  background: #fcf113;
  color: #000;
  display: none;
}
body p::-moz-selection {
  background: #fcf113;
}

введите описание изображения здесь

Но я хочу, чтобы это выглядело следующим образом.

введите описание изображения здесь

Возможно ли это или нет?

Ответ 1

Благодарим вас за то, что погубили хотя бы час моего дня, но на самом деле я нашел решение только для CSS. Это не очень сложно, хотя, и это связано с большим количеством подделок, но эй: Нет JavaScript!

В основном мы используем атрибут data-content с тем же содержимым, что и span, а затем копируем его в слоистый элемент :after, который отображает его. Затем мы скроем исходный текст и применим высоту 50% к элементу after, таким образом, цвет фона можно применить только к нижней половине.

h1 {
    position: relative;
    color: #FFF;
}

h1:after {
    content: attr(data-content);
    position: absolute;
    color: #000;
    top: 0;
    left: 0;
    width: 100%;
    height: 50%;
    background-color: #FFF;
}

h1::selection {
    background: #fcf113;
}
<h1 data-content="Hello world!">Hello world!</span>

Ответ 2

Это невозможно с помощью только css (без хаков), в настоящее время вы можете создать только небольшой набор свойств для ::selection, например color, background-color, cursor, outline, text-decoration, и text-shadow.

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


Если вам действительно нужен цвет, как описано, вы можете использовать javascript для получения выделенного текста, оберните его с помощью <span> и стиля, который с помощью CSS.

Для небольших предложений или заголовков посмотрите Ответ только на Roberrrts CSS.

Источник:
https://developer.mozilla.org/en-US/docs/Web/CSS/::selection
https://drafts.csswg.org/css-pseudo-4/#highlight-styling

Ответ 3

Я думаю, что вы можете сделать это с эффектом градиента:

#grad1 {
    height: 200px;
    background: -webkit-linear-gradient(rgba(255,255,0,0) 70%, rgba(255,255,0,1)); /* For Safari 5.1 to 6.0 */
    background: -o-linear-gradient(rgba(255,255,0,0) 70%, rgba(255,255,0,1)); /* For Opera 11.1 to 12.0 */
    background: -moz-linear-gradient(rgba(255,255,0,0) 70%, rgba(255,255,0,1)); /* For Firefox 3.6 to 15 */
    background: linear-gradient(rgba(255,255,0,0) 70%, rgba(255,255,0,1)); /* Standard syntax (must be last) */
}