CSS圖像替換:文本縮進(jìn)断凶,負(fù)邊距以及更多方法

英文原文:A History of CSS Image Replacement
譯者:伊一
譯文地址:http://t.cn/R5EETjh

CSS中的圖像替換有著廣泛而多樣的歷史空猜。如今湾盗,如果你還想這么做崇渗,有很多至今仍然有效的圖像置換技術(shù)旋廷。必須注意的是泳唠,其中一些實(shí)際上可能很快(如果不是已經(jīng)) 會(huì)被Google批判狈网,所以要謹(jǐn)慎使用。然而警检,你很難知道什么時(shí)候一個(gè)CMS或者項(xiàng)目會(huì)迫使你需要get out圖像替換kit孙援!這里是過(guò)去的kit,在web完全落實(shí)之前扇雕,這可能是最后一份你需要的圖像替換技術(shù)列表拓售。

插圖來(lái)自SitePoint/[Natalia Balska](http://sf-lab.net/)

使用負(fù)的文本縮進(jìn) — Phark 方法

這是web開(kāi)發(fā)人員在某些情況下使用的最普遍的技術(shù)。這里的想法是通過(guò)設(shè)置一個(gè)很大的負(fù)text-indent镶奉,讓文本遠(yuǎn)離瀏覽器窗口:

.replace-indent {
  width: 264px;
  height: 106px;
  background: url("assets/logo.png");
  text-indent: -9999px;
}

這里有一個(gè)CodePen演示础淤,展示了使用text-indent隱藏文本時(shí)標(biāo)題的樣子:

查看筆記 圖像替換 – 縮進(jìn)方法崭放,作者 SitePoint (@SitePoint),在CodePen鸽凶。

使用這種方法币砂,文本仍然可以被屏幕閱讀器獲取到。然而玻侥,當(dāng)文本右對(duì)齊的時(shí)侯决摧,這種方法就行不通了。由于這個(gè)text-indent凑兰,瀏覽器也需要為我們的標(biāo)題渲染一個(gè)非常大的盒子掌桩,這在一些很老舊的設(shè)備中可能會(huì)產(chǎn)生問(wèn)題。

Scott Kellum 方法

與其設(shè)置一個(gè)很大的負(fù)text-indent姑食,你可以設(shè)置它為100%波岛。這種方法下,瀏覽器不需要?jiǎng)?chuàng)建一個(gè)很大的盒子音半,性能會(huì)得到提升则拷。你不需要任何額外的標(biāo)記就可以使用這個(gè)方法。你需要的CSS如下:

.replace-scott {
  width: 264px;
  height: 106px;
  background: url("assets/logo.png");
  text-indent: 100%;
  white-space: nowrap;
  overflow: hidden;
}

設(shè)置overflowhidden可以隱藏文本曹鸠,whitespace: nowrap可以阻止換行煌茬。這種方法下,閱讀器仍然可以讀取文本彻桃。這里有一個(gè)這項(xiàng)技術(shù)的演示:

查看筆記 圖像替換 – Scott Kellum 方法宣旱,作者 SitePoint (@SitePoint),在CodePen叛薯。

使用邊距 — Radu Darvas 方法

這項(xiàng)技術(shù)仍然是強(qiáng)制文本在瀏覽器窗口之外,但是是利用邊距去做的笙纤。這個(gè)想法是應(yīng)用一個(gè)很大的負(fù)的左邊距耗溜,并且給標(biāo)題一個(gè)相對(duì)大的寬度。

.replace-margin {
  width: 2264px;
  height: 106px;
  background: url("assets/logo.png") top right no-repeat;
  margin: 0 0 0 -2000px;
}

和上一種情況一樣省容,我們的logo被用作標(biāo)題的一個(gè)背景圖片抖拴。這里有一個(gè)演示,展現(xiàn)了這項(xiàng)技術(shù)是如何起作用的腥椒,首先是沒(méi)有邊距的阿宅,然后應(yīng)用這個(gè)邊距:

查看筆記 圖像替換 – Margin 方法,作者 SitePoint (@SitePoint)笼蛛,在CodePen洒放。

如果一直滾動(dòng)到右邊,你最終會(huì)看到第一個(gè)標(biāo)題的背景滨砍。實(shí)際上往湿,你不必?fù)?dān)心滾動(dòng)條妖异,因?yàn)檫@個(gè)大的負(fù)邊距補(bǔ)償了寬度(就像你在第二個(gè)標(biāo)題中見(jiàn)到的)。記住领追,這種方法對(duì)于瀏覽器執(zhí)行來(lái)說(shuō)并不高效他膳,因?yàn)闉g覽器不得不畫(huà)一個(gè)非常大的盒子。

