2009-07-08 13 views
31

Z jakiegoś powodu większość nowoczesnych przeglądarek przestanie stosować domyślny styl obramowania wejściowego do pól tekstowych, jeśli nadasz im obraz tła. Zamiast tego dostajesz ten brzydki, wciągnięty styl. Z tego, co mogę powiedzieć, nie ma sposobu, aby CSS zastosować domyślny styl przeglądarki.Jak zastosować obraz tła do wprowadzania tekstu bez utraty domyślnej granicy w przeglądarkach Firefox i WebKit?

IE 8 nie ma tego problemu. Chrome 2 i Firefox 3.5 i zakładam też inne przeglądarki. Z tego, co przeczytałem w Internecie, IE 7 ma ten sam problem, ale ten post nie miał rozwiązania.

Oto przykład:

<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> 

W Chrome 2 wygląda tak: http://www.screencast.com/users/jadeonly/folders/Snagit/media/d4ee9819-c92a-4bc2-b84e-e3a4ed6843b6

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

Aktualizacja: JS Rozwiązanie: mam jeszcze nadzieję znaleźć czyste rozwiązanie CSS-na-wejściu, ale oto sposób obejścia tego problemu. Pamiętaj, że jest to wklejone bezpośrednio z mojej aplikacji, więc nie jest to miły, samodzielny przykład jak wyżej. Właśnie dodałem odpowiednie elementy z mojej dużej aplikacji internetowej. Powinieneś być w stanie uzyskać pomysł. Kod HTML to dane wejściowe z klasą "link". Duża pionowa pozycja tła jest spowodowana tym, że jest ikoną. Przetestowane w IE6, IE7, IE8, FF2, FF3.5, Opera 9.6, Opera 10, Chrome 2, Safari 4. muszę dostosować pozycję tle Kilka pikseli w niektórych przeglądarkach nieruchomych:

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; } 

Aktualizacja: CSS wystarczająco blisko Rozwiązanie: na podstawie sugestii Kron oto CSS, aby wejść dopasować FF i IE w Vista, który sprawia, że ​​dobry wybór, jeśli zdecydujesz się zrezygnować z czystych wartości domyślnych i wymusić jeden styl. Mam zmodyfikowano jego lekko i dodał "Blueish" efektów:

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

Hej, spróbuj tego. To trochę hackish, ale wydaje się, że działa dla mnie. granica: 0; border: 1px solid # abadb3; "Obramowanie: 0" zabije domyślną granicę na wejściu, a następująca reguła będzie wyglądać tak, jak chcesz. –

+0

Niestety nie było jasne. To by działało, gdybym po prostu chciał mieć solidną granicę, ale to, czego chcę, żeby wyglądała tak jak w przeglądarkach, gdy nie ma stylu. Chcę natywny, domyślny styl obramowania. Na przykład zobacz styl w Firefoksie: http://www.screencast.com/users/jadeonly/folders/Snagit/media/d70dd690-9273-45fb-9893-14b38202ddcc –

+0

Moja odpowiedź nie jest zbędna. Granica: 0 czyści styl granicy na wejściu. Poniższy styl stosuje nowy styl do danych wejściowych. Jak w kaskadowych arkuszach stylów;) –

Odpowiedz

10

Po zmianie stylu obramowania lub tła na wejściach tekstowych Powracają one do bardzo podstawowego trybu renderowania. Wejścia tekstowe w stylu os są zwykle nakładkami (takimi jak flash), które są renderowane na wierzchu dokumentu.

Nie wierzę, że istnieje czysta poprawka CSS na twój problem. Najlepiej zrobić - moim zdaniem - wybrać styl, który ci się podoba i naśladować go za pomocą CSS. Tak więc niezależnie od przeglądarki, dane wejściowe będą wyglądały tak samo. Nadal możesz mieć efekty hover i tym podobne. Efekty świetlne w stylu OS X mogą być trudne, ale jestem pewien, że jest to wykonalne.

@Alex Morales: Twoje rozwiązanie jest zbędne. granica: 0; jest ignorowane na rzecz granicy: 1px solid # abadb3; i powoduje niepotrzebne bajty przesyłane przez przewód.

2

Update!

