Bir karakterin yarısına CSS uygulamak mümkün müdür?


2816

Ne arıyorum:

Bir karakterin bir YARIMINI biçimlendirmenin bir yolu . (Bu durumda, mektubun yarısı saydamdır)

Şu anda ne aradım ve denedim (şanssız):

  • Bir karakterin / harfin yarısını şekillendirme yöntemleri
  • Karakterin bir kısmını CSS veya JavaScript ile şekillendirme
  • Bir karakterin% 50'sine CSS uygulama

Aşağıda elde etmeye çalıştığım şeyin bir örneği var.

x

Bunun için bir CSS veya JavaScript çözümü var mı yoksa resimlere başvurmam gerekecek mi? Bu metin dinamik olarak üretilecek gibi görüntü yolu gitmek tercih etmem.


GÜNCELLEME:

Birçoğu neden bir karakterin yarısını neden şekillendirmek istediğimi sorduğundan, bu yüzden. Şehrim yakın zamanda kendisi için yeni bir "marka" tanımlamak için 250.000 dolar harcadı. Bu logo ortaya çıktıkları şey. Birçok insan yaratıcılığın basitliğinden ve eksikliğinden şikayetçidir ve bunu yapmaya devam etmektedir. Amacım bu web sitesini şaka yapmaktı. 'Halifax' yazdığınızda ne demek istediğimi göreceksiniz.


1
Yorumlar uzun tartışmalar için değildir; bu sohbet sohbete taşındı .
Yvette

6
"Neden" diye soruyorlardı, çünkü neden SVG veya bir resim düzenleyici kullanmıyorsunuz? Logoları ile ilgili iş kararları ile ilgisi yoktur. Logolarına olan bağlantınıza göre, neden sadece X'i kırpmadınız?
user9993

1
Bu logodan şikayet edemem. O kanlı deniz fenerinden çok daha iyi.
Parapluie

@ Kabul etmek zorundayım!
Mathew MacLean

Yanıtlar:


2938

Şimdi GitHub'da Eklenti Olarak!

resim açıklamasını buraya girin Çatal yapmaktan ve geliştirmekten çekinmeyin.

