2009-07-08 7 views
31

Aus irgendeinem Grund werden die meisten modernen Browser nicht mehr ihren Standardrahmen für Eingabefelder auf Textfelder anwenden, wenn Sie ihnen ein Hintergrundbild geben. Stattdessen bekommst du diesen hässlichen Einsatzstil. Soweit ich das beurteilen kann, gibt es auch keinen CSS-Weg, den Standard-Browser-Stil anzuwenden.Wie kann ich ein Hintergrundbild auf eine Texteingabe anwenden, ohne den Standardrahmen in Firefox- und WebKit-Browsern zu verlieren?

IE 8 hat dieses Problem nicht. Chrome 2 und Firefox 3.5 tun und ich nehme auch andere Browser an. Von dem, was ich online gelesen habe, hat IE 7 das gleiche Problem, aber dieser Beitrag hatte keine Lösung.

Hier ist ein Beispiel:

<html> 
<head> 
    <style> 
    .pictureInput { 
     background-image: url(http://storage.conduit.com/images/searchengines/search_icon.gif); 
     background-position: 0 1px; 
     background-repeat: no-repeat; 
    } 
    </style> 
<body> 
    <input type="text" class="pictureInput" /> 
    <br /> 
    <br /> 
    <input type="text"> 
</body> 
</html> 

In Chrome 2 sieht es wie folgt aus: http://www.screencast.com/users/jadeonly/folders/Snagit/media/d4ee9819-c92a-4bc2-b84e-e3a4ed6843b6

Und in Firefox 3.5: http://www.screencast.com/users/jadeonly/folders/Snagit/media/d70dd690-9273-45fb-9893-14b38202ddcc

Update: JS Lösung: Ich bin immer noch der Hoffnung um eine reine CSS-on-the-Input-Lösung zu finden, aber hier ist die Problemumgehung, die ich für jetzt verwenden werde. Bitte beachten Sie, das ist direkt aus meiner App eingefügt, also ist es kein schönes, stand-alone Beispiel wie oben. Ich habe gerade die relevanten Teile aus meiner großen Web-App eingefügt. Sie sollten in der Lage sein, die Idee zu bekommen. Der HTML-Code ist die Eingabe mit der Klasse "link". Die große vertikale Hintergrundposition ist, weil es ein Sprite ist. Getestet in IE6, IE7, IE8, FF2, FF3.5, Opera 9.6, 10 Opera, Chrome 2, Safari 4. Ich brauche die Hintergrundposition ein paar Pixel in einigen Browsern noch zwicken:

JS:

$$('input.link').each(function(el) { 
    new Element('span',{'class':'linkIcon'}).setText(' ').injectBefore(el); 
    if (window.gecko) el.setStyle('padding', '2px 2px 2px 19px'); 
}); 

CSS:

input.link { padding-left: 19px; } 
span.linkIcon { z-index: 2; width: 19px; height: 19px; position: absolute; background-image: url(img/fields.gif); background-position: 1px -179px; background-repeat: no-repeat; } 

Update: CSS Close Enough Lösung: Basierend auf den Vorschlag von Kron hier ist der CSS die Eingänge entsprechen FF und IE in Vista zu machen, die eine gute Wahl macht, wenn Sie entscheiden Aufgeben von reinen Vorgaben und Erzwingen eines Stils. Ich habe seine leicht modifiziert und hinzugefügt, um die "bläulichen" Effekte:

CSS:

input[type=text], select, textarea { 
    border-top: 1px #acaeb4 solid; 
    border-left: 1px #dde1e7 solid; 
    border-right: 1px #dde1e7 solid; 
    border-bottom: 1px #e3e9ef solid; 
    -moz-border-radius: 2px; 
    -webkit-border-radius: 2px; 
    padding: 2px; 
} 
input[type=text]:hover, select:hover, textarea:hover, input[type=text]:focus, select:focus, textarea:focus { 
    border-top: 1px #5794bf solid; 
    border-left: 1px #c5daed solid; 
    border-right: 1px #b7d5ea solid; 
    border-bottom: 1px #c7e2f1 solid; 
} 
select { border: 1px; } 
+0

Hey, versuchen Sie das. Es ist ein wenig hackish, aber es scheint für mich zu funktionieren. Grenze: 0; Grenze: 1px Körper # abadb3; Die 'Grenze: 0' wird den Standardrahmen an der Eingabe beenden, und die folgende Regel wird es so aussehen lassen, wie Sie möchten. –

+0

Sorry, ich war nicht klar. Das würde funktionieren, wenn ich einfach wollte, dass es eine feste Grenze hat, aber was ich will, damit es so aussieht, wie es in den Browsern tut, wenn es keinen Stil gibt. Ich möchte den nativen, standardmäßigen Rahmenstil. Siehe zum Beispiel den Stil in Firefox: http://www.screencast.com/users/jadeonly/folders/Snagit/media/d70dd690-9273-45fb-9893-14b38202ddcc –

+0

Meine Antwort ist nicht redundant. Der Rahmen: 0 löscht den Rahmenstil am Eingang. Der folgende Stil wendet den neuen Stil auf die Eingabe an. Wie in Cascading Stylesheets;) –