OK, oto obejście, które moim zdaniem jest kompatybilne z różnymi przeglądarkami. Jedyny problem polega na tym, że domyślny styl różni się o kilka pikseli, więc może to wymagać pewnych ulepszeń.

<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>  

Korzystając absolutna-pozycjonowanie względne można zrobić absolutną div (zawierający obraz) działają bezwzględne w stosunku do jego rodzica którym wszystkie przeglądarek wiem o (nie licząc sub-IE6 wersje, IE6 + są w porządku) może uchwyt. Skalowanie użytkownika może być problemem, ale tak właśnie jest z obejściami.

Z drugiej strony, nie musisz zmieniać stylów na swoich wejściach (z wyjątkiem wcięcia tekstowego, ale i tak miałbyś tak nadzieję).

Z drugiej strony, nie jest to najładniejsze obejście.


Stary!

Wiem, że nie jest to, czego chcesz, ale możesz zrobić coś takiego, aby przynajmniej wszystkie granice wejściowe były spójne.

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

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

nie próbowałem go we wszystkich przeglądarkach, ale ponieważ nie są ustawienie border-style może używać rodzimych styl ale z innego rozmiaru (choć można pominąć, że zbyt). Myślę, że kluczem jest ustawienie koloru obramowania w taki sposób, aby wszystkie pola wejściowe używały tego samego koloru obramowania, a resztę pozostawiły przeglądarce.

+0

To sprawia, że ​​wygląda bliżej, ale nie tak samo. I nie jest to tylko statyczny wygląd. Domyślny styl wprowadzania w Firefoxie uzyskuje efekt zawisu i ostrości.W Chrome efekt ostrości jest zawsze stosowany, nawet na zmienionej granicy, o której mówimy, ponieważ efekt wydaje się znajdować w pobliżu granicy (kontur?) Zamiast zmieniać samą granicę. –

+0

Mam nadzieję, że ktoś przyjdzie z bardziej eleganckimi rozwiązaniami, ponieważ moje są raczej prymitywne. Moje pierwsze rozwiązanie zostało zaktualizowane powyżej, ale nie jest to rozwiązanie, a raczej obejście. – varl

+0

Dzięki za sugestię. Chociaż nadal mam nadzieję, że to pytanie przepełnione stosem doprowadzi do kompletnego rozwiązania, mogę użyć Twojej sugestii, aby się zbliżyć. Z wyjątkiem IE8. To ta przeglądarka, której testowałem nie została dotknięta przez ten błąd, ale wtedy twój pomysł, który sprawia, że ​​Chrome i Firefox są lepsze, sprawia, że ​​IE8 teraz pęka, a także traci efekt stylu i efektu hover. –

6

To, że mogę używać CSS, które mogą dostarczyć domyślny spojrzeć wstecz:

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; 
} 

Można również zastosować :active i dać kontrole, które niebieskawy odcień raz są one zaznaczone.

+0

Przydatne, dzięki! –

+0

To wygląda naprawdę dobrze w IE, Firefox i Safari na Vista. Chrome i Opera mają różne ustawienia domyślne, podobnie jak inne systemy operacyjne. Ale twoja sugestia jest tą, której użyję, jeśli postanowię zrezygnować i wymusić styl. Więc chociaż technicznie nie odpowiada na to pytanie, bardzo dziękuję za udostępnienie. –

+0

np;)! Jeśli możesz przeanalizować parametr user-agent z nagłówka żądania, możesz warunkowo odwołać się do CSS, który zawiera deklaracje specyficzne dla przeglądarki. Każdy będzie miał własne "input, select, textarea {}", gdzie można emulować * deafult * wygląd. Robienie dobrych rzeczy często wymaga dużo pracy :)! –

0

Miałem obraz tła tekstowego, co też mnie irytowało. Tak więc wstawiłem względne <div> wokół <input>, a następnie dodałem obraz absolutnie umieszczony nad wejściem < >.

Potem potrzebowałem trochę więcej kodu JavaScript, aby ukryć obraz, jeśli został kliknięty, lub jeśli wejście zostało skupione za pomocą tabulatora lub kliknięcia wokół krawędzi obrazu.

Przy odrobinie gry na skrzypcach wyglądało to całkiem nieźle z IE8, Firefoksem, Chrome i Operą, ale jest to okropne kludge i byłoby miło, gdyby to naprawić.

Powiązane problemy