使用內(nèi)邊距 — Langridge 方法

這次我們使用padding-top屬性把文本推出我們的標(biāo)題之外绒窑。這個(gè)屬性的值會(huì)被設(shè)置成與logo的高相等棕孙。然而,僅僅這些是不夠的些膨,我們還需要使用overflow: hidden來(lái)隱藏文本蟀俊。

.replace-padding {
  width: 264px;
  height: 0;
  background: url("assets/logo.png");
  padding: 106px 0 0 0;
  overflow: hidden;
}

和之前的兩種方法相比,這個(gè)屬性可以表現(xiàn)出更好的性能傀蓉。它也提供了和之前兩種方法相同水平的可訪問(wèn)性欧漱。如下是這個(gè)技術(shù)的一個(gè)演示,第一個(gè)標(biāo)題沒(méi)有填充背景葬燎,第二個(gè)有:

查看筆記 圖像替換 – 內(nèi)邊距方法误甚,作者 SitePoint (@SitePoint),在 CodePen谱净。

使用小的font-size— Lindsay 方法

另一種隱藏文本的方法是讓它變得非常小窑邦,并且將它的顏色設(shè)置成logo的背景。這種方法不會(huì)影響可訪問(wèn)性壕探,但是由于微小的字體和偽裝的顏色冈钦,你可能會(huì)遇到SEO困難。

.replace-font {
  width: 264px;
  height: 106px;
  background: url("assets/logo.png");
  font-size: 1px;
  color: white;
}

這里有個(gè)該方法的演示李请,第一個(gè)圖像沒(méi)有設(shè)置font-size瞧筛,而是在第二個(gè)圖像中起了作用:

查看筆記 圖像替換 – font-size 方法,作者 SitePoint (@SitePoint)导盅,在 CodePen较幌。

如果你的logo沒(méi)有一個(gè)單一的背景色來(lái)允許完美的混合,你仍然會(huì)遇到困難白翻。這種情況下乍炉,你可以把顏色設(shè)置成transparent

使用 Display — Fahrner 圖像置換

和其他方法不同滤馍,這個(gè)方法需要你增加額外的標(biāo)記岛琼。這里的想法是把文本包裹進(jìn)一個(gè)元素,并且設(shè)置它的display屬性為none。這個(gè)案例中的標(biāo)記可以是:

<h1 class="replace-display">
  <span>SitePoint</span>
</h1>

CSS可以是:

.replace-display {
  width: 264px;
  height: 106px;
  background: url("assets/logo.png");
}

.replace-display span{
  display: none;
}

這里有一個(gè)演示,將我們的元素的display設(shè)置成none

查看筆記 圖像替換 – Display 方法栖博,作者 SitePoint (@SitePoint),在CodePen随珠。

這個(gè)方法雖然很容易實(shí)現(xiàn)灭袁,但是缺乏可訪問(wèn)性。這是因?yàn)?code>display設(shè)置成none的元素會(huì)被屏幕閱讀器忽略窗看。當(dāng)visibility設(shè)置成hidden時(shí)茸歧,同樣的問(wèn)題也會(huì)發(fā)生,所以你也不能用那個(gè)显沈。你可以設(shè)置opacity0软瞎。這樣將會(huì)隱藏元素,同時(shí)保持它仍然可以被屏幕閱讀器訪問(wèn)拉讯。

使用 Overflow — Leon Dwyer 方法

我們已經(jīng)在增加一些內(nèi)邊距之后涤浇,使用過(guò)overflow屬性來(lái)隱藏文本。這次我們將僅僅使用overflow屬性來(lái)徹底隱藏元素魔慷。使用這個(gè)技術(shù)需要只锭,你將你的文本像之前那種方法一樣包裹進(jìn)一個(gè)元素中。這次我們的CSS看起來(lái)像這樣:

.replace-overflow {
  width: 264px;
  height: 106px;
  background: url("assets/logo.png");
}

.replace-overflow span {
  display: block;
  width: 0;
  height: 0;
  overflow: hidden;
}

我們將span元素的寬和高都設(shè)置成0院尔。這會(huì)強(qiáng)制元素內(nèi)的文本移到它的盒子外蜻展。接著文本會(huì)被overflow: hidden屬性隱藏。這里有一個(gè)CodePen演示說(shuō)明了這項(xiàng)技術(shù):

查看筆記 圖像替換 – Overflow 方法邀摆,作者 SitePoint (@SitePoint)纵顾,在 CodePen

文本仍然可以被屏幕閱讀器訪問(wèn)栋盹。因此施逾,這里不會(huì)有可訪問(wèn)性的問(wèn)題。

使用絕對(duì)定位 — Levin 方法