Antwort

10

Wenn Sie Rahmen- oder Hintergrundstil bei Texteingaben ändern Sie kehren zum sehr einfachen Rendermodus zurück. Texteingaben, die os-style sind, sind normalerweise Überlagerungen (wie Flash), die über dem Dokument gerendert werden.

Ich glaube nicht, dass es ein reines CSS-Update für Ihr Problem gibt. Das Beste, was du tun kannst - meiner Meinung nach - ist, einen Stil auszuwählen, den du magst, und ihn mit CSS zu emulieren. Egal, in welchem ​​Browser Sie sich befinden, die Eingaben sehen gleich aus. Sie können immer noch Hover-Effekte und ähnliches haben. OS X-Style-Glow-Effekte könnten schwierig sein, aber ich bin mir sicher, dass es machbar ist.

@Alex Morales: Ihre Lösung ist überflüssig. Grenze: 0; wird zugunsten der Grenze ignoriert: 1px solid # abadb3; und führt zu unnötigen Bytes, die über die Leitung übertragen werden.

2

Update!

Ok, hier ist eine Problemumgehung, die Cross-Browser-kompatibel ist. Das einzige Problem wäre, dass der Standard-Stil um ein paar Pixel abweicht, so dass dies etwas optimiert werden muss.

<html> 
    <head> 
     <style> 
      .pictureInput { 
       text-indent: 20px; 
      } 
      .input-wrapper { 
       position:relative; 
      } 
      .img-wrapper { 
       position:absolute; 
       top:2px; 
       left:2px; 
      } 
     </style> 
    </head> 
    <body> 
     <div class="input-wrapper"> 
      <div class="img-wrapper"><img src="http://storage.conduit.com/images/searchengines/search_icon.gif" alt="asddasd" /></div> 
      <input type="text" class="pictureInput" /> 
     </div> 
     <br /> 
     <br /> 
     <input type="text"> 
    </body> 
</html>  

Durch Absolut relative Positionierung verwenden, können Sie die absolute div machen (das Bild enthalten ist) handeln absolut im Verhältnis zu seinen Eltern, die alle Browser Ich weiß, über (nicht Unter IE6 Versionen zählen, IE6 + sind in Ordnung) können Griff. Die Skalierung des Benutzers kann ein Problem sein, aber bei Workarounds ist dies der Fall.

Auf der Oberseite müssen Sie die Stile auf Ihren Eingaben überhaupt nicht ändern (außer für Texteinzug, aber Sie würden das irgendwie tun, hoffe ich).

Auf der Unterseite ist es nicht die schönste Problemumgehung.


Alt!

Ich weiß, das ist nicht das, was Sie wollen, aber Sie könnten so etwas tun, um zumindest alle Eingabefront konsistent zu machen.

