Чи можна застосувати CSS до половини символу?


2816

Що я шукаю:

Спосіб стилізації однієї ПОЛОВИХ персонажів. (У цьому випадку половина букви прозора)

Що я зараз шукав і намагався (Без удачі):

  • Методи стилізації половини символу / букви
  • Стилізація частини символу за допомогою CSS або JavaScript
  • Застосовуйте CSS до 50% символу

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

х

Чи існує для цього рішення CSS або JavaScript, чи мені доведеться вдаватися до зображень? Я вважаю за краще не йти маршрутом зображення, оскільки цей текст в кінцевому підсумку створюється динамічно.


ОНОВЛЕННЯ:

Оскільки багато хто запитував, чому я хотів би колись стилізувати половину персонажа, саме тому. Нещодавно моє місто витратило 250 000 доларів на визначення нового "бренду" для себе. Цей логотип - те, що вони придумали. Багато людей скаржилися на простоту та недостатню творчість і продовжують це робити. Моєю метою було придумати цей веб-сайт як жарт. Наберіть "Галіфакс", і ви побачите, що я маю на увазі.


1
Коментарі не для розширеного обговорення; ця розмова була переміщена до чату .
Іветте

6
Вони запитували "чому", тому що хотіли знати, чому ви використовуєте CSS, а не використовувати SVG чи редактор зображень. Немає нічого спільного з бізнес-рішеннями щодо їх логотипу. Згідно з вашим посиланням на їх логотип, чому ви просто не обрізали X?
user9993

1
Я не можу скаржитися на цей логотип. Так набагато краще, ніж той кривавий маяк.
Parapluie

@Parapluie Я повинен був би погодитися!
Меттью Маклін

Відповіді:


2937

Тепер на GitHub як плагін!

введіть тут опис зображення Не соромтеся роздвоюватися та покращуватись.

Демо | Завантажити Zip | Half-Style.com (перенаправлення на GitHub)


  • Чистий CSS для одного персонажа
  • JavaScript використовується для автоматизації тексту та декількох символів
  • Зберігає доступність тексту для читачів екрану для сліпих або слабозорих

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

Половина стилю на текст

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


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

Також доступність оригінального тексту зберігається для читачів екрану для сліпих або людей із вадами зору.

Пояснення одного символу:

Чистий CSS. Все, що вам потрібно зробити, це застосувати .halfStyleклас до кожного елемента, який містить символ, який ви хочете бути наполовину стилем.

Для кожного прольотного елемента, що містить символ, ви можете створити атрибут даних, наприклад тут 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>

( Демонстрація JSFiddle )


Частина 2: Розширене рішення - Незалежна ліва і права частини

Половина стилю на текст - розширений - з тінню тексту

За допомогою цього рішення можна стилювати ліву та праву частини, окремо та незалежно .

Все те саме, тільки більш просунутий CSS робить магію.

( Демонстрація JSFiddle )



Частина 3: Mix-Match та Improve

Тепер, коли ми знаємо, що можливо, давайте створимо кілька варіацій.


-Горизонтальні половини деталей

  • Без тіньового тексту:

    Половинки по горизонталі - без тіні тексту

  • Можливість тіньового тексту для кожної половини незалежно:

    halfStyle - Горизонтальні половинки - з тінню тексту

( Демонстрація JSFiddle )



-Вертикальні 1/3 частини

  • Без тіньового тексту:

    halfStyle - Вертикальна 1/3 частини - Без тіні тексту

  • Можливість тіньового тексту для кожної 1/3 частини незалежно:

    halfStyle - вертикальна 1/3 частини - з тінню тексту

( Демонстрація JSFiddle )



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

  • Без тіньового тексту:

    halfStyle - Горизонтальні 1/3 частини - Без тіні тексту

  • Можливість тіньового тексту для кожної 1/3 частини незалежно:

    halfStyle - Горизонтальні 1/3 частини - З тінню тексту

( Демонстрація JSFiddle )



-HalfStyle Вдосконалення @KevinGranger

halfStyle - KevinGranger

( Демонстрація JSFiddle )



-PeelingStyle покращення HalfStyle від @SamTremaine

halfStyle - SamTremaine

( Демонстрація JSFiddle та на samtremaine.co.uk )



Частина 4: Готові до виробництва

Індивідуальні різні набори стилів напівстилі можна використовувати для бажаних елементів на одній сторінці. Ви можете визначити кілька наборів стилів і сказати плагіну, який з них використовувати.

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

Отже, просто на елемент, що містить текст, додайте textToHalfStyleклас та атрибут даних data-halfstyle="[-CustomClassName-]". Плагін виконає решту роботи.

halfStyle - Кілька на одній сторінці

