Kann ich die Höhe eines Bildes in CSS ändern: vor /: nach Pseudoelementen?


251

Angenommen, ich möchte Links zu bestimmten Dateitypen mithilfe eines Bildes dekorieren. Ich könnte meine Links als deklarieren

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

dann habe CSS wie

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

Das funktioniert jetzt großartig, außer wenn pdf.pnges nicht die richtige Größe für meinen Linktext hat.

Ich möchte dem Browser mitteilen können, dass er das :afterBild skalieren soll , aber ich kann für mein ganzes Leben nicht die richtige Syntax finden. Oder ist dies wie bei Hintergrundbildern, bei denen eine Größenänderung einfach nicht möglich ist?

ETA: Ich neige dazu, entweder a) das Quellbild auf die "richtige" Größe zu ändern, serverseitig und / oder b) das Markup zu ändern, um einfach ein IMG-Tag inline bereitzustellen. Ich habe versucht, diese beiden Dinge zu vermeiden, aber sie klingen so, als wären sie kompatibler als der Versuch, Dinge nur mit CSS zu tun. Die Antwort auf meine ursprüngliche Frage scheint zu lauten: " Manchmal kann man das irgendwie tun."


1
Gibt es einen zwingenden Grund dafür, dass Sie keine "img" -Tags mit "a" -Tags verwenden? Dies ist die typischere Syntax für ein Bild, das auch ein Link ist. Ich sage das, denn selbst wenn Sie Ihre Methode zum Laufen bringen, können Sie andere Entwickler verwirren. CSS hat auch einen guten Ruf für Inkonsistenzen zwischen Browsern / Versionen.
Servy

4
Ich schätze das Problem, es ist nur so, dass ich die Markup-Generierung nicht unbedingt kontrolliere - in diesem Fall kann ich nur neu formatieren, nicht neu strukturieren.
Coderer

Lange Diskussion über die W3C-Mailingliste: lists.w3.org/Archives/Public/www-style/2011Nov/…
user123444555621

Antworten:


375

Das Einstellen background-sizeist zulässig. Sie müssen jedoch weiterhin die Breite und Höhe des Blocks angeben.

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

Siehe die vollständige Kompatibilitätstabelle im MDN .


3
Dies ist großartig, außer dass die meisten unserer Kunden IE 7 oder 8 verwenden (Corporate Nonsense, sorry).
Coderer

14
Wenn dies der Fall ist, sollten Sie überhaupt nicht verwenden :after. Es wird unter IE8 nicht unterstützt.
Ansel Santosa

24
Diese Technik erforderte auch eine Einstellung width: 10px; height: 20px;, um das Bild zu sehen.
hier

5
Zu beachten ist auch, dass dies zwar funktioniert, aber nur mit der spezifischen background-imageEigenschaft, das Einfache backgroundwird nicht funktionieren.
Gruber

4
(Für :before) brauchte ich auch position: absoluteund left: -10px.
Hugo

95

Beachten Sie, dass das :afterPseudoelement eine Box ist, die wiederum das generierte Bild enthält. Es gibt keine Möglichkeit, das Bild zu formatieren, aber Sie können die Box formatieren.

Das Folgende ist nur eine Idee, und die obige Lösung ist praktischer.

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

http://jsfiddle.net/Nwupm/

Nachteile: Sie müssen die intrinsischen Abmessungen des Bildes kennen und es bleibt Ihnen ein Leerzeichen, das ich am Geldautomaten nicht loswerden kann.


6
Zoom: 0,5 ist ebenfalls eine Überlegung wert.
Alex

Ich mag die Idee dieser Lösung, aber sie wirft die Positionierung auf, insbesondere in einem Inline-Block-Szenario. (IE 11)
Christopher Davies

1
Zoom wird nicht gut unterstützt.

1
Die jsfiddle ändert die Größe nicht. Ich benutze den neuesten Firefox. Ich habe auch das letzte jsfiddle-Beispiel in diesem Beitrag mit Zoom ausprobiert, und es funktioniert auch nicht.
Ryan

1
Nur eine Anmerkung: In meinem Fall musste ich setzen position: absolute, um transform: scale(0.5)tatsächlich arbeiten zu können. Ich musste auch position: relativedas "Eltern" -Element (den Besitzer des :afterPseudos) für die Vernunft einfügen. Außerdem musste ich translate(-16px, -16px)meine Transformation ergänzen , um das 16x16-Symbol korrekt zu positionieren. Das position: absolutehat auch den Vorteil , dass das Leer Problem zu beseitigen.
Braden Best

