Можно ли применить CSS к половине символа?

То, что я ищу:

Способ стилизации одного символа HALF. (В этом случае половина письма является прозрачной)

В настоящее время я искал и пытался (не повезло):

  • Способы стилизации половины символа/буквы
  • Элемент стиля символа с CSS или JavaScript
  • Применить CSS к 50% символа

Ниже приведен пример того, что я пытаюсь получить.

x

Существует ли для этого решение CSS или JavaScript, или мне придется прибегать к изображениям? Я бы предпочел не идти по пути изображения, так как этот текст будет генерироваться динамически.


UPDATE:

Так как многие спросили, почему я когда-либо хотел бы создать половину персонажа, вот почему. Мой город недавно потратил 250 000 долларов, чтобы определить новый "бренд" для себя. Этот logo - это то, что они придумали. Многие люди жаловались на простоту и отсутствие творчества и продолжают это делать. Моя цель состояла в том, чтобы придумать этот сайт как шутка. Введите "Галифакс", и вы увидите, что я имею в виду.:)

2232
задан Mathew MacLean 09 мая '14 в 19:16
источник поделиться

18 ответов

Теперь на GitHub как плагин!

enter image description here Не стесняйтесь развиваться и улучшаться.

Демо | Загрузить Zip | Half-Style.com (перенаправление на GitHub)


  • Чистый CSS для одиночного символа
  • JavaScript, используемый для автоматизации текста или нескольких символов
  • Сохраняет доступность текста для чтения с экрана для слепых или визуально обесцененные

Часть 1: Основное решение

Half Style on text

Демо: http://jsfiddle.net/arbel/pd9yB/1362/


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

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

Объяснение для одного символа:

Чистый CSS. Все, что вам нужно сделать, - применить класс .halfStyle к каждому элементу, который содержит символ, который вы хотите получить в полу-стиле.

Для каждого элемента span, содержащего символ, вы можете создать атрибут data, например здесь data-content="X", а на псевдоэлементе использовать content: attr(data-content);, чтобы класс .halfStyle:before был динамическим, и вам не нужно будет жесткий код для каждого экземпляра.

Объяснение для любого текста:

Просто добавьте класс textToHalfStyle к элементу, содержащему текст.


CSS

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

HTML

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

Чтобы сделать его автоматическим, просто добавьте класс textToHalfStyle к элементу, содержащему текст.

jQuery для автоматического режима:

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

Демо: http://jsfiddle.net/arbel/pd9yB/1363/


Часть 2: Расширенное решение - Независимые левые и правые части

Half Style on text - advanced

С помощью этого решения вы можете стилизовать левую и правую части, индивидуально и независимо.

Все одно и то же, только более продвинутый CSS делает магию.

Демо: http://jsfiddle.net/arbel/pd9yB/1363/

.halfStyle {
    position:relative;
    display:inline-block;
    font-size:80px; /* or any font size will work */
    color: transparent; /* hide the base character */
    overflow:hidden;
    white-space: pre; /* to preserve the spaces from collapsing */
}
.halfStyle:before { /* creates the left part */
    display:block;
    z-index:1;
    position:absolute;
    top:0;
    width: 50%;
    content: attr(data-content); /* dynamic content for the pseudo element */
    overflow:hidden;
    pointer-events: none; /* so the base char is selectable by mouse */
    color: #f00; /* for demo purposes */
    text-shadow: 2px -2px 0px #af0; /* for demo purposes */
}
.halfStyle:after { /* creates the right part */
    display:block;
    direction: rtl; /* very important, will make the width to start from right */
    position:absolute;
    z-index:2;
    top:0;
    left:50%;
    width: 50%;
    content: attr(data-content); /* dynamic content for the pseudo element */
    overflow:hidden;
    pointer-events: none; /* so the base char is selectable by mouse */
    color: #000; /* for demo purposes */
    text-shadow: 2px 2px 0px #0af; /* for demo purposes */
}

