Как применить стили CSS только к половине слова или символа
Иногда по каким-то причинам, возможно в связи с дизайном веб-сайта, вам может понадобиться добавить стиль только к половине символа, слова или предложения.
Для этого вам потребуется CSS, а также JavaScript. Ниже мы представим, как можно получить такой эффект.
Стилизация половины только с помощью CSS
Возможно получить стилизацию половины символа, используя только CSS.
Сначала установите свойство background со значением "linear-gradient" для вашего предпочитаемого направления и укажите видимость видимость 50% для каждого цвета.
Потом установите свойство background-clip как background-clip: text;
Следующим шагом будет установление свойства text-fill-color, которое указывает цвет заливки переднего плана для текстового контента элемента. Задайте webkit-text-fill-color: transparent; , чтобы текст имел цвет, указанный свойством background.
Пример
<!DOCTYPE html>
<html>
<head>
<title>Заголовок документа</title>
<style>
h1 {
display: inline-block;
margin: 0;
line-height: 1em;
font-family: Helvetica, Arial, sans-serif;
font-weight: bold;
font-size: 200px;
background: linear-gradient(to right, #1c87c9 50%, #8ebf42 50%);
background-clip: text;
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
}
</style>
</head>
<body>
<h1>X</h1>
<p>Стилизация половины символа.</p>
</body>
</html>
Если хотите отобразить только половину символа и применить к ней стиль, задайте значение "transparent" для второй половины линейного градиента.
Пример
<!DOCTYPE html>
<html>
<head>
<title>Заголовок документа</title>
<style>
h1 {
display: inline-block;
margin: 0;
line-height: 1em;
font-family: Helvetica, Arial, sans-serif;
font-weight: bold;
font-size: 200px;
background: linear-gradient(to right, #1c87c9 50%, transparent 50%);
background-clip: text;
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
}
</style>
</head>
<body>
<p>Прозрачная стилизация половины символа. Выберите символ, чтобы увидеть его скрытую часть.</p>
<h1>X</h1>
</body>
</html>
Теперь давайте рассмотрим случай, когда нужна стилизация половины слова, а не символа. Это нетрудно. Здесь вам просто необходимо разместить каждую букву в элемент <span> и применить вышеуказанную стилизацию для элемента span.
Пример
<!DOCTYPE html>
<html>
<head>
<title>Заголовок документа</title>
<style>
span {
display: inline-block;
margin: 0;
line-height: 1em;
font-family: Helvetica, Arial, sans-serif;
font-weight: bold;
font-size: 60px;
background: linear-gradient(to right, #1c87c9 50%,#113155 50%);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
}
</style>
</head>
<body>
<div>
<span>T</span>
<span>E</span>
<span>X</span>
<span>T</span>
</div>
</body>
</html>
Вертикальная и горизонтальная стилизация половины
Можно легко указать, должна ли стилизация половины быть вертикальной или горизонтальной. Вам просто необходимо указать линейный градиент справа налево или сверху вниз.
Пример
<!DOCTYPE html>
<html>
<head>
<title>Заголовок документа</title>
<style>
.vertical {
display: inline-block;
margin: 0;
line-height: 1em;
font-family: Helvetica, Arial, sans-serif;
font-weight: bold;
font-size: 60px;
background: linear-gradient(to right, #1c87c9 50%,#113155 50%);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
}
.horizontal {
display: inline-block;
margin: 0;
line-height: 1em;
font-family: Helvetica, Arial, sans-serif;
font-weight: bold;
font-size: 60px;
background: linear-gradient(to top, #1c87c9 50%,#113155 50%);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
}
</style>
</head>
<body>
<div>
<h2>Вертикальная стилизация половины буквы.</h2>
<span class="vertical">X</span>
<h2>Горизонтальная стилизация половины буквы.</h2>
<span class="horizontal">X</span>
</div>
</body>
</html>
Стилизация половины с помощью JavaScript/jQuery
Смотрите другой пример, где CSS псевдоэлемент ::before используется вместе с JavaScript. Можно также задать text-shadow для стилизации половины текста.
Пример
<!DOCTYPE html>
<html>
<head>
<title>Заголовок документа</title>
<style>
body {
font-family: Helvetica, Arial, sans-serif;
font-size: 60px;
font-weight: bold;
text-align: center;
}
.half-style > span {
white-space: pre-line;
position: relative;
color: #1c87c9 ;
}
.half-style > span::before {
content: attr(data-content);
pointer-events: none;
position: absolute;
overflow: hidden;
color: #113155;
width: 50%;
z-index: 1;
}
</style>
</head>
<body>
<div class='half-style'>W3docs</div>
<script>
function wrapString(str) {
var output = [];
str.split('').forEach(function(letter) {
var wrapper = document.createElement('span');
wrapper.dataset.content = wrapper.innerHTML = letter;
output.push(wrapper.outerHTML);
});
return output.join('');
}
window.onload = function() {
var el = document.querySelector('.half-style'),
txt = el.innerHTML;
el.innerHTML = wrapString(txt);
}
</script>
</body>
</html>
Рассмотрим другой пример, где используется jQuery для получения эффекта тройной стилизации.
Пример
<!DOCTYPE html>
<html>
<head>
<title>Заголовок документа</title>
<script src="https://code.jquery.com/jquery-3.4.1.min.js"
integrity="sha256-CSXorXvZcTkaix6Yvo6HppcZGetbYMGWSFlBw8HfCJo="
crossorigin="anonymous"></script>
<style>
.halfStyle { /* базовый символ и правый 1/3 */
position:relative;
display:inline-block;
font-size:80px; /* или любой размер шрифта будет работать */
color: transparent; /* скрыть базовый символ */
overflow:hidden;
white-space: pre; /* чтобы избегать свертывания пространств */
color: #1c87c9; /* в целях демо использования */
text-shadow: 2px 2px 0px #eee; /* в целях демо использования */
}
.halfStyle:before { /* создает левый 1/3 */
display:block;
z-index:2;
position:absolute;
top:0;
width: 33.33%;
content: attr(data-content); /* динамический контент для псевдоэлемента */
overflow:hidden;
pointer-events: none; /* разрешает выбор базового символа с помощью мыши */
color: #8ebf42; /* в целях демо использования */
text-shadow: 2px -2px 0px #eee; /* в целях демо использования */
}
.halfStyle:after { /* создает средний 1/3 */
display:block;
z-index:1;
position:absolute;
top:0;
width: 66.66%;
content: attr(data-content); /* динамический контент для псевдоэлемента */
overflow:hidden;
pointer-events: none; /* разрешает выбор базового символа с помощью мыши */
color: #666; /* в целях демо использования */
text-shadow: 2px 2px 0px cyan; /* в целях демо использования */
}
</style>
</head>
<body>
<hr/>
<p>Single Characters:</p>
<span class="halfStyle" data-content="T">T</span>
<span class="halfStyle" data-content="E">E</span>
<span class="halfStyle" data-content="X">X</span>
<span class="halfStyle" data-content="T">T</span>
<hr/>
<p>Automated on any text:</p>
<span class="textToHalfStyle">Half-style text.</span>
<hr/>
<script>
jQuery(function($) {
var halfstyle_text, halfstyle_chars, $halfstyle_el, halfstyle_i, halfstyle_output, halfstyle_style;
// Выполните перебор всех классов
$('.textToHalfStyle').each(function(idx, halfstyle_el) {
$halfstyle_el = $(halfstyle_el);
halfstyle_style = $halfstyle_el.data('halfstyle') || 'hs-base';
halfstyle_text = $halfstyle_el.text();
halfstyle_chars = halfstyle_text.split('');
// Установите программу для чтения текста с экрана
$halfstyle_el.html('<span style="position: absolute;clip: rect(1px 1px 1px 1px);clip: rect(1px, 1px, 1px, 1px);">' + halfstyle_text + '</span>');
// Восстановите вывод для дополнения
halfstyle_output = '';
// Выполните перебор всех символов в тексте
for (halfstyle_i = 0; halfstyle_i < halfstyle_chars.length; halfstyle_i++) {
// Создайте стилизованный элемент для каждого символа и добавьте к контейнеру
halfstyle_output += '<span aria-hidden="true" class="halfStyle ' + halfstyle_style + '" data-content="' + halfstyle_chars[halfstyle_i] + '">' + halfstyle_chars[halfstyle_i] + '</span>';
}
// Chrome 59 and above specific fix - Part 1 - Addresses a Chrome bug where Chrome fails to corectly render and repaint pseudo elements
var _applyChromeFix = !!window.chrome && !!navigator.appVersion.match(/.*Chrome\/([0-9\.]+)/) && parseInt(navigator.appVersion.match(/.*Chrome\/([0-9\.]+)/)[1], 10) >= 59;
if (_applyChromeFix) {
halfstyle_output += '<style>.halfStyle{}</style>';
}
// Обратитесь к DOM только один раз
$halfstyle_el.append(halfstyle_output);
// Chrome 59 and above specific fix - Part 2
if (_applyChromeFix) {
setTimeout(function(){
$halfstyle_el.find('style').remove();
}, 0);
}
});
});
</script>
</body>
</html>