Можно ли применить CSS к половине символа?
Что я ищу:
Способ стилизовать одну половину персонажа. (В этом случае половина буквы будет прозрачной)
Что я сейчас искал и пробовал (Без удачи):
- Методы оформления половины символа/буквы
- Стилизация части персонажа с помощью CSS или JavaScript
- Применить CSS к 50% персонажа
Ниже приведен пример того, что я пытаюсь получить.
Существует ли для этого решение CSS или JavaScript или мне придется прибегнуть к изображениям? Я предпочел бы не идти по пути изображения, поскольку этот текст будет генерироваться динамически.
ОБНОВИТЬ:
Поскольку многие спрашивают, почему я бы хотел придать стиль половине персонажа, вот почему. Мой город недавно потратил 250 000 долларов, чтобы определить для себя новый "бренд". Этот логотип - то, что они придумали. Многие люди жаловались на простоту и нехватку творчества и продолжают это делать. Моей целью было придумать этот сайт как шутку. Введите "Галифакс", и вы поймете, что я имею в виду.
Ответы
Ответ 1
Не стесняйтесь раскошелиться и улучшиться.
- Чистый CSS для одного персонажа
- JavaScript используется для автоматизации текста или нескольких символов
- Сохраняет текстовую доступность для программ чтения с экрана для слепых или слабовидящих
Часть 1: Основное решение
Демо: http://jsfiddle.net/arbel/pd9yB/1694/
Это работает с любым динамическим текстом или одним символом и все автоматизировано. Все, что вам нужно сделать, это добавить класс к целевому тексту, а все остальное позаботится.
Кроме того, доступность исходного текста сохраняется для программ чтения с экрана для слепых или слабовидящих.
Объяснение для одного персонажа:
Чистый CSS. Все, что вам нужно сделать, это применить класс .halfStyle
к каждому элементу, который содержит символ, который вы хотите использовать в половинном стиле.
Для каждого элемента span, содержащего символ, вы можете создать атрибут данных, например, здесь data-content="X"
, а для псевдоэлемента использовать content: attr(data-content);
поэтому .halfStyle:before
будет динамическим, и вам не нужно будет жестко его кодировать для каждого экземпляра.
Пояснения к любому тексту:
Просто добавьте класс textToHalfStyle
к элементу, содержащему текст.
// jQuery for automated mode
jQuery(function($) {
var text, chars, $el, i, output;
// Iterate over all class occurences
$('.textToHalfStyle').each(function(idx, el) {
$el = $(el);
text = $el.text();
chars = text.split('');
// Set the screen-reader text
$el.html('<span style="position: absolute !important;clip: rect(1px 1px 1px 1px);clip: rect(1px, 1px, 1px, 1px);">' + text + '</span>');
// Reset output for appending
output = '';
// Iterate over all chars in the text
for (i = 0; i < chars.length; i++) {
// Create a styled element for each character and append to container
output += '<span aria-hidden="true" class="halfStyle" data-content="' + chars[i] + '">' + chars[i] + '</span>';
}
// Write to DOM only once
$el.append(output);
});
});
.halfStyle {
position: relative;
display: inline-block;
font-size: 80px; /* or any font size will work */
color: black; /* or transparent, any color */
overflow: hidden;
white-space: pre; /* to preserve the spaces from collapsing */
}
.halfStyle:before {
display: block;
z-index: 1;
position: absolute;
top: 0;
left: 0;
width: 50%;
content: attr(data-content); /* dynamic content for the pseudo element */
overflow: hidden;
color: #f00;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<p>Single Characters:</p>
<span class="halfStyle" data-content="X">X</span>
<span class="halfStyle" data-content="Y">Y</span>
<span class="halfStyle" data-content="Z">Z</span>
<span class="halfStyle" data-content="A">A</span>
<hr/>
<p>Automated:</p>
<span class="textToHalfStyle">Half-style, please.</span>
Ответ 2
Я только что закончил разработку плагина, и он доступен для всех желающих! Надеюсь, вам это понравится.
Просмотр проекта на GitHub - Просмотр веб-сайта проекта. (так что вы можете увидеть все стили разделения)
использование
Прежде всего, убедитесь, что у вас есть библиотека jQuery
. Лучший способ получить последнюю версию jQuery - обновить тэг head:
<script src="http://code.jquery.com/jquery-latest.min.js"></script>
После загрузки файлов убедитесь, что вы включили их в свой проект:
<link rel="stylesheet" type="text/css" href="css/splitchar.css">
<script type="text/javascript" src="js/splitchar.js"></script>
наценка
Все, что вам нужно сделать, это присвоить классу splitchar
, а затем нужный стиль для элемента, обертывающего ваш текст. например
<h1 class="splitchar horizontal">Splitchar</h1>
После того, как все это будет сделано, просто убедитесь, что вы вызываете функцию jQuery в вашем документе готового файла следующим образом:
$(".splitchar").splitchar();
Пользовательская настройка
Чтобы текст выглядел именно так, как вы хотите, все, что вам нужно сделать, это применить свой дизайн следующим образом:
.horizontal { /* Base CSS - e.g font-size */ }
.horizontal:before { /* CSS for the left half */ }
.horizontal:after { /* CSS for the right half */ }
Это! Теперь у вас есть плагин Splitchar
все готово. Больше информации об этом на http://razvanbalosin.com/Splitchar.js/.
Ответ 3
Изменить (октябрь 2017): background-clip
или, скорее, background-image options
теперь поддерживаются всеми основными браузерами: CanIUse
Да, вы можете сделать это только с одним символом и только с CSS.
Только Webkit (и Chrome):
http://jsbin.com/rexoyice/1/
h1 {
display: inline-block;
margin: 0; /* for demo snippet */
line-height: 1em; /* for demo snippet */
font-family: helvetica, arial, sans-serif;
font-weight: bold;
font-size: 300px;
background: linear-gradient(to right, #7db9e8 50%,#1e5799 50%);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
}
<h1>X</h1>
Ответ 4
Мы сделаем это, используя только псевдоселектора CSS!
Этот метод будет работать с динамически созданным контентом и разными размерами и ширинами шрифта.
HTML:
<div class='split-color'>Two is better than one.</div>
CSS
.split-color > span {
white-space: pre-line;
position: relative;
color: #409FBF;
}
.split-color > span:before {
content: attr(data-content);
pointer-events: none; /* Prevents events from targeting pseudo-element */
position: absolute;
overflow: hidden;
color: #264A73;
width: 50%;
z-index: 1;
}
Чтобы обернуть динамически сгенерированную строку, вы можете использовать такую функцию:
// Wrap each letter in a span tag and return an HTML string
// that can be used to replace the original text
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('');
}
// Replace the original text with the split-color text
window.onload = function() {
var el = document.querySelector('.split-color'),
txt = el.innerHTML;
el.innerHTML = wrapString(txt);
}
Ответ 5
Это может быть неважно, может быть, нет, но когда-то я создал функцию jQuery, которая делает то же самое, но горизонтально.
Я назвал его "Strippex" для "stripe" + "text", demo: http://cdpn.io/FcIBg
Я не говорю, что это решение любых проблем, но я уже пытался применять css до половины символа, но по горизонтали. Итак, идея та же, реализация может быть ужасной, но она работает.
А, и самое главное, мне было весело создавать его!
Ответ 6
Здесь уродливая реализация в canvas. Я попробовал это решение, но результаты оказались хуже, чем я ожидал, так что здесь все равно.
$("div").each(function() {
var CHARS = $(this).text().split('');
$(this).html("");
$.each(CHARS, function(index, char) {
var canvas = $("<canvas />")
.css("width", "40px")
.css("height", "40px")
.get(0);
$("div").append(canvas);
var ctx = canvas.getContext("2d");
var gradient = ctx.createLinearGradient(0, 0, 130, 0);
gradient.addColorStop("0", "blue");
gradient.addColorStop("0.5", "blue");
gradient.addColorStop("0.51", "red");
gradient.addColorStop("1.0", "red");
ctx.font = '130pt Calibri';
ctx.fillStyle = gradient;
ctx.fillText(char, 10, 130);
});
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div>Example Text</div>
Ответ 7
Если вы заинтересованы в этом, тогда Lucas Bebber Glitch - очень похожий и супер крутой эффект:
Создан с использованием простого SASS Mixin, такого как
.example-one {
font-size: 100px;
@include textGlitch("example-one", 17, white, black, red, blue, 450, 115);
}
Подробнее на Chris Coyer CSS Tricks и Страница Лукаса Бебера Кодепена
Ответ 8
Ближе всего я могу получить:
$(function(){
$('span').width($('span').width()/2);
$('span:nth-child(2)').css('text-indent', -$('span').width());
});
body{
font-family: arial;
}
span{
display: inline-block;
overflow: hidden;
}
span:nth-child(2){
color: red;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<span>X</span><span>X</span>
Ответ 9
Я просто играл с решением @Arbel:
var textToHalfStyle = $('.textToHalfStyle').text();
var textToHalfStyleChars = textToHalfStyle.split('');
$('.textToHalfStyle').html('');
$.each(textToHalfStyleChars, function(i,v){
$('.textToHalfStyle').append('<span class="halfStyle" data-content="' + v + '">' + v + '</span>');
});
body{
background-color: black;
}
.textToHalfStyle{
display:block;
margin: 200px 0 0 0;
text-align:center;
}
.halfStyle {
font-family: 'Libre Baskerville', serif;
position:relative;
display:inline-block;
width:1;
font-size:70px;
color: black;
overflow:hidden;
white-space: pre;
text-shadow: 1px 2px 0 white;
}
.halfStyle:before {
display:block;
z-index:1;
position:absolute;
top:0;
width: 50%;
content: attr(data-content); /* dynamic content for the pseudo element */
overflow:hidden;
color: white;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
<span class="textToHalfStyle">Dr. Jekyll and M. Hide</span>
Ответ 10
Другое решение только для CSS (хотя атрибут data необходим, если вы не хотите писать CSS, специфичный для письма). Это работает по всем направлениям (протестированный IE 9/10, новейший Chrome и FF)
span {
position: relative;
color: rgba(50,50,200,0.5);
}
span:before {
content: attr(data-char);
position: absolute;
width: 50%;
overflow: hidden;
color: rgb(50,50,200);
}
<span data-char="X">X</span>
Ответ 11
Ограниченное решение CSS и jQuery
Я не уверен, насколько элегантно это решение, но оно разрезает все ровно пополам: http://jsfiddle.net/9wxfY/11/
В противном случае, я создал хорошее решение для вас... Все, что вам нужно сделать, это иметь это для вашего HTML:
Взгляните на эту самую последнюю и точную редакцию от 13.06.2016: http://jsfiddle.net/9wxfY/43/
Что касается CSS, он очень ограничен... Вам нужно только применить его к :nth-child(even)
$(function(){
var $hc = $('.half-color');
var str = $hc.text();
$hc.html("");
var i = 0;
var chars;
var dupText;
while(i < str.length){
chars = str[i];
if(chars == " ") chars = " ";
dupText = "<span>" + chars + "</span>";
var firstHalf = $(dupText);
var secondHalf = $(dupText);
$hc.append(firstHalf)
$hc.append(secondHalf)
var width = firstHalf.width()/2;
firstHalf.width(width);
secondHalf.css('text-indent', -width);
i++;
}
});
.half-color span{
font-size: 2em;
display: inline-block;
overflow: hidden;
}
.half-color span:nth-child(even){
color: red;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="half-color">This is a sentence</div>
Ответ 12
.halfStyle {
position:relative;
display:inline-block;
font-size:68px; /* or any font size will work */
color: rgba(0,0,0,0.8); /* or transparent, any color */
overflow:hidden;
white-space: pre; /* to preserve the spaces from collapsing */
transform:rotate(4deg);
-webkit-transform:rotate(4deg);
text-shadow:2px 1px 3px rgba(0,0,0,0.3);
}
.halfStyle:before {
display:block;
z-index:1;
position:absolute;
top:-0.5px;
left:-3px;
width: 100%;
content: attr(data-content); /* dynamic content for the pseudo element */
overflow:hidden;
color: white;
transform:rotate(-4deg);
-webkit-transform:rotate(-4deg);
text-shadow:0 0 1px black;
}
http://experimental.samtremaine.co.uk/half-style/
Вы можете ломать этот код, делая всевозможные интересные вещи - это всего лишь одна реализация моей связи, и я придумал прошлую ночь.
Ответ 13
Хорошее решение для WebKit, использующее поддержку background-clip: text
: http://jsfiddle.net/sandro_paganotti/wLkVt/
span{
font-size: 100px;
background: linear-gradient(to right, black, black 50%, grey 50%, grey);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
}
Ответ 14
FWIW, здесь я беру на себя это только с помощью CSS: http://codepen.io/ricardozea/pen/uFbts/
Несколько примечаний:
-
Основная причина, по которой я это делал, - проверить себя и посмотреть, удалось ли мне выполнить стилизацию половины персонажа, фактически предоставляя содержательный ответ OP.
-
Я знаю, что это не идеальное или наиболее масштабируемое решение, а предлагаемые здесь люди гораздо лучше подходят для сценариев "реального мира".
-
Созданный мной CSS-код основан на первых мыслях, которые приходят мне на ум и моем личном подходе к проблеме.
-
Мое решение работает только на симметричных символах, таких как X, A, O, M. ** Оно не работает на асимметричных символах, таких как буквы B, C, F, K или строчные буквы.
/li > -
** ОДНАКО, этот подход создает очень интересные "фигуры" с асимметричными символами. Попробуйте изменить X на K или на строчную букву, такую как h или p в CSS:)
HTML
<span class="half-letter"></span>
SCSS
.half-character {
display: inline-block;
font: bold 350px/.8 Arial;
position: relative;
&:before, &:after {
content: 'X'; //Change character here
display: inline-block;
width: 50%;
overflow: hidden;
color: #7db9e8;
}
&:after {
position: absolute;
top: 0;
left: 50%;
color: #1e5799;
transform: rotateY(-180deg);
}
}
Ответ 15
Как насчет чего-то подобного для более короткого текста?
Это может даже работать для более длинного текста, если вы делаете что-то с циклом, повторяя символы с помощью JavaScript. В любом случае, результат будет примерно таким:
p.char {
position: relative;
display: inline-block;
font-size: 60px;
color: red;
}
p.char:before {
position: absolute;
content: attr(char);
width: 50%;
overflow: hidden;
color: black;
}
<p class="char" char="S">S</p>
<p class="char" char="t">t</p>
<p class="char" char="a">a</p>
<p class="char" char="c">c</p>
<p class="char" char="k">k</p>
<p class="char" char="o">o</p>
<p class="char" char="v">v</p>
<p class="char" char="e">e</p>
<p class="char" char="r">r</p>
<p class="char" char="f">f</p>
<p class="char" char="l">l</p>
<p class="char" char="o">o</p>
<p class="char" char="w">w</p>
Ответ 16
Вы также можете сделать это с помощью SVG, если хотите:
var title = document.querySelector('h1'),
text = title.innerHTML,
svgTemplate = document.querySelector('svg'),
charStyle = svgTemplate.querySelector('#text');
svgTemplate.style.display = 'block';
var space = 0;
for (var i = 0; i < text.length; i++) {
var x = charStyle.cloneNode();
x.textContent = text[i];
svgTemplate.appendChild(x);
x.setAttribute('x', space);
space += x.clientWidth || 15;
}
title.innerHTML = '';
title.appendChild(svgTemplate);
<svg style="display: none; height: 100px; width: 100%" xmlns="http://www.w3.org/2000/svg" xmlns:svg="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1">
<defs id="FooDefs">
<linearGradient id="MyGradient" x1="0%" y1="0%" x2="100%" y2="0%">
<stop offset="50%" stop-color="blue" />
<stop offset="50%" stop-color="red" />
</linearGradient>
</defs>
<text y="50%" id="text" style="font-size: 72px; fill: url(#MyGradient)"></text>
</svg>
<h1>This is not a solution X</h1>
Ответ 17
Это может быть достигнуто с помощью селектора CSS :before
и content property value
.
.halfed, .halfed1 {
float: left;
}
.halfed, .halfed1 {
font-family: arial;
font-size: 300px;
font-weight: bolder;
width: 200px;
height: 300px;
position: relative; /* To help hold the content value within */
overflow: hidden;
color: #000;
}
.halfed:before, .halfed1:before {
width: 50%; /* How much we'd like to show */
overflow: hidden; /* Hide what goes beyond our dimension */
content: 'X'; /* Halfed character */
height: 100%;
position: absolute;
color: #28507D;
}
/* For Horizontal cut off */
.halfed1:before {
width: 100%;
height: 55%;
}
<div class="halfed"> X </div>
<div class="halfed1"> X </div>
Ответ 18
Вы можете использовать приведенный ниже код. Здесь, в этом примере, я использовал тег h1
и добавил атрибут data-title-text="Display Text"
который будет отображаться с текстом другого цвета в текстовом элементе тега h1
, что дает эффект полуцветного текста, как показано в примере ниже
body {
text-align: center;
margin: 0;
}
h1 {
color: #111;
font-family: arial;
position: relative;
font-family: 'Oswald', sans-serif;
display: inline-block;
font-size: 2.5em;
}
h1::after {
content: attr(data-title-text);
color: #e5554e;
position: absolute;
left: 0;
top: 0;
clip: rect(0, 1000px, 30px, 0);
}
<h1 data-title-text="Display Text">Display Text</h1>
Ответ 19
Просто для записи в истории!
Я придумал решение для моей собственной работы 5-6 лет назад, а именно Gradext (чистый javascript и чистый css, никакой зависимости).
Техническое объяснение состоит в том, что вы можете создать такой элемент:
<span>A</span>
Теперь, если вы хотите создать градиент для текста, вам нужно создать несколько слоев, каждый из которых имеет свой цвет, и созданный спектр будет иллюстрировать эффект градиента.
например, посмотрите на это слово lorem внутри <span>
и оно вызовет эффект горизонтального градиента (посмотрите примеры):
<span data-i="0" style="color: rgb(153, 51, 34);">L</span>
<span data-i="1" style="color: rgb(154, 52, 35);">o</span>
<span data-i="2" style="color: rgb(155, 53, 36);">r</span>
<span data-i="3" style="color: rgb(156, 55, 38);">e</span>
<span data-i="4" style="color: rgb(157, 56, 39);">m</span>
и вы можете продолжать делать этот шаблон в течение длительного времени и длинного абзаца.
Но!
Что если вы хотите создать эффект вертикального градиента для текстов?
Тогда есть другое решение, которое может быть полезным. Я опишу в деталях.
Предположим, наш первый <span>
снова. но содержание не должно быть буквами индивидуально; содержимое должно быть целым текстом, и теперь мы собираемся копировать один и тот же <span>
снова и снова (количество интервалов будет определять качество вашего градиента, больший диапазон, лучший результат, но низкую производительность). взгляните на это:
<span data-i="6" style="color: rgb(81, 165, 39); overflow: hidden; height: 11.2px;">Lorem ipsum dolor sit amet, tincidunt ut laoreet dolore magna aliquam erat volutpat.</span>
<span data-i="7" style="color: rgb(89, 174, 48); overflow: hidden; height: 12.8px;">Lorem ipsum dolor sit amet, tincidunt ut laoreet dolore magna aliquam erat volutpat.</span>
<span data-i="8" style="color: rgb(97, 183, 58); overflow: hidden; height: 14.4px;">Lorem ipsum dolor sit amet, tincidunt ut laoreet dolore magna aliquam erat volutpat.</span>
<span data-i="9" style="color: rgb(105, 192, 68); overflow: hidden; height: 16px;">Lorem ipsum dolor sit amet, tincidunt ut laoreet dolore magna aliquam erat volutpat.</span>
<span data-i="10" style="color: rgb(113, 201, 78); overflow: hidden; height: 17.6px;">Lorem ipsum dolor sit amet, tincidunt ut laoreet dolore magna aliquam erat volutpat.</span>
<span data-i="11" style="color: rgb(121, 210, 88); overflow: hidden; height: 19.2px;">Lorem ipsum dolor sit amet, tincidunt ut laoreet dolore magna aliquam erat volutpat.</span>
Опять же, но!
Что, если вы хотите заставить эти эффекты градиента перемещаться и создавать из них анимацию?
ну, есть и другое решение для этого тоже. Вы обязательно должны проверить animation: true
или даже .hoverable()
метод, который приведет к запуску градиента в зависимости от положения курсора! (звучит круто xD)
это просто, как мы создаем градиенты (линейные или радиальные) на текстах. Если вам понравилась идея или вы хотите узнать о ней больше, проверьте ссылки.
Возможно, это не лучший вариант, может быть, не самый эффективный способ сделать это, но он откроет пространство для создания захватывающих и восхитительных анимаций, чтобы вдохновить других людей на лучшее решение.
Это позволит вам использовать стиль градиента для текстов, который поддерживается даже в IE8!
Здесь вы можете найти работающее живое демо, а исходный репозиторий здесь также находится на GitHub, с открытым исходным кодом и готов получить некоторые обновления (: D)
Это мой первый раз (да, после 5 лет, вы правильно поняли) упоминать этот репозиторий где-нибудь в Интернете, и я очень рад этому!
[Обновление - август 2019 года:] Github удалил демоверсию github-страниц этого хранилища, потому что я из Ирана! Только исходный код доступен здесь, хотя...