<ч/" >


Часть 3: Смешивание и улучшение

Теперь, когда мы знаем, что возможно, создайте некоторые варианты.


- Горизонтальные половинные части

halfStyle - Horizontal Half Parts

Демо

.halfStyle {
    position:relative;
    display:inline-block;
    font-size:80px; /* or any font size will work */
    color: transparent; /* hide the base character */
    overflow:hidden;
    white-space: pre; /* to preserve the spaces from collapsing */
}
.halfStyle:before { /* creates the top part */
    display:block;
    z-index:2;
    position:absolute;
    top:0;
    height: 50%;
    content: attr(data-content); /* dynamic content for the pseudo element */
    overflow:hidden;
    pointer-events: none; /* so the base char is selectable by mouse */
    color: #f00; /* for demo purposes */
    text-shadow: 2px -2px 0px #af0; /* for demo purposes */
}
.halfStyle:after { /* creates the bottom part */
    display:block;
    position:absolute;
    z-index:1;
    top:0;
    height: 100%;
    content: attr(data-content); /* dynamic content for the pseudo element */
    overflow:hidden;
    pointer-events: none; /* so the base char is selectable by mouse */
    color: #000; /* for demo purposes */
    text-shadow: 2px 2px 0px #0af; /* for demo purposes */
}


-Vertical 1/3 Parts

halfStyle - Vertical 1/3 Parts

Демо

.halfStyle { /* base char and also the right 1/3 */
    position:relative;
    display:inline-block;
    font-size:80px; /* or any font size will work */
    color: transparent; /* hide the base character */
    overflow:hidden;
    white-space: pre; /* to preserve the spaces from collapsing */
    color: #f0f; /* for demo purposes */
    text-shadow: 2px 2px 0px #0af; /* for demo purposes */
}
.halfStyle:before { /* creates the left 1/3 */
    display:block;
    z-index:2;
    position:absolute;
    top:0;
    width: 33.33%;
    content: attr(data-content); /* dynamic content for the pseudo element */
    overflow:hidden;
    pointer-events: none; /* so the base char is selectable by mouse */
    color: #f00; /* for demo purposes */
    text-shadow: 2px -2px 0px #af0; /* for demo purposes */
}
.halfStyle:after { /* creates the middle 1/3 */
    display:block;
    z-index:1;
    position:absolute;
    top:0;
    width: 66.66%;
    content: attr(data-content); /* dynamic content for the pseudo element */
    overflow:hidden;
    pointer-events: none; /* so the base char is selectable by mouse */
    color: #000; /* for demo purposes */
    text-shadow: 2px 2px 0px #af0; /* for demo purposes */
}


-Горизонтальная 1/3 части

halfStyle - Horizontal 1/3 Parts

Демо

.halfStyle { /* base char and also the bottom 1/3 */
    position:relative;
    display:inline-block;
    font-size:80px; /* or any font size will work */
    color: transparent;
    overflow:hidden;
    white-space: pre; /* to preserve the spaces from collapsing */
    color: #f0f;
    text-shadow: 2px 2px 0px #0af; /* for demo purposes */
}
.halfStyle:before { /* creates the top 1/3 */
    display:block;
    z-index:2;
    position:absolute;
    top:0;
    height: 33.33%;
    content: attr(data-content); /* dynamic content for the pseudo element */
    overflow:hidden;
    pointer-events: none; /* so the base char is selectable by mouse */
    color: #f00; /* for demo purposes */
    text-shadow: 2px -2px 0px #fa0; /* for demo purposes */
}
.halfStyle:after { /* creates the middle 1/3 */
    display:block;
    position:absolute;
    z-index:1;
    top:0;
    height: 66.66%;
    content: attr(data-content); /* dynamic content for the pseudo element */
    overflow:hidden;
    pointer-events: none; /* so the base char is selectable by mouse */
    color: #000; /* for demo purposes */
    text-shadow: 2px 2px 0px #af0; /* for demo purposes */
}