34

Da meine andere Antwort offensichtlich nicht gut verstanden wurde, ist hier ein zweiter Versuch:

Es gibt zwei Ansätze, um die Frage zu beantworten.

Praktisch (zeig mir einfach das verdammte Bild!)

Vergessen Sie den :afterPseudo-Selektor und entscheiden Sie sich für so etwas

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

Theoretisch

Die Frage ist: Können Sie generierte Inhalte stylen ? Die Antwort lautet: Nein, das kannst du nicht. Es gab eine lange Diskussion über die W3C-Mailingliste zu diesem Thema, aber bisher keine Lösung.

Generierter Inhalt wird in eine generierte Box gerendert, und Sie können diese Box formatieren, jedoch nicht den Inhalt als solchen . Verschiedene Browser zeigen ein sehr unterschiedliches Verhalten

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

Chrome ändert die Größe des ersten Bilds, verwendet jedoch die intrinsischen Abmessungen des Bildes für das zweite

Firefox und dh unterstützen die erste nicht und verwenden intrinsische Dimensionen für die zweite

Die Oper verwendet für beide Fälle intrinsische Dimensionen

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

In ähnlicher Weise zeigen Browser sehr unterschiedliche Ergebnisse bei Dingen wie http://jsfiddle.net/Nwupm/1/ , bei denen mehr als ein Element generiert wird. Beachten Sie, dass sich CSS3 noch in einem frühen Entwicklungsstadium befindet und dieses Problem noch nicht gelöst ist.


1
@TJ Jede einzelne Antwort verdient eine Antwort (wenn dies nicht offensichtlich genug ist), die unterschiedliche Mengen an Upvotes erhält und je nach Inhalt der Antwort unterschiedlich gesehen / zitiert / geteilt wird.
Timo Huovinen

13

Sie sollten Hintergrund anstelle von Bild verwenden.

.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; haben keine Wirkung

positionin funktioniert auch sehr seltsam, wenn es um Frontend-Grundlagen geht. Seien Sie also vorsichtig

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

4

Hier ist eine andere (funktionierende) Lösung: Ändern Sie einfach die Größe Ihrer Bilder auf die gewünschte Größe :)

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

Sie benötigen pdf.png, um 20px * 10px zu sein, damit dies funktioniert. Die 20px / 10px in der CSS sind hier, um die Größe des Blocks anzugeben, damit die Elemente, die nach dem Block kommen, nicht alle mit dem Bild durcheinander gebracht werden

Vergessen Sie nicht, eine Kopie des Rohbilds in der Originalgröße aufzubewahren


Es sind Scherze !!
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

Sie können die zoomEigenschaft verwenden. Überprüfen Sie diese jsfiddle


1
Wenn Sie die jsfiddle aktivieren, haben beide die gleiche Größe und der Zoom wird rot hervorgehoben.
Ryan

In Firefox 53 wird die Größe derzeit nicht geändert. Hoffentlich kann dies in einer späteren Version von Firefox implementiert werden. Es ist gut zu wissen, dass es zumindest in Chrome funktioniert. :-)
Ryan

2

Sie können die Höhe oder Breite des Vorher- oder Nachher- Elements folgendermaßen ändern :

.element:after {
  display: block;
  content: url('your-image.png');
  height: 50px; //add any value you need for height or width
  width: 50px;
}

1

Ich habe diese Breite für die Schriftgrößensteuerung verwendet

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

1

Heutzutage können Sie mit flexbox Ihren Code erheblich vereinfachen und nur 1 Parameter nach Bedarf anpassen:

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

Jetzt können Sie einfach die Breite des Elements anpassen und die Höhe wird automatisch angepasst. Erhöhen / verringern Sie die Breite, bis die Höhe des Elements die gewünschte Anzahl erreicht.


1
Hat bei mir nicht funktioniert, vielleicht weil das Bild svg ist, vielleicht weil das übergeordnete Element ein Flex-Container ist.
Miguel Pynto

auch nicht auf einem url(//placeimg.com/800/200/arch)
JPG

0
content: "";
background-image: url("yourimage.jpg");
background-size: 30px, 30px;
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.