Також визначення класів стилів CSS стилів відповідають тій [-CustomClassName-]частині, що була згадана вище, і прикута до цього .halfStyle, тому у нас буде.halfStyle.[-CustomClassName-]

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') || 'hs-base';
        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);
    });
});
/* 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
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<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>

( Демонстрація JSFiddle )


Коментарі не для розширеного обговорення; ця розмова була переміщена до чату .
Іветте

7
Це дуже круто. Варто зауважити, що ця методика порушує обробку слів, пробіл та CSS-інтервал з пробілами.
Ендрю Енслі

2
Приємно бачити, що ми повернулися повним колом до WordArt: D
rovyko

487

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


Я тільки що закінчив розробляти плагін і він доступний для всіх! Сподіваюся, вам сподобається.

Переглянути проект на 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/ .


На даний момент ваше рішення найпростіше здійснити для кількох символів, але все ще не на 100%.
Метью Маклін

@MathewMacLean emisfera має відповідати, правда?
mttdbrd

3
У цьому виникають проблеми з обгортанням тексту, який виставляється навіть в останній скрипці. Коли один символ загортається, він по суті розбивається на два. Має бути тривіальне виправлення, хоча.
BoltClock

16
Не залежайте від jquery-latest.min.js, це може змусити ваші сайти порушуватися без попередження, якщо jQuery оновлено, а плагін не працює з новим. Натомість: використовуйте певну версію та перевіряйте сумісність під час оновлення.
Нільс Бом

2
Ви можете відредагувати свою відповідь, щоб не пропонувати використовувати jquery-latest.js. Як згадував @NielsBom, раніше він міг зламати ваш сайт під час оновлення. З липня 2014 року це не зробить, але це тому, що він заблокований у версії 1.11.1 і більше ніколи не оновлюватиметься.
Марний код

237

Редагування (жовтень 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, що може спричинити доступність - а також вибір тексту / вирізання / вставити випуски.


34
@MathewMacLean наші завдання будуть набагато простішими, якби тільки IE помер, а Firefox почав використовувати Webkit. :)
DA.

48
WebKit має історію помилок, що мають майже дивний рівень IE6 / IE7 (можна навіть сказати, що Safari та Chrome - це IE6 сучасної Інтернету), і поводиться так, що відхиляється від стандарту без особливих причин. IE стала набагато кращою з версії 9, тому, хоча стародавні версії вже повинні вмирати, я не бачу жодної причини для ненависті до останніх версій. І я, звичайно, не бачу, чому люди підтримують ідею монокультури WebKit / Blink (коментарі тут, мабуть, жартома, але я чув про людей, які в це серйозно вірять).
BoltClock

3
Як говориться, background-clip: textце надзвичайно дивовижно, і вони повинні розглянути це (або щось подібне на кшталт text-decoration-background) для модуля 4 рівня.
BoltClock

2
Так, я був би щасливішим, якби blink / webkit помер, а сучасні IE + FF-рендери вижили, ніж навпаки. Що не означає, що решта хрому не є приємною, просто те, що її надання є найгіршим згустком сьогодні.
Еймон Нербонна

2
Це набагато більш чисте рішення, ніж вищезгадані бібліотеки, наведені вище, і повинні бути прийнятною відповіддю, оскільки градієнти тексту використовуються в наш час.
mystrdat

160

Приклад


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

Це акуратно, але єдине питання полягає в тому, що контент буде динамічним.
Метью Маклін

Результати залежать від використовуваного шрифту. Плюс обчислення ширини здається проблемою.
j08691

@MathewMacLean Хм, чи буде ваш вміст колись одним символом? Якщо ні, чи хотіли б ви, щоб кожен символ мав однаковий кольоровий ефект розщеплення або лише певний (тобто перший)?
неділя

1
@MathewMacLean ви можете написати просту функцію циклу в JS для завершення обгортання. Я зараз додаю це до своєї відповіді.
неділя

1
@MathewMacLean Звідки походить текст? wvandaal вірно, ви можете обгортати текст самостійно.
mttdbrd

96

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

Я назвав це "Стриппекс" Для "смуги" + "тексту", демонстрація: http://cdpn.io/FcIBg

Я не кажу, що це рішення будь-яких проблем, але я вже намагався застосувати css до половини символу, але по горизонталі. Отже, ідея така ж, реалізація може бути жахливою, але вона працює.

А, і найголовніше, мені було весело це створювати!

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


2
@Luky Vj: Це ваш рахунок? Можливо, ви хочете об'єднати всі свої публікації в один обліковий запис, щоб ви не стикалися з дорожніми блоками, намагаючись редагувати власні повідомлення.
BoltClock

Так, насправді я спершу опублікував зі своїм старим першим обліковим записом .. І мені довелося додати зображення, і я був недостатньо популярний, щоб розмістити своє зображення .. Але ти маєш рацію, я виправлю це якнайшвидше !
LukyVj

1
@LukyVj: Ви можете об'єднати свої рахунки, дотримуючись інструкції тут: stackoverflow.com/help/merging-accounts
BoltClock

1
@LukyVj Я оновив вашу функцію, додавши pointer-events:noneдо &:nth-child(2)- &:nth-child(5). Це робить його таким чином, що текст можна виділити лише один раз, і ви отримаєте лише одну копію. Переглянути його можна тут: codepen.io/anon/pen/upLaj
Mathew MacLean


74

Тут потворна реалізація в полотні. Я спробував це рішення, але результати гірші, ніж я очікував, так що тут все одно.

Приклад полотна

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


1
До речі, ви можете використовувати і 0.5для зупинки червоного кольору.
Зубна щітка

62

Найближче я можу отримати:

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


1
$('span').width()просто повертає ширину першого прольоту, який він знайде; це повинно було бути чимось, що ви робили для кожної пари. Що дає мені уявлення ...
Pointy

Це досить схоже на приклад epascarello, знайдений на сайті jsfiddle.net/9WWsd. Як я йому казав, ваш приклад - це крок у правильному напрямку, але, це було б кошмаром, щоб скористатися в більшому масштабі.
Метью Маклін

@MathewMacLean, я цього не бачив. Чому це був кошмар? Як щодо цього: jsfiddle.net/9wxfY/4
В'язень

Коли ви переходите до реалізації декількох символів, це створює проблеми.
Метью Маклін

@MathewMacLean - ось звідки приходить казковий Lettering.JS .
Pointy

53

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

Я щойно грав із рішенням @ Арбеля:

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>


4
Щойно грав із рішенням @Arbel У чому полягають відмінності від рішення Арбела ? Важко зрозуміти, чи ви лише скопіювали якийсь код або вдосконалили його.
AL

43

Ще одне рішення, що стосується лише CSS (хоча атрибут даних потрібен, якщо ви не хочете писати 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>


38

Обмежений 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 = "&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>


Це ті самі проблеми, що й інші. Це починає безладно, коли ви намагаєтеся зробити це з кількома символами.
Меттью Маклін

@MathewMacLean Я знаю: (бачив, що теж працює над цим зараз
Аджит

@MathewMacLean виправив це, але не впевнений, наскільки чистий JQuery зараз. Погляньте
Аджит

@MathewMacLean додавши до веб-версії речей речі, ви можете використовувати таке рішення: jsfiddle.net/wLkVt/1
Adjit

@MathewMacLean Виправлена ​​помилка в моєму сценарії. Причиною помилки було те, що я весь час приймав ширину першого елемента замість ширини літер.
Аджит

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

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



24

Як щодо чогось такого коротшого тексту?

Це може працювати навіть для більш тривалого тексту, якщо ви зробили щось із циклом, повторюючи символи за допомогою 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>


23

FWIW, ось я сприймаю це, роблячи це лише за допомогою CSS: http://codepen.io/ricardozea/pen/uFbts/

Кілька приміток:

  • Основна причина, яку я зробив це, - перевірити себе і побачити, чи зможу я виконати стилізацію половини персонажа, фактично надаючи змістовну відповідь в ОП.

  • Я усвідомлюю, що це не ідеальне чи найбільш масштабоване рішення, і рішення, запропоновані людьми, тут набагато кращі для сценаріїв "реального світу".

  • CSS-код, який я створив, ґрунтується на перших думках, які мені прийшли в голову, і особистому підходу до проблеми.

  • Моє рішення працює лише на симетричних символах, таких як X, A, O, M. ** Це не працює на асиметричних символах, таких як B, C, F, K або малі літери.

  • ** ЗАРАЗ, такий підхід створює дуже цікаві «форми» з асиметричними символами. Спробуйте змінити 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);
  }
}

17

Ви також можете зробити це за допомогою 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


16

Цього можна досягти лише за допомогою :beforeселектора CSS та 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


8

Ви можете використовувати код нижче. Тут у цьому прикладі я використав 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>


5

Просто для запису в історії!

Я придумав рішення для своєї власної роботи з 5-6 років тому, це Gradext (чистий javascript та чистий css, відсутність залежності).

Технічне пояснення полягає в тому, що ви можете створити такий елемент:

<span>A</span>

Тепер, якщо ви хочете зробити градієнт на тексті, вам потрібно створити декілька шарів, кожен окремо конкретно кольоровий, а створений спектр буде ілюструвати ефект градієнта.

наприклад, подивіться на це слово lorem усередині a <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 із цього сховища, оскільки я з Ірану! Тут доступний лише вихідний код ...

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.