-HalfStyle Improvement by @KevinGranger

halfStyle - KevinGranger

Демо

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

<ч/" >


-PeelingStyle улучшение HalfStyle by @SamTremaine

halfStyle - SamTremaine

Демо и samtremaine.co.uk

.halfStyle {
    position: relative;
    display: inline-block;
    font-size: 68px;
    color: rgba(0, 0, 0, 0.8);
    overflow: hidden;
    white-space: pre;
    transform: rotate(4deg);
    text-shadow: 2px 1px 3px rgba(0, 0, 0, 0.3);
}
.halfStyle:before { /* creates the left part */
    display: block;
    z-index: 1;
    position: absolute;
    top: -0.5px;
    left: -3px;
    width: 100%;
    content: attr(data-content);
    overflow: hidden;
    pointer-events: none;
    color: #FFF;
    transform: rotate(-4deg);
    text-shadow: 0px 0px 1px #000;
}

<ч/" >


Часть 4: готов к производству

Настраиваемые различные наборы стиля Half-Style можно использовать для желаемых элементов на одной странице. Вы можете определить несколько наборов стилей и сообщить плагину, который он должен использовать.

Плагин использует атрибут данных data-halfstyle="[-CustomClassName-]" для целевых элементов .textToHalfStyle и автоматически делает все необходимые изменения.

Итак, просто на элементе, содержащем текст, добавьте textToHalfStyle класс и атрибут данных data-halfstyle="[-CustomClassName-]". Плагин выполнит оставшуюся часть задания.

halfStyle - Multiple on Same Page

Демо нескольких полусветов на одной странице.

jQuery(function($) {
    var halfstyle_text, halfstyle_chars, $halfstyle_el, halfstyle_i, halfstyle_output, halfstyle_style;

    // Iterate over all class occurrences
    $('.textToHalfStyle').each(function(idx, halfstyle_el) {
        $halfstyle_el = $(halfstyle_el);
        halfstyle_style = $halfstyle_el.data('halfstyle');
        halfstyle_text = $halfstyle_el.text();
        halfstyle_chars = halfstyle_text.split('');

        // Set the screen-reader text
        $halfstyle_el.html('<span style="position: absolute !important;clip: rect(1px 1px 1px 1px);clip: rect(1px, 1px, 1px, 1px);">' + halfstyle_text + '</span>');

        // Reset output for appending
        halfstyle_output = '';

        // Iterate over all chars in the text
        for (halfstyle_i = 0; halfstyle_i < halfstyle_chars.length; halfstyle_i++) {
            // Create a styled element for each character and append to container
            halfstyle_output += '<span aria-hidden="true" class="halfStyle ' + halfstyle_style + '" data-content="' + halfstyle_chars[halfstyle_i] + '">' + halfstyle_chars[halfstyle_i] + '</span>';
        }

        // Write to DOM only once
        $halfstyle_el.append(halfstyle_output);
    });
});

Также определения классов стилей CSS соответствуют части [-CustomClassName-], указанной выше, и привязаны к .halfStyle, поэтому у нас будет .halfStyle.[-CustomClassName-]

 /* start half-style hs-base */
 .halfStyle.hs-base {
    position:relative;
    display:inline-block;
    font-size:80px; /* or any font size will work */
    overflow:hidden;
    white-space: pre; /* to preserve the spaces from collapsing */
    color: #000; /* for demo purposes */
}
.halfStyle.hs-base:before {
    display:block;
    z-index:1;
    position:absolute;
    top:0;
    width: 50%;
    content: attr(data-content); /* dynamic content for the pseudo element */
    pointer-events: none; /* so the base char is selectable by mouse */
    overflow:hidden;
    color: #f00; /* for demo purposes */
}
 /* end half-style hs-base */