這個(gè)方法也需要一個(gè)額外的元素來(lái)工作例获。然而汉额,這個(gè)元素不是包裹在文本周?chē)模怯糜诙ㄎ晃覀兊膱D像榨汤。這里是這個(gè)方法的標(biāo)記:

<h1 class="replace-position">
  <span></span>SitePoint
</h1>

這是CSS:

.replace-position {
  width: 264px;
  height: 106px;
  position: relative;
}

.replace-position span {
  background: url("assets/logo.png");
  width: 100%;
  height: 100%;
  position: absolute;
}

使用絕對(duì)定位來(lái)圖像置換的演示可以在下面看到:

查看筆記 圖像替換 – 絕對(duì)定位方法闷愤,作者 SitePoint (@SitePoint),在 CodePen件余。

注意,為了完全覆蓋我們的標(biāo)題元素遭居,寬和高都設(shè)置成了100% 啼器。這個(gè)方法的唯一問(wèn)題是你使用的圖片必須是完全不透明的。如果不是這樣的話(huà)俱萍,用戶(hù)將可以透過(guò)你的圖像看到文本端壳。

使用一個(gè)偽造的圖像 — Radu Darvas Shim

這個(gè)方法除了我們平常的元素之外,還需要一個(gè)偽造的圖像來(lái)正常工作枪蘑。這個(gè)圖像是一個(gè) 1×1 像素损谦、透明的 GIF岖免。它的主要目的是如果圖片不能顯示,將顯示給用戶(hù)替代的文本照捡。標(biāo)記如下:

<h1 class="replace-image-span">
  [站外圖片上傳中……(2)]
  <span>SitePoint</span>
</h1>

這是你需要應(yīng)用的CSS:

.replace-image-span {
  width: 264px;
  height: 106px;
  background: url("assets/logo.png");
}

.replace-image-span span{
  display: none;
}

下面的演示應(yīng)該會(huì)讓你清楚明白這個(gè)方法是如何起效的:

查看筆記 圖像替換 – 偽造圖像方法颅湘,作者 SitePoint (@SitePoint),在 CodePen栗精。

盡管真實(shí)的文本被隱藏了闯参,屏幕閱讀器仍然可以讀到替換的標(biāo)簽。所以悲立,這個(gè)方法不會(huì)造成任何可訪問(wèn)性的問(wèn)題鹿寨。唯一的問(wèn)題就是這里的標(biāo)簽是非語(yǔ)義化的和偽造的。此外薪夕,如果CSS和圖像都被關(guān)閉的話(huà)脚草,你將會(huì)看到這個(gè)文本兩次。

使用真實(shí)的圖像 — 使用內(nèi)聯(lián)圖像的 Phark 方法

這次原献,我們將使用一個(gè)真實(shí)的圖像來(lái)做圖像替換馏慨。這個(gè)圖像有替換的文本,在圖像不能顯示時(shí)會(huì)顯示出來(lái)嚼贡。標(biāo)記如下:

<h1 class="replace-image-link">
  [站外圖片上傳中……(3)]
</h1>

下面的CSS做了真正的替換:

.replace-image-link {
  width: 264px;
  height: 106px;
  background: url("assets/logo.png");
  text-indent: -9999px;
}

下面的演示說(shuō)明了這個(gè)技術(shù)是如何工作的:

查看筆記 圖像替換 – 真實(shí)圖像技術(shù)熏纯,作者 SitePoint (@SitePoint),在 CodePen粤策。

你將會(huì)看到的圖像不是來(lái)自標(biāo)簽樟澜,而是來(lái)自background屬性。除了我們之前討論過(guò)的使用大的負(fù)文本縮進(jìn)帶來(lái)的問(wèn)題叮盘,這項(xiàng)技術(shù)似乎也不利于SEO秩贰。這項(xiàng)技術(shù)優(yōu)于其他方法的一個(gè)優(yōu)點(diǎn)是,在CSS關(guān)閉的情況下圖像依然可見(jiàn)并且保持存在柔吼,但是問(wèn)題是你為什么不直接使用它自己的圖像呢...

使用 Clip-path

屬性clip-path可以隱藏你指定的路徑之外的所有東西毒费。我們可以用它裁剪文本并將它隱藏。這個(gè)文本仍然可以被屏幕閱讀器訪問(wèn)愈魏,只是被視覺(jué)上隱藏了觅玻。標(biāo)記如下:

<h1 class="replace-clip-path">
  <span>SitePoint</span>
</h1>

這是你需要應(yīng)用的 CSS:

.replace-clip-path {
  width: 264px;
  height: 106px;
  background: url("assets/logo.png");
}

.replace-clip-path span{
  clip-path: polygon(0px 0px, 0px 0px, 0px 0px, 0px 0px);
}

