CSS:before /:after疑似要素で画像の高さを変更できますか?


251

画像を使用して特定のファイルタイプへのリンクを装飾したいとします。リンクを次のように宣言できます

<a href='foo.pdf' class='pdflink'>A File!</a>

それからCSSのような

.pdflink:after { content: url('/images/pdf.png') }

これでpdf.png、リンクテキストのサイズが適切でない場合を除いて、これはうまく機能します。

ブラウザに:after画像を拡大縮小するように指示したいのですが、私は一生正しい構文を見つけることができません。それとも、サイズ変更ができない背景画像のようなものですか?

ETA:私は、a)ソース画像を「適切な」サイズ(サーバー側)にサイズ変更するか、b)マークアップを変更して、単純にIMGタグをインラインで提供するようにしています。私はそれらの両方を避けようとしていましたが、CSSで純粋に何かをやろうとするよりも互換性があるように思えます。私の元の質問への答えは「あなたができるように思わ一種の時々 、それを行います」。


1
「img」タグを「a」タグで囲んで使用しないという説得力のある理由はありますか?これは、リンクでもある画像のより一般的な構文です。メソッドを機能させても、他の開発者を混乱させる可能性があるので、これを言います。CSSは、ブラウザー/バージョン間の不一致についても高い評価を得ています。
2012年

4
私は問題に感謝します、それは私が必ずしもマークアップ生成を制御する必要がないというだけです-この場合、私は再スタイルするだけで再構成することができません。
Coderer 2012年

W3Cメーリングリストでの長い議論:lists.w3.org/Archives/Public/www-style/2011Nov/…– user123444555621 2012
1

回答:


375

の調整background-sizeは許可されています。ただし、ブロックの幅と高さを指定する必要があります。

.pdflink:after {
    background-image: url('/images/pdf.png');
    background-size: 10px 20px;
    display: inline-block;
    width: 10px; 
    height: 20px;
    content:"";
}

MDNの完全な互換性テーブルを参照してください


3
これはすばらしいことですが、ほとんどのクライアントはIE 7または8を使用しています(企業ナンセンス、申し訳ありません)。
Coderer 2012年

14
その場合は、:afterまったく使用しないでください。IE8以下ではサポートされていません。
アンセルサントーサ

24
この手法でwidth: 10px; height: 20px;は、画像を表示するための設定も必要でした。
ここでは

5
これが実際に機能することにも注意してください。ただし、特定のプロパティでのみbackground-image、シンプルbackgroundは機能しません。
グルーバー

4
(のために:before)私も必要でしたposition: absolute、そしてleft: -10px
Hugo、

95

:after疑似要素はボックスであり、ボックスには生成された画像が含まれていることに注意してください。画像にスタイルを設定する方法はありませんが、ボックスにスタイルを設定できます。

以下は単なるアイデアであり、上記解決策がより実用的です。

.pdflink:after {
    content: url('/images/pdf.png');
    transform: scale(.5);
}

http://jsfiddle.net/Nwupm/

欠点:画像の固有の寸法を知っている必要があり、ATMを取り除くことができない空白がいくつか残ります。


6
ズーム:0.5も検討に値します。
Alex

私はこのソリューションのアイデアが好きですが、インラインブロックシナリオでは特に、ポジショニングが失われます。(IE 11)
クリストファー・デイビス14

1
ズームは十分にサポートされていません。

1
jsfiddleはサイズを変更していません。最新のFirefoxを使用しています。また、この投稿の最後のjsfiddleの例をズームを使用して試しましたが、これも機能しません。
ライアン

1
ただ注意:私の場合、実際に仕事をposition: absoluteするために私は置くtransform: scale(0.5)必要がありました。また、健全性のためにposition: relative「親」要素(:after疑似の所有者)を配置する必要がありました。また、translate(-16px, -16px)16x16アイコンを正しく配置するには、変換に追加する必要がありました。にposition: absoluteは、空白の問題を排除するという利点もあります。
ブレーデンベスト

34

私の他の答えは明らかによく理解されていなかったので、ここに2番目の試みがあります。

この質問に答えるには2つの方法があります。

実用的です(ひどい写真を見せてください!)

:after疑似セレクターを忘れて、次のようなものに行きます