/* start half-style hs-horizontal-third */
.halfStyle.hs-horizontal-third { /* base char and also the bottom 1/3 */
    position:relative;
    display:inline-block;
    font-size:80px; /* or any font size will work */
    color: transparent;
    overflow:hidden;
    white-space: pre; /* to preserve the spaces from collapsing */
    color: #f0f;
    text-shadow: 2px 2px 0px #0af; /* for demo purposes */
}
.halfStyle.hs-horizontal-third:before { /* creates the top 1/3 */
    display:block;
    z-index:2;
    position:absolute;
    top:0;
    height: 33.33%;
    content: attr(data-content); /* dynamic content for the pseudo element */
    overflow:hidden;
    pointer-events: none; /* so the base char is selectable by mouse */
    color: #f00; /* for demo purposes */
    text-shadow: 2px -2px 0px #fa0; /* for demo purposes */
}
.halfStyle.hs-horizontal-third:after { /* creates the middle 1/3 */
    display:block;
    position:absolute;
    z-index:1;
    top:0;
    height: 66.66%;
    content: attr(data-content); /* dynamic content for the pseudo element */
    overflow:hidden;
    pointer-events: none; /* so the base char is selectable by mouse */
    color: #000; /* for demo purposes */
    text-shadow: 2px 2px 0px #af0; /* for demo purposes */
}
/* end half-style hs-horizontal-third */

/* start half-style hs-PeelingStyle, by user SamTremaine on Stackoverflow.com */
.halfStyle.hs-PeelingStyle {
    position: relative;
    display: inline-block;
    font-size: 68px;
    color: rgba(0, 0, 0, 0.8);
    overflow: hidden;
    white-space: pre;
    transform: rotate(4deg);
    text-shadow: 2px 1px 3px rgba(0, 0, 0, 0.3);
}
.halfStyle.hs-PeelingStyle:before { /* creates the left part */
    display: block;
    z-index: 1;
    position: absolute;
    top: -0.5px;
    left: -3px;
    width: 100%;
    content: attr(data-content);
    overflow: hidden;
    pointer-events: none;
    color: #FFF;
    transform: rotate(-4deg);
    text-shadow: 0px 0px 1px #000;
}
/* end half-style hs-PeelingStyle */

/* start half-style hs-KevinGranger, by user KevinGranger on StackOverflow.com*/
.textToHalfStyle.hs-KevinGranger {
    display:block;
    margin: 200px 0 0 0;
    text-align:center;
}