input { 
    border-color:#aaa; 
    border-width:1px; 
} 

example image http://i26.tinypic.com/282eul1.png

Ich habe es nicht in allen Browsern versucht, aber da Sie nicht über die Grenze Stil Einstellung könnte es den einheimischen Stil verwenden, aber mit einer anderen Größe (obwohl Sie auch überspringen können, dass). Ich denke, der Schlüssel ist, die Rahmenfarbe auf etwas zu setzen, so dass alle Eingabefelder die gleiche Rahmenfarbe haben und den Rest dem Browser überlassen.

+0

Das lässt es näher aussehen, aber nicht dasselbe. Und es ist nicht nur das statische Aussehen. Der Standard-Eingabestil in Firefox erhält einen Hover- und Fokus-Effekt.In Chrome wird der Fokuseffekt immer angewendet, auch auf die geänderte Grenze, da der Effekt um den Rand (Umriss?) Zu sein scheint, anstatt den Rand selbst zu ändern. –

+0

Ich hoffe, dass jemand mit eleganteren Lösungen kommt, weil meine eher grob sind. Ich habe meine erste Lösung oben mit einer anderen aktualisiert, obwohl es sich nicht wirklich um eine Lösung, sondern eher um eine Problemumgehung handelt. – varl

+0

Danke für den Vorschlag. Während ich immer noch hoffe, dass diese Stapelüberlauffrage zu einer vollständigen Lösung führt, kann ich Ihren Vorschlag nutzen, um näher zu kommen. Außer IE8. Es ist der eine Browser, den ich getestet habe, der nicht von diesem Bug betroffen ist, aber dann macht Ihre Idee, die Chrome und Firefox besser macht, IE8 jetzt kaputt und verliert auch den Style- und Hover-Effekt. –

6

Dies ist die CSS, die ich verwende, dass die Standard zurückblicken bieten kann:

input, select, textarea { 
    border-top: 1px #acaeb4 solid; 
    border-left: 1px #dde1e7 solid; 
    border-right: 1px #dde1e7 solid; 
    border-bottom: 2px #f1f4f7 solid; 
    -moz-border-radius: 2px; 
    -webkit-border-radius: 2px; 
} 

Sie auch :active anwenden könnten und die Kontrollen geben, dass bläulichen Farbton, sobald sie ausgewählt sind.

+0

Nützlich, danke! –

+0

Das sieht in IE, Firefox und Safari unter Vista wirklich gut aus. Chrome und Opera haben andere Standardeinstellungen als einige andere Betriebssysteme. Aber Ihr Vorschlag ist derjenige, den ich verwenden werde, wenn ich mich dazu entschließe aufzugeben und nur einen Stil durchzusetzen. Obwohl dies die Frage technisch nicht beantwortet, vielen Dank für das Teilen. –

+0

np;)! Wenn Sie den user-agent-Parameter vom Anforderungsheader aus analysieren können, können Sie auf CSS verweisen, die browserspezifische Deklarationen enthält. Jeder hätte sein eigenes 'input, select, textarea {}', wo Sie den * taubult * Look emulieren könnten. Dinge richtig zu machen, kostet oft viel Arbeit :)! –

0

Ich hatte einen Text Hintergrundbild, und das war auch nervig mich. Also habe ich einen relativen <div> um den <Eingang> gelegt und dann das Bild absolut über den <Eingang> eingefügt.

Dann brauchte ich natürlich ein wenig mehr Javascript, um das Bild zu verstecken, wenn es angeklickt wurde, oder wenn die Eingabe den Fokus durch Tabbing oder durch Klicken um die Ränder des Bildes bekam.

Mit etwas Fingerspitzengefühl sah das ziemlich gut mit IE8, Firefox, Chrome und Opera aus, aber es ist ein schrecklicher Klud, und es wäre nett, wenn die Browser es reparieren würden.

Verwandte Themen