.pdflink {
    min-height: 20px;
    padding-right: 10px;
    background-position: right bottom;
    background-size: 10px 20px;
    background-repeat: no-repeat;
}

理論上の

問題は、生成されたコンテンツにスタイルを設定できるかどうかです。答えは次のとおりです。いいえ、できません。この問題についてW3Cメーリングリストで長い議論がありましたが、今のところ解決策はありません。

生成されたコンテンツは生成されたボックスにレンダリングされ、そのボックスにスタイルを設定できますが、コンテンツ自体にはスタイルを設定できません。ブラウザーが異なると動作が大きく異なります

#foo         {content: url("bar.jpg"); width: 42px; height:42px;}  
#foo::before {content: url("bar.jpg"); width: 42px; height:42px;}

Chromeは最初の画像のサイズを変更しますが、2番目の画像には固有の寸法を使用します

つまり、Firefoxは最初のものをサポートせず、2番目の組み込み寸法を使用します。

オペラは両方の場合に固有の次元を使用します

http://lists.w3.org/Archives/Public/www-style/2011Nov/0451.htmlから)

同様に、ブラウザーはhttp://jsfiddle.net/Nwupm/1/などの複数の要素が生成されるものに対して非常に異なる結果を表示します。CSS3はまだ開発の初期段階にあり、この問題はまだ解決されていないことに注意してください。


1
@TJそれぞれの個別の回答は回答に値します(それが十分に明白でない場合)。これは、さまざまな量の賛成票を取得し、回答の内容に基づいて異なる方法で表示/引用/共有されます。
Timo Huovinen、

13

画像の代わりに背景を使用する必要があります。

.pdflink:after {
  content: "";
  background-image:url(your-image-url.png);
  background-size: 100% 100%;
  display: inline-block;

  /*size of your image*/
  height: 25px;
  width:25px;

  /*if you want to change the position you can use margins or:*/
  position:relative;
  top:5px;

}

6

diplay: block; 何の効果もありません

positioninもフロントエンドのファンダメンタルズに対して非常に奇妙に動作するので、注意してください

body:before{ 
    content:url(https://i.imgur.com/LJvMTyw.png);
    transform: scale(.3);
    position: fixed;
    left: 50%;
    top: -6%;
    background: white;
}

4

これが別の(実用的な)解決策です:画像を必要なサイズに変更するだけです:)

.pdflink:after {
    display: block;
    width: 20px;
    height: 10px;
    content:url('/images/pdf.png');
}

これを機能させるには、pdf.pngを20px * 10pxにする必要があります。CSSの20px / 10pxは、ブロックのサイズを指定するためのものであり、ブロックの後に来る要素がすべて画像で混乱しないようになっています。

生の画像のコピーを元のサイズに保つことを忘れないでください


それはジョークの呼び出しです!
MD Ashik

3
.pdflink:after {
    background-image: url('/images/pdf.png');
    background-size: 10px 20px;
    width: 10px; 
    height: 20px;
    padding-left: 10px;// equal to width of image.
    margin-left:5px;// to add some space for better look
    content:"";
}

2

zoomプロパティを使用できます。このjsfiddleを確認してください


1
jsfiddleをチェックすると、両方が同じサイズで、ズームが赤で強調表示されます。
Ryan

現時点では、Firefox 53ではサイズ変更されません。うまくいけば、これは新しいバージョンのFirefoxで実装できるでしょう。少なくともChromeで動作することを知っておくのは良いことです。:-)
ライアン


1

私はこのフォントサイズ制御幅を使用しました

.home_footer1::after {
color: transparent;
background-image: url('images/icon-mail.png');      
background-size: 100%;      
content: ".......................................";
font-size: 30pt;
}

1

今日のflexboxを使用すると、コードを大幅に簡略化し、必要に応じて1つのパラメーターのみを調整できます。

.pdflink:after {
    content: url('/images/pdf.png');
    display: inline-flex;
    width: 10px;
}

要素の幅を調整するだけで、高さが自動的に調整され、要素の高さが必要な数になるまで幅が増減します。


1
画像がsvgであるか、親がフレックスコンテナーであることが原因で、私にはうまくいきませんでした。
Miguel Pynto

jpgにもありませんurl(//placeimg.com/800/200/arch)
BananaAcid

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.