.halfStyle.hs-KevinGranger {
    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.hs-KevinGranger: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;
}
/* end half-style hs-KevinGranger

HTML:

<p>
    <span class="textToHalfStyle" data-halfstyle="hs-base">Half-style, please.</span>
</p>
<p>
    <span class="textToHalfStyle" data-halfstyle="hs-horizontal-third">Half-style, please.</span>
</p>
<p>
    <span class="textToHalfStyle" data-halfstyle="hs-PeelingStyle">Half-style, please.</span>
</p>
<p style="background-color:#000;">
    <span class="textToHalfStyle" data-halfstyle="hs-KevinGranger">Half-style, please.</span>
</p>

Демо нескольких полусветов на одной странице.

2488
ответ дан Arbel 09 мая '14 в 19:42
источник поделиться

enter image description here


Я только что закончил разработку плагина, и он доступен для всех! Надеюсь, вам это понравится.

Просмотреть проект на GitHub - Просмотреть проект Веб-сайт. (так что вы можете увидеть все стили разделения)

Использование

Прежде всего, убедитесь, что вы включили библиотеку jQuery. Лучший способ получить последнюю версию jQuery - обновить свой тег заголовка:

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

424
ответ дан Razvan Balosin 09 мая '14 в 19:32
источник поделиться

Изменить (октябрь 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>

Визуально все примеры, которые используют два символа (будь то через JS, псевдо-элементы CSS или просто HTML), выглядят отлично, но обратите внимание, что все добавляет контент в DOM, который может вызвать доступность, а также выбор текста/вырезать/вставить.

180
ответ дан DA. 09 мая '14 в 19:42
источник поделиться

Example


JSFiddle DEMO

Мы сделаем это, используя только псевдоселектора 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);
}
130
ответ дан wvandaal 09 мая '14 в 19:33
источник поделиться

Это может быть неважно, может быть, нет, но когда-то я создал функцию jQuery, которая делает то же самое, но горизонтально.

Я назвал его "Strippex" для "stripe" + "text", demo: http://cdpn.io/FcIBg

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

А, и самое главное, мне было весело создавать его!

enter image description here

83
ответ дан LukyVj 13 мая '14 в 14:05
источник поделиться

Вот уродливая реализация в холсте. Я пробовал это решение, но результаты хуже, чем я ожидал, поэтому все равно.

Canvas example

http://jsfiddle.net/kLXmL/2/

<div>Example Text</div>

$(function(){
    $("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);
        });
    });
});
58
ответ дан HaSuKrOnOs 09 мая '14 в 22:33
источник поделиться

Если вы заинтересованы в этом, тогда Lucas Bebber Glitch - очень похожий и супер крутой эффект:

enter image description here

Создан с использованием простого SASS Mixin, такого как

.example-one {
  font-size: 100px;
  @include textGlitch("example-one", 17, white, black, red, blue, 450, 115);
}

Подробнее на Chris Coyer CSS Tricks и Страница Лукаса Бебера Кодепена

51
ответ дан Ruskin 01 окт. '14 в 15:39
источник поделиться

Ближе всего я могу получить:

$(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>

Демо: http://jsfiddle.net/9wxfY/2/

Вот версия, которая просто использует один диапазон: http://jsfiddle.net/9wxfY/4/

47
ответ дан Prisoner 09 мая '14 в 19:28
источник поделиться

Enter image description here

Я просто играл с решением @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>
42
ответ дан Shipow 12 мая '14 в 23:32
источник поделиться

Другое решение только для 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>
36
ответ дан MStrutt 12 мая '14 в 21:44
источник поделиться

Ограниченное решение CSS и jQuery

Я не уверен, насколько элегантно это решение, но оно сокращает все пополам: http://jsfiddle.net/9wxfY/11/

В противном случае, я создал хорошее решение для вас... Все, что вам нужно сделать, это иметь это для вашего HTML:

Взгляните на это последнее и точное, отредактируйте с 6/13/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 = "&nbsp;";
    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>
29
ответ дан Adjit 09 мая '14 в 19:39
источник поделиться
.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/

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

26
ответ дан Sam Tremaine 13 мая '14 в 12:26
источник поделиться

Хорошее решение для 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;
}
21
ответ дан Sandro Paganotti 09 мая '14 в 20:50
источник поделиться

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);
  }
}
18
ответ дан Ricardo Zea 16 мая '14 в 23:21
источник поделиться

Вы также можете сделать это с помощью 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>

http://codepen.io/nicbell/pen/jGcbq

13
ответ дан Nic Bell 15 мая '14 в 16:26
источник поделиться

Это может быть достигнуто с помощью селектора 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>

→ Посмотрите на jsFiddle

12
ответ дан Sleek Geek 14 янв. '16 в 17:41
источник поделиться

Как насчет чего-то подобного для более короткого текста?

Он может даже работать для более длинных символов, если вы что-то делаете и повторяете над символами с помощью JavaScript, в любом случае результат выглядит примерно так:

Можно ли применить CSS к половине символа?

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>
5
ответ дан Alireza 19 июня '17 в 15:58
источник поделиться

Вы можете использовать код ниже. Здесь в этом примере я использовал тег 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>
4
ответ дан GSB 04 мая '17 в 8:44
источник поделиться

Другие вопросы по меткам