你可以修改clip-path的值來(lái)看看文本是怎么被裁剪的:

查看筆記 圖像替換 – clip-path 方法,作者 SitePoint (@SitePoint)培漏,在 CodePen溪厘。

這個(gè)方法的唯一問(wèn)題就是瀏覽器目前還沒(méi)有完全支持。SitePoint 最近關(guān)于clip-path
屬性
發(fā)布了一篇文章牌柄,進(jìn)行了更詳細(xì)的論述畸悬。瀏覽器一旦開(kāi)始支持它,圖像替換技術(shù)就會(huì)變得多余且沒(méi)有必要了珊佣。

使用偽元素 — Nash 圖像替換

這個(gè)技術(shù)使用一個(gè)偽元素把文本拋到一邊蹋宦。標(biāo)記如下:

<h1 class="replace-pseudo">
  SitePoint
</h1>

下面的 CSS 使這項(xiàng)技術(shù)生效:

.replace-pseudo {
  width: 264px;
  height: 106px;
  overflow: hidden;
}

.replace-pseudo:before{
  content: url("assets/logo.png");
}

這里有一個(gè)技術(shù)演示:

查看筆記 Image Replacement – Psuedo Element Technique披粟,作者 SitePoint (@SitePoint),在CodePen冷冗。

這個(gè)偽元素將文本擠到一邊守屉。文本溢出,會(huì)被overflow: hidden屬性隱藏贾惦。這項(xiàng)技術(shù)的一個(gè)問(wèn)題是它只能工作在Internet Explorer 8 及以上胸梆。

總結(jié)

這個(gè)作者還寫(xiě)了:

上述討論的每個(gè)方法都有自己的優(yōu)缺點(diǎn)⌒氚澹總的來(lái)說(shuō)碰镜,他們都將不利于SEO,如果你可以完全避免使用它 — 那么現(xiàn)在是時(shí)候擺脫它們了习瑰!在 SitePoint 接下來(lái)的一篇文章中绪颖,我們將會(huì)看到行業(yè)里是如何擺脫他們的,并且了解目前最好的方法是什么甜奄。如果你想到了任何其他的方法柠横,或者你對(duì)于我們討論的技術(shù)有所補(bǔ)充,可以在下面評(píng)論课兄。


來(lái)自 PatCat (30/06/2016) 的更新: 這篇文章起初說(shuō)到在網(wǎng)站標(biāo)題中使用圖像可能會(huì)對(duì)SEO和可訪問(wèn)性有負(fù)面影響牍氛。這不是真的。實(shí)際上烟阐,由于Google正在為圖像替換做準(zhǔn)備工作搬俊,情況可能相反。我已經(jīng)修改了這篇文章, 謝謝你們的評(píng)論蜒茄!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末唉擂,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子檀葛,更是在濱河造成了極大的恐慌玩祟,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,682評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件屿聋,死亡現(xiàn)場(chǎng)離奇詭異空扎,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)润讥,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)转锈,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人象对,你說(shuō)我怎么就攤上這事⊙绺В” “怎么了勒魔?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,083評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵甫煞,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我冠绢,道長(zhǎng)抚吠,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,763評(píng)論 1 295
  • 正文 為了忘掉前任弟胀,我火速辦了婚禮楷力,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘孵户。我一直安慰自己萧朝,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,785評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布夏哭。 她就那樣靜靜地躺著检柬,像睡著了一般。 火紅的嫁衣襯著肌膚如雪竖配。 梳的紋絲不亂的頭發(fā)上何址,一...
    開(kāi)封第一講書(shū)人閱讀 51,624評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音进胯,去河邊找鬼用爪。 笑死,一個(gè)胖子當(dāng)著我的面吹牛胁镐,可吹牛的內(nèi)容都是我干的偎血。 我是一名探鬼主播,決...
    沈念sama閱讀 40,358評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼希停,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼烁巫!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起宠能,我...
    開(kāi)封第一講書(shū)人閱讀 39,261評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤亚隙,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后违崇,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體阿弃,經(jīng)...
    沈念sama閱讀 45,722評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年羞延,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了渣淳。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,030評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡伴箩,死狀恐怖入愧,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤棺蛛,帶...
    沈念sama閱讀 35,737評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站旁赊,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏终畅。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,360評(píng)論 3 330
  • 文/蒙蒙 一离福、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧术徊,春花似錦本刽、人聲如沸子寓。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,941評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至垃它,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間国拇,已是汗流浹背洛史。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,057評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留酱吝,地道東北人也殖。 一個(gè)月前我還...
    沈念sama閱讀 48,237評(píng)論 3 371
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像务热,于是被迫代替她去往敵國(guó)和親忆嗜。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,976評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容