Demo | Zip İndir | Half-Style.com ( GitHub'a yönlendirir)


  • Tek Karakter için Saf CSS
  • Metin veya birden çok karakter arasında otomasyon için kullanılan JavaScript
  • Kör veya görme engelliler için ekran okuyucular için Metin Erişilebilirliğini korur

Bölüm 1: Temel Çözüm

Metin üzerinde Yarım Stil

Demo: http://jsfiddle.net/arbel/pd9yB/1694/


Bu, herhangi bir dinamik metin veya tek bir karakter üzerinde çalışır ve tümü otomatiktir. Tek yapmanız gereken hedef metne bir sınıf eklemek ve gerisini halletmek.

Ayrıca, orijinal metnin erişilebilirliği kör veya görme engelli ekran okuyucuları için korunur.

Tek bir karakter için açıklama:

Saf CSS. Tek yapmanız gereken, .halfStyleyarım stilli olmasını istediğiniz karakteri içeren her öğeye sınıf uygulamaktır .

Karakteri içeren her yayılma öğe için, burada örneğin bir veri niteliği oluşturabilir data-content="X"ve sözde elemanı kullanımına content: attr(data-content);böylece .halfStyle:beforesınıf dinamik olacak ve her örneği için zor koduna gerek kalmaz.

Herhangi bir metin için açıklama:

textToHalfStyleMetni içeren öğeye sınıf eklemeniz yeterlidir .


// 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 demosu )


Bölüm 2: Gelişmiş çözüm - Bağımsız sol ve sağ parçalar

Metinde Yarım Stil - gelişmiş - Metin Gölgeli

Bu çözüm ile sol ve sağ parçaları ayrı ayrı ve bağımsız olarak şekillendirebilirsiniz .

Her şey aynı, sadece daha gelişmiş CSS sihri yapıyor.

( JSFiddle demosu )



Bölüm 3: Mix-Match ve Geliştir

Neyin mümkün olduğunu bildiğimize göre, bazı varyasyonlar oluşturalım.


-Yatay Yarım Parçalar

  • Metin Gölgesiz:

    Yatay Yarım Parçalar - Metin Gölgesi Yok

  • Bağımsız olarak her yarım parça için Metin Gölgesi olasılığı:

    halfStyle - Yatay Yarım Parçalar - Metin Gölgeli

( JSFiddle demosu )



-Dikey 1/3 Parçalar

  • Metin Gölgesiz:

    halfStyle - Dikey 1/3 Parçalar - Metin Gölgesi Yok

  • Her 1/3 parça için bağımsız olarak Metin Gölgesi olasılığı:

    halfStyle - Dikey 1/3 Parçalar - Metin Gölgeli

( JSFiddle demosu )



-Yatay 1/3 Parçalar

  • Metin Gölgesiz:

    halfStyle - Yatay 1/3 Parçalar - Metin Gölgesi Yok

  • Her 1/3 parça için bağımsız olarak Metin Gölgesi olasılığı:

    halfStyle - Yatay 1/3 Parçalar - Metin Gölgeli

( JSFiddle demosu )



-HalfStyle Improvement By @KevinGranger

halfStyle - KevinGranger

( JSFiddle demosu )



@SamTremaine tarafından HalfStyle iyileştirmesi

halfStyle - SamTremaine

( JSFiddle demosu ve samtremaine.co.uk adresinde )



Bölüm 4: Üretime Hazır

Özelleştirilmiş farklı Yarım Stil stil setleri, aynı sayfada istenen elemanlarda kullanılabilir. Birden fazla stil seti tanımlayabilir ve eklentiye hangisini kullanacağını söyleyebilirsiniz.

Eklenti data-halfstyle="[-CustomClassName-]", hedef .textToHalfStyleöğelerde veri niteliğini kullanır ve gerekli tüm değişiklikleri otomatik olarak yapar.

Yani, sadece metin içeren öğede textToHalfStylesınıf ve veri özniteliği ekleyin data-halfstyle="[-CustomClassName-]". Eklenti işin geri kalanını yapacak.

halfStyle - Aynı Sayfada Birden Çok

Ayrıca CSS stil kümelerinin sınıf tanımları [-CustomClassName-]yukarıda belirtilen bölümle eşleşir ve zincirlenir .halfStyle, bu yüzden.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 demosu )


Yorumlar uzun tartışmalar için değildir; bu sohbet sohbete taşındı .
Yvette

7
Bu çok havalı. Bu tekniğin sözcük kaydırma, boşluk ve karakter aralığı CSS'sini bozduğuna dikkat etmek gerekir.
Andrew Ensley

2
D: Güzel biz WordArt için tam daire geri gelip ettik görmek için
rovyko

488

resim açıklamasını buraya girin


Eklentiyi geliştirmeyi yeni bitirdim ve herkesin kullanımına hazır! Umarım beğenirsiniz.

Görüntüleme Projesi GitHub'dan - Görünüm Projesi Web sitesi . (böylece tüm bölünmüş stilleri görebilirsiniz)

kullanım

Her şeyden önce, jQuerykütüphanenin dahil edildiğinden emin olun . En son jQuery sürümünü almanın en iyi yolu, kafa etiketinizi şu şekilde güncellemektir:

<script src="http://code.jquery.com/jquery-latest.min.js"></script>

Dosyaları indirdikten sonra, projenize eklediğinizden emin olun:

<link rel="stylesheet" type="text/css" href="css/splitchar.css">
<script type="text/javascript" src="js/splitchar.js"></script>

Biçimlendirme

Tek yapmanız gereken, sınıfı atamak ve splitcharardından metninizi saran öğeye istediğiniz stili uygulamaktır. Örneğin

<h1 class="splitchar horizontal">Splitchar</h1>

Tüm bunlar yapıldıktan sonra, belge hazır dosyanızdaki jQuery işlevini şöyle çağırdığınızdan emin olun:

$(".splitchar").splitchar();

Özelleştirme

Metnin tam olarak istediğiniz gibi görünmesini sağlamak için tek yapmanız gereken tasarımınızı şu şekilde uygulamaktır:

.horizontal { /* Base CSS - e.g font-size */ }
.horizontal:before { /* CSS for the left half */ }
.horizontal:after { /* CSS for the right half */ }


Bu kadar! Şimdi Splitchartüm eklentiyi ayarladınız. Bu konuda daha fazla bilgi için http://razvanbalosin.com/Splitchar.js/ .


Şu andan itibaren, çözümünüz birden fazla karakter için uygulanması en kolay olanıdır, ancak yine de% 100 orada değildir.
Mathew MacLean

@MathewMacLean emisfera'nın cevabı olmalı, değil mi?
mttdbrd

3
Bu, en son kemanda bile sergilenen metin kaydırma ile ilgili problemlere sahiptir. Bir karakter tamamlandığında, esasen ikiye ayrılır. Gerçi önemsiz bir düzeltme olmalı.
BoltClock

16
Jquery-latest.min.js'ye güvenmeyin, jQuery güncellenirse ve eklenti yeni olanla çalışmazsa, sitelerinizi uyarı yapmadan bozabilir. Bunun yerine: belirli bir sürümü kullanın ve güncelleme sırasında uyumluluğu kontrol edin.
Niels Bom

2
Yanıtınızı jquery-latest.js kullanılmasını önermemek üzere düzenlemek isteyebilirsiniz. @NielsBom'un belirttiği gibi, geçmişte sitenizi güncellenirken bozabilir. Temmuz 2014'ten bu yana, bunu yapmayacak, ancak bunun nedeni 1.11.1 sürümünde kilitlenmiş olması ve bir daha asla güncellenmemesidir.
Yararsız Kod

237

Edit (oct 2017): background-clipya da daha ziyade background-image optionsartık her büyük tarayıcı tarafından destekleniyor: CanIUse

Evet, bunu yalnızca bir karakter ve yalnızca CSS ile yapabilirsiniz.

Ancak yalnızca Webkit (ve 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>

Görsel olarak, iki karakter kullanan tüm örnekler (JS, CSS sözde öğeleri veya sadece HTML yoluyla olsun) iyi görünüyor, ancak hepsinin DOM'a erişilebilirliğe neden olabilecek içerik eklediğini - ayrıca metin seçimi / kes / sorunları yapıştırın.


34
@MathewMacLean İşlerimiz sadece IE ölecek ve Firefox Webkit kullanmaya başlarsa çok daha kolay olurdu. :)
DA.

48
WebKit, neredeyse IE6 / IE7 tuhaf seviyeleri olan hata oluşturma geçmişine sahiptir (Safari ve Chrome'un modern web'in IE6 olduğunu bile söyleyebilirsiniz) ve belirli bir nedenden ötürü standarttan sapan şekilde davranır. IE, sürüm 9'dan beri çok daha iyi oldu, bu yüzden eski sürümler zaten ölmek zorunda olsa da, son sürümleri için nefret için bir neden görmüyorum. Ve kesinlikle insanların neden bir WebKit / Blink monokültürü fikrini desteklediğini anlamıyorum (buradaki yorumlar muhtemelen jesttir, ancak ciddiye inanan insanları duydum).
BoltClock

3
Olduğu söyleniyor, background-clip: textsüper harika ve text-decoration-backgroundbir seviye 4 modülü için (veya benzer bir şey ) düşünmelisiniz .
BoltClock

2
Evet, eğer göz kırpma / webkit ölürse ve modern IE'nin + FF işleme motorları diğerlerinden daha hayatta kalırsa daha mutlu olurdum. Bu, kromun geri kalanının hoş olmadığı anlamına gelmiyor, sadece renderlenmesi bugünlerde grubun en kötüsü.
Eamon Nerbonne

2
Bu, yukarıdaki hacky kütüphanelerinden çok daha temiz bir çözümdür, çünkü metin gradyanları günümüzde kullanılabilir olduğu için kabul edilen bir cevap olmalıdır.
mystrdat

160

Misal


JSFiddle DEMO

Bunu sadece CSS sözde seçicileri kullanarak yapacağız!

Bu teknik, dinamik olarak oluşturulan içerik ve farklı yazı tipi boyutları ve genişlikleriyle çalışır.

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

Dinamik olarak oluşturulan dizeyi kaydırmak için aşağıdaki gibi bir işlev kullanabilirsiniz:

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

Bu temiz, ancak tek sorun içerik dinamik olacak.
Mathew MacLean

Sonuçlar kullanılan yazı tipine göre değişir. Artı genişliği hesaplamak bir sorun gibi görünüyor.
j08691

@MathewMacLean hmm, içeriğiniz hiç bir karakter olabilir mi? Değilse, her karakterin aynı bölünmüş renk efektine mi yoksa sadece belirli karakterlere mi (yani ilkine) sahip olmasını ister misiniz?
wvandaal

1
@MathewMacLean kaydırmayı gerçekleştirmek için JS'de basit bir döngü işlevi yazabilirsiniz. Şimdi cevabıma ekliyorum.
wvandaal

1
@MathewMacLean Metin nereden geliyor? wvandaal doğru, metni kendiniz sarabilirsiniz.
mttdbrd

96

Alakasız olabilir, belki olmayabilir, ama bir süre önce aynı şeyi yapan, ancak yatay olarak yapan bir jQuery işlevi oluşturdum.

Buna "Strippex" adını verdim 'Şerit' + 'metin' için, demo: http://cdpn.io/FcIBg

Bunun herhangi bir sorunun çözümü olduğunu söylemiyorum, ama zaten bir karakterin yarısına css uygulamaya çalıştım, ancak yatay olarak, Yani fikir aynı, gerçekleşme korkunç olabilir, ama işe yarıyor.

Ah, ve en önemlisi, bunu yaparken eğlendim!

resim açıklamasını buraya girin


2
@Luky Vj: Bu hesap sizin mi? Tüm yayınlarınızı tek bir hesapta birleştirmek isteyebilirsiniz, böylece kendi yayınlarınızı düzenlemeye çalışırken birlikte gösterimlerle karşılaşmazsınız.
BoltClock

Evet, aslında, ilk önce eski hesabımla paylaşımda bulundum .. Ve bir resim eklemek zorunda kaldım ve resmimi gönderecek kadar popüler değildim .. Ama haklısın, en kısa zamanda çözeceğim !
LukyVj

1
@LukyVj: Hesaplarınızı aşağıdaki talimatları izleyerek birleştirebilirsiniz: stackoverflow.com/help/merging-accounts
BoltClock

1
@LukyVj Ben ekleyerek fonksiyonu güncellenmiş pointer-events:noneiçin &:nth-child(2)- &:nth-child(5). Bu, metnin yalnızca bir kez vurgulanabilmesini ve yalnızca bir kopyasının alınmasını sağlar. Burada görebilirsiniz: codepen.io/anon/pen/upLaj
Mathew MacLean


74

İşte tuvalde çirkin bir uygulama. Bu çözümü denedim, ancak sonuçlar beklediğimden daha kötü, işte burada.

Tuval örneği

$("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
BTW, 0.5kırmızı renk durağı için de kullanabilirsiniz .
Diş fırçası

62

En yakın alabilirim:

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

Demo: http://jsfiddle.net/9wxfY/2/

Sadece bir açıklık kullanan bir sürüm var: http://jsfiddle.net/9wxfY/4/


1
$('span').width()sadece bulduğu ilk açıklığın genişliğini döndürür; her bir çift için yaptığınız bir şey olmalı. Bu bana bir fikir veriyor ...
Sivri

Bu epascarello'nun jsfiddle.net/9WWsd adresinde bulunan örneğine oldukça benzer. Söylediğim gibi, örneğiniz doğru yönde atılmış bir adım, ama daha büyük ölçekte kullanmak bir kabus olurdu.
Mathew MacLean

@ MathewMacLean, bunu görmedim. Neden kabus olsun ki? Buna ne dersiniz: jsfiddle.net/9wxfY/4
Mahkum

Birden fazla karakter uygulamaya başladığınızda sorunlara neden olur.
Mathew MacLean

@MathewMacLean muhteşem Lettering.JS devreye giriyor.
Sivri

53

Resim açıklamasını buraya girin

Az önce @ Arbel'in çözümü ile oynadım:

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
Az önce @Arbel çözümü ile oynandı Arbel'in çözümü ile arasındaki farklar nelerdir? Yalnızca bazı kodları kopyalayıp yapıştırıp yapıştırmadıklarınızı görmek zor.
AL

43

Başka bir yalnızca CSS çözümü (harfe özgü CSS yazmak istemiyorsanız veri özniteliği gereklidir). Bu, kart genelinde daha fazla çalışır (IE 9/10, en son Chrome ve FF en son test edildi)

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

Sınırlı CSS ve jQuery Çözümü

Bu çözümün ne kadar zarif olduğundan emin değilim, ama her şeyi tam olarak yarıya indiriyor : http://jsfiddle.net/9wxfY/11/

Aksi takdirde, sizin için güzel bir çözüm oluşturdum ... Tek yapmanız gereken HTML'niz için budur:

13.06.2016 itibarıyla bu en son ve doğru düzenlemeye bir göz atın: http://jsfiddle.net/9wxfY/43/

CSS'ye gelince, çok sınırlıdır ... Sadece :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>


Bu, diğerlerinin sahip olduğu sorunların aynısına sahiptir. Birden fazla karakterle yapmaya çalıştığınızda dağınık olmaya başlar.
Mathew MacLean

@MathewMacLean Biliyorum :( bunu da gördüm. Şimdi üzerinde çalışıyor
17'de ayarla

@ MathewMacLean düzeltti, ancak JQuery'nin şimdi ne kadar temiz olduğundan emin değilim. Bir göz atın
Adjit

: Şeylerin webkit sürümüne ekleyerek @MathewMacLean böyle bir çözüm kullanabilirsiniz jsfiddle.net/wLkVt/1
Adjit

@MathewMacLean Betikimdeki hata düzeltildi. Hatanın nedeni, harflerin genişliği yerine her zaman ilk elemanın genişliğini alıyordum.
17'de

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/

Bu kodu her türlü ilginç şeyi yapmak için kullanabilirsin - bu sadece arkadaşımdan biri ve dün gece geldim.



24

Daha kısa metin için böyle bir şeye ne dersiniz?

Bir döngü ile bir şeyler yaptıysanız ve karakterleri JavaScript ile tekrarlarsanız daha uzun metinler için bile çalışabilir. Her neyse, sonuç şuna benzer:

Bir karakterin yarısına CSS uygulamak mümkün müdür?

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, işte bunu sadece CSS ile yapıyorum: http://codepen.io/ricardozea/pen/uFbts/

Birkaç not:

  • Bunu yapmamın temel nedeni, kendimi test etmek ve aslında OP'ye anlamlı bir cevap verirken bir karakterin yarısını şekillendirmeyi başarabildiğimi görmekti.

  • Bunun ideal veya en ölçeklenebilir bir çözüm olmadığını ve buradaki insanlar tarafından önerilen çözümlerin "gerçek dünya" senaryoları için çok daha iyi olduğunu biliyorum.

  • Oluşturduğum CSS kodu aklıma gelen ilk düşünceleri ve bu soruna kendi kişisel yaklaşımımı temel alıyor.

  • Çözümüm yalnızca X, A, O, M gibi simetrik karakterler üzerinde çalışıyor. ** B, C, F, K veya küçük harfler gibi asimetrik karakterler üzerinde çalışmaz.

  • ** ANCAK, bu yaklaşım asimetrik karakterlerle çok ilginç 'şekiller' yaratır. X'i K olarak veya CSS'de h veya p gibi küçük harf olarak değiştirmeyi deneyin :)

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

İsterseniz SVG'yi kullanarak da yapabilirsiniz:

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

Bu sadece CSS :beforeseçici ve 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 üzerinde görün


8

Aşağıdaki kodu kullanabilirsiniz. Burada bu örnekte h1etiket kullandım ve aşağıdaki örnekte gösterildiği gibi, efekt yarım data-title-text="Display Text"renkli metin veren h1etiket metin öğesinde farklı renk metinleriyle görünecek bir özellik ekledim

resim açıklamasını buraya girin

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

Sadece tarihin rekoru için!

Gradext (saf javascript ve saf css, bağımlılık yok) olan 5-6 yıl önce kendi çalışmalarım için bir çözüm buldum .

Teknik açıklama şuna benzer bir öğe oluşturabilirsiniz:

<span>A</span>

şimdi metinde degrade yapmak istiyorsanız, her biri ayrı ayrı özel olarak renklendirilmiş birkaç katman oluşturmanız gerekir ve oluşturulan spektrum degrade efektini gösterecektir.

örneğin şuna a'nın içindeki lorem kelimesi bakın ve <span>yatay gradyan efektine neden olacaktır ( örneklere bakın ):

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

ve bu modeli uzun süre ve uzun paragraflar için de yapmaya devam edebilirsiniz.

resim açıklamasını buraya girin

Fakat!

Dikey bir degrade oluşturmak isterseniz ne olur?Metinler üzerinde efekti ?

Sonra yardımcı olabilecek başka bir çözüm var. Ayrıntılı olarak anlatacağım.

<span>Yine ilkimiz varsayalım . ancak içerik ayrı ayrı harfler olmamalıdır; İçerik tüm metin olmalıdır, şimdi de aynı kopyalamak için gidiyoruz <span>(sizin gradyan kalitesini daha yayılma, daha iyi bir sonuç, ama kötü performans tanımlayacak aralıkların sayım) tekrar tekrar şuna bir göz at:

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

resim açıklamasını buraya girin

Yine, Ama!

bu degrade efektlerini hareket ettirmek ve animasyon oluşturmak için ne yapmalısınız?

bunun için başka bir çözüm daha var. Kesinlikle imlecin konumuna göre bir degradeye yol açacak yöntemi kontrol etmeli animation: truehatta .hoverable()eşitlemelisiniz! (kulağa hoş geliyor xD)

resim açıklamasını buraya girin

metinlerde degrade (doğrusal veya radyal) oluşturduğumuz budur. Fikri beğendiyseniz veya bu konuda daha fazla bilgi edinmek istiyorsanız, sağlanan bağlantıları kontrol etmelisiniz.


Belki de bu en iyi seçenek değildir, belki de bunu yapmanın en iyi performans yolu değildir, ancak diğer insanlara daha iyi bir çözüm için ilham vermek için heyecan verici ve keyifli animasyonlar oluşturmak için biraz alan açacaktır.

IE8 tarafından bile desteklenen metinlerde gradyan stilini kullanmanıza izin verecektir!

Burada çalışan bir canlı demo bulabilirsiniz ve orijinal depo GitHub'da da açık kaynak ve bazı güncellemeler almaya hazır (: D)

Bu ilk kez (evet, 5 yıl sonra, doğru duydunuz) bu depodan internetin herhangi bir yerinde bahsetmek istiyorum ve bunun için heyecanlıyım!


[Güncelleme - 2019 Ağustos:] Github , İran'dan olduğum için bu deponun github-sayfa demosunu kaldırdı ! Sadece kaynak kodu burada kullanılabilir tho ...

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.