小编典典

是否可以将CSS应用于字符的一半?

css

我在寻找什么:

设置一个字符的一半样式的方法。(在这种情况下,一半字母是透明的)

我目前正在搜索并尝试过的内容(没有运气):

  • 样式字符/字母一半的方法
    使用CSS或JavaScript设置字符的样式
    将CSS应用于字符的50%

以下是我尝试获取的示例。

为此是否存在CSS或JavaScript解决方案,还是我不得不诉诸图像?我宁愿不走图片路线,因为此文本最终会动态生成。

更新:

既然许多人问我为什么要对角色的一半进行样式设置,这就是为什么。我市最近花费了25万美元为自己定义了一个新的“品牌”。他们想出了这个徽标。许多人抱怨简单性和缺乏创造力,并继续这样做。我的目标是开个玩笑这个网站。输入“ Halifax”,您将明白我的意思。


阅读 306

收藏
2020-05-16

共1个答案

小编典典

第1部分:基本解决方案

这适用于任何动态文本或单个字符,并且都是自动化的。您需要做的就是在目标文本上添加一个类,其余的工作都将得到解决。

而且,为盲人或视障者的屏幕阅读器保留了原始文本的可访问性。

单个字符的说明:

纯CSS。您需要做的就是将.halfStyleclass应用于每个包含要半样式字符的元素。

对于每个包含字符的span元素,您都可以创建一个data属性(例如here)data-content=”X”,并在伪元素上使用,content: attr(data-content);这样.halfStyle:before该类将是动态的,并且您无需为每个实例进行硬编码。

任何文字的说明:

只需将textToHalfStyleclass 添加到包含文本的元素中即可。


// jQuery for automated mode

jQuery(function($) {

    var text, chars, $el, i, output;



    // Iterate over all class occurences

    $('.textToHalfStyle').each(function(idx, el) {

    $el = $(el);

    text = $el.text();

    chars = text.split('');



    // Set the screen-reader text

    $el.html('<span style="position: absolute !important;clip: rect(1px 1px 1px 1px);clip: rect(1px, 1px, 1px, 1px);">' + text + '</span>');



    // Reset output for appending

    output = '';



    // Iterate over all chars in the text

    for (i = 0; i < chars.length; i++) {

        // Create a styled element for each character and append to container

        output += '<span aria-hidden="true" class="halfStyle" data-content="' + chars[i] + '">' + chars[i] + '</span>';

    }



    // Write to DOM only once

    $el.append(output);

  });

});


.halfStyle {

    position: relative;

    display: inline-block;

    font-size: 80px; /* or any font size will work */

    color: black; /* or transparent, any color */

    overflow: hidden;

    white-space: pre; /* to preserve the spaces from collapsing */

}



.halfStyle:before {

    display: block;

    z-index: 1;

    position: absolute;

    top: 0;

    left: 0;

    width: 50%;

    content: attr(data-content); /* dynamic content for the pseudo element */

    overflow: hidden;

    color: #f00;

}


<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>



<p>Single Characters:</p>

<span class="halfStyle" data-content="X">X</span>

<span class="halfStyle" data-content="Y">Y</span>

<span class="halfStyle" data-content="Z">Z</span>

<span class="halfStyle" data-content="A">A</span>



<hr/>

<p>Automated:</p>



<span class="textToHalfStyle">Half-style, please.</span>

第2部分:高级解决方案-左右独立的部分

使用此解决方案,您可以分别和独立地为左右零件定型。

一切都一样,只有更高级的CSS才能发挥作用。

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: 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 */

}


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

第3部分:混搭和改进

// 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: 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 */

}


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

-垂直的1/3部分

// 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 { /* 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 */

}


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

-Horizontal 1/3 Parts

// 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 { /* 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 */

}


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

-HalfStyle Improvement By @KevinGranger

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

  });

});


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

-PeelingStyle improvement of HalfStyle by

// 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: 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;

}


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

第4部分:准备生产

可以在同一页面上的所需元素上使用自定义的不同Half-Style样式集。您可以定义多个样式集,并告诉插件使用哪个样式集。

该插件data-halfstyle=”[-CustomClassName-]”在目标.textToHalfStyle元素上使用data属性,并自动进行所有必要的更改。

因此,只需在包含文本的元素上添加textToHalfStyleclass和data属性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>
2020-05-16