Как заменить встроенный текст изображениями с помощью CSS - PullRequest
0 голосов
/ 21 мая 2009

Я хотел бы заменить текст ( "Слово 1 Слово2, Слово3 Слово4" ) в следующем HTML-изображениями с использованием CSS. Я бы хотел, чтобы изображения также появлялись в горизонтальном положении, как и текст.

<div id="aSentence">
    <p>
        <span id="word1">Word1&nbsp </span>
        <span id="word2">Word2&nbsp </span>
        <span id="word3">Word3&nbsp </span>
        <span id="word4">Word4&nbsp </span>
    </p>                    
</div>

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

Есть идеи, как мне достичь этой цели? Я хотел бы (если возможно) сделать решение «доступным» для программ чтения с экрана и т. Д.

Большое спасибо,
Prembo.

PS: я пытался реализовать некоторые из техник - ни один из них не работал должным образом: TextReplacement.html

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
    <head>
        <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
        <title>Text Replacement by Image using CSS</title>
        <style type="text/css" title="currentStyle" media="screen">
            @import "TextReplacement.css";
        </style>
    </head>

    <body id="bodyId">
        <div id="centerContainer">
            <h1><span>Comparison of Various Techniques</span></h1>
            <p class="noteText">(NOTE: only text "Word1" is being replaced by image)</p>
            <div id="mainBodyContainer">
                <div class="techniqueContainer">
                    <h2>Technique 1: FIR</h2>
                    <ul id="t1List">
                        <li id="t1w1"><span>Word1.&nbsp;</span></li>
                        <li id="t1w2"><span>Word2.&nbsp; </span></li>
                        <li id="t1w3"><span>Word3.&nbsp; </span></li>
                        <li id="t1w4"><span>Word4.&nbsp; </span></li>
                    </ul>                    
                    <p class="techniqueComment">Word 1 and corresponding image disappear completely.</p>
                </div>

                <div class="techniqueContainer">
                    <h2>Technique 2: Radu</h2>
                    <ul id="t2List">
                        <li id="t2w1"><span>Word1.&nbsp;</span></li>
                        <li id="t2w2"><span>Word2.&nbsp; </span></li>
                        <li id="t2w3"><span>Word3.&nbsp; </span></li>
                        <li id="t2w4"><span>Word4.&nbsp; </span></li>
                    </ul>                    
                    <p class="techniqueComment">All disapppear completely.</p>
                </div>                

                <div class="techniqueContainer">
                    <h2>Technique 3: Rundle</h2>
                    <ul id="t3List">
                        <li id="t3w1"><span>Word1.&nbsp;</span></li>
                        <li id="t3w2"><span>Word2.&nbsp; </span></li>
                        <li id="t3w3"><span>Word3.&nbsp; </span></li>
                        <li id="t3w4"><span>Word4.&nbsp; </span></li>
                    </ul>                    
                    <p class="techniqueComment">No effect - image and text visible.</p>
                </div>    

                <div class="techniqueContainer">
                    <h2>Technique 4: Leahy/Langridge</h2>
                    <ul id="t4List">
                        <li id="t4w1"><span>Word1.&nbsp;</span></li>
                        <li id="t4w2"><span>Word2.&nbsp; </span></li>
                        <li id="t4w3"><span>Word3.&nbsp; </span></li>
                        <li id="t4w4"><span>Word4.&nbsp; </span></li>
                    </ul>                    
                    <p class="techniqueComment">Image appears above Word1.</p>
                </div>    

                <div class="techniqueContainer">
                    <h2>Technique 5: Dwyer</h2>
                    <ul id="t5List">
                        <li id="t5w1"><span>Word1.&nbsp;</span></li>
                        <li id="t5w2"><span>Word2.&nbsp; </span></li>
                        <li id="t5w3"><span>Word3.&nbsp; </span></li>
                        <li id="t5w4"><span>Word4.&nbsp; </span></li>
                    </ul>                    
                    <p class="techniqueComment">Word 1 and corresponding image disappear completely.  Same as Technique 1.</p>
                </div>                        
                <div class="techniqueContainer">
                    <h2>Technique 6: Jason</h2>
                    <div id="t6List" class="borderContainer">
                        <span id="t6w1">Word1.&nbsp; </span>
                        <span id="t6w2">Word2.&nbsp; </span>
                        <span id="t6w3">Word3.&nbsp; </span>
                        <span id="t6w4">Word4.&nbsp; </span>
                    </div>                    
                    <p class="techniqueComment">Same as Technique 3 - Rundle.</p>
                </div>     
            </div>
        </div>
    </body>
</html>

И файл CSS: TextReplacement.css

* {
    margin: 0;
    padding: 0;
}

body {
    margin: 0;
    padding: 0; 
    font-family: verdana, "trebuchet MS", helvetica, sans-serif; 
}

#centerContainer {
    margin-left: auto;     /* centres container */
    margin-right: auto; /* centres container */ 
    margin-top: 18px;
}

#mainBodyContainer {
    width: 900px;
    margin-left: auto; 
    margin-right: auto; 
    margin-bottom: 20px;
    font-size: 1.8em;
    font-weight: bold;    
}

#mainBodyContainer h2{
    font-size: 1.2em;
    font-weight: bold;    
    font-style: italic;    
    color: green;
}

div.techniqueContainer{
    text-align: center;
    margin-bottom: 30px;    
}

p.techniqueComment{
    font-size: 0.5em;
    font-weight: normal;    
    font-style: italic;    
    color: red;
}

p.noteText{
    font-size: 1em;
    font-weight: normal;    
    font-style: italic;    
    color: blue;
}

#mainBodyContainer ul{
    list-style: none;
    border: 1px solid #820000;
}

#mainBodyContainer ul li{
    display: inline;
}

/* TECHNIQUE 1: FIR */
li#t1w1 {
    width: 250px;
    height: 61px;
    background-image: url(http://stackoverflow.com/content/img/so/logo.png);
}

li#t1w1 span {
    display: none;
}

/* TECHNIQUE 2: Radu */
li#t2w1 {
    width: 2250px;
    height: 61px;
    background: url(http://stackoverflow.com/content/img/so/logo.png) top right;
    margin: 0 0 0 -2000px;
}

/* TECHNIQUE 3: Rundle */
li#t3w1 {
    width: 250px;
    height: 61px;
    background: url(http://stackoverflow.com/content/img/so/logo.png);
    text-indent: -9999px;
}

/*TECHNIQUE 4: Leahy/Langridge. */
li#t4w1 {
    width: 250px;
    padding: 61px 0 0 0;
    height: 0;
    background: url(http://stackoverflow.com/content/img/so/logo.png) no-repeat;
    overflow: hidden;
}

/*TECHNIQUE 5: Dwyer. */
#t5{

}

#t5List{
    list-style: none;
    border: 1px solid #820000;
}

#t5List li{
    display: inline;
}

li#t5w1 {
width: 250px;
    height: 61px;
    background-image: url(http://stackoverflow.com/content/img/so/logo.png);
}

li#t5w1 span{
    display: block;
    width: 0;
    height: 0;
    overflow: hidden;
}

/* TECHNIQUE 6: Jason */
li#t6w1 {

}

#t6w1{
    text-indent: -5000px; 
    background: url(http://stackoverflow.com/content/img/so/logo.png) no-repeat 0 0; 
    overflow: hidden;
}

Ответы [ 8 ]

4 голосов
/ 22 мая 2009

Вы имели в виду оставить HTML как есть, но показать текст вместо текста? Если это так, это можно сделать так:

#word1 {
   display:block;
   width:100px; /* width of image */
   height:80px; /* height of image */
   background:url(image.jpg) top left no-repeat; /* sets image as background of span */
   text-indent:-999999px; /* this hides the text so the image is not obstructed */
}

Теперь текст остается и он оптимизирован для SEO, но может выглядеть впечатляюще с причудливыми изображениями.

4 голосов
/ 21 мая 2009

Это просто:

span {text-indent: -5000px; background: url(../images/yourimage.jpg) no-repeat 0 0; overflow: hidden;}

Попробуйте. вы увидите, что это работает.

Что бы вы ни делали, НЕ ИСПОЛЬЗУЙТЕ JAVASCRIPT для достижения этого эффекта. слишком легко сделать в CSS

Вы также можете выбрать неупорядоченный список:

<ul>
  <li>word</li>
  ...
</ul>

ul {list-style-type: none; margin: 0; padding: 0;}
li {list-style-type: none; float: left;}
2 голосов
/ 22 мая 2009

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

Обновление: оно было разработано для повторяющихся изображений, так что это не метод замены цельных изображений.

1 голос
/ 20 ноября 2010

Я лично предпочитаю метод с отступом от текста Рандла, потому что он простой и элегантный, без дополнительной разметки. Если вы измените отображение на встроенный блок , оно будет работать для вас. Для браузеров, которые не поддерживают встроенный блок, используйте один из методов здесь: http://blog.mozilla.com/webdev/2009/02/20/cross-browser-inline-block/ (также проверьте комментарии, там есть несколько более простых предложений). Я согласен с @Jason, что создание сложного решения для этого просто для людей с включенным css и отключенными изображениями, вероятно, излишне.

1 голос
/ 21 мая 2009

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

height: {someHeight};
line-height: {someHeight x 3};
overflow: hidden;
letter-spacing: -1.1em; /* roughly */

Первая строка оставляет высоту для элемента, вторая толкает текст за эту высоту (размер шрифта зависит от размера, x3 - просто хорошая начальная точка), третья скрывает его от отображения, а последняя обнуляет ширину текст.

1 голос
/ 21 мая 2009

Не имеют семантического значения: интервалы не добавляют значения к контенту (как и div), поэтому они, вероятно, являются правильным элементом для использования в том, что вы хотите сделать.

Сделать отображение диапазона в виде блока и передать его:

span {
  display: block;
  float: left;
}
1 голос
/ 21 мая 2009

Какая у вас оригинальная идея? Чего ты хочешь достичь? Если вы хотите показывать изображения своим посетителям, просто используйте соответствующий тег IMG для этого и прикрепите слова к атрибуту ALT.

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

Редактировать

Хорошо, согласно вашему ответу, вам действительно нужно решение на уровне представления. Вы можете выбрать стандартное свойство CSS2 text-shadow для эффекта тени. Он работает в Safari, Opera и Konqueror, а для остальных браузеров вы можете использовать немного JavaScript .

(SPAN - это простой элемент контейнера, к которому можно применять стили.)

0 голосов
/ 21 мая 2009

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

...