2009-07-08 13 views
31

Vì một số lý do, hầu hết các trình duyệt hiện đại sẽ ngừng áp dụng kiểu đường viền nhập mặc định của chúng cho các hộp văn bản nếu bạn cung cấp cho chúng hình nền. Thay vào đó bạn sẽ có được phong cách inset xấu xí đó. Từ những gì tôi có thể nói, không có cách nào để áp dụng kiểu trình duyệt mặc định.Làm cách nào để áp dụng hình nền cho đầu vào văn bản mà không làm mất đường viền mặc định trong trình duyệt Firefox và WebKit?

IE 8 không có vấn đề này. Chrome 2 và Firefox 3.5 cũng vậy và tôi cũng giả sử các trình duyệt khác. Từ những gì tôi đã đọc trực tuyến, IE 7 có cùng một vấn đề, nhưng bài đăng đó không có giải pháp.

Dưới đây là một ví dụ:

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

Trong Chrome 2 nó trông như thế này: http://www.screencast.com/users/jadeonly/folders/Snagit/media/d4ee9819-c92a-4bc2-b84e-e3a4ed6843b6

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

Cập nhật: JS Giải pháp: tôi vẫn hy vọng để tìm một giải pháp CSS-on-the-input thuần túy, nhưng đây là giải pháp thay thế mà tôi sẽ sử dụng ngay bây giờ. Xin lưu ý rằng điều này được dán ngay ra khỏi ứng dụng của tôi vì vậy không phải là một ví dụ đẹp, độc lập như trên. Tôi vừa đưa các phần có liên quan ra khỏi ứng dụng web lớn của mình. Bạn sẽ có thể có được ý tưởng. HTML là đầu vào với lớp "liên kết". Các vị trí nền dọc lớn là bởi vì nó là một sprite. Thử nghiệm trong IE6, IE7, IE8, FF2, FF3.5, Opera 9.6, Opera 10, Chrome 2, Safari 4. Tôi cần phải tinh chỉnh vị trí nền một vài điểm ảnh trong một số trình duyệt vẫn:

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

cập nhật: CSS Đóng đủ giải pháp: Dựa trên những gợi ý từ Kron đây là CSS để làm cho đầu vào phù hợp với FF và IE trong Vista mà làm cho một lựa chọn tốt nếu bạn quyết định từ bỏ các mặc định thuần túy và thực thi một phong cách. Tôi đã thay đổi chút ít của mình và bổ sung thêm các hiệu ứng "xanh dương":

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

Xin chào, hãy thử điều này. Đó là một chút hackish nhưng nó có vẻ làm việc cho tôi. border: 0; đường viền: 1px solid # abadb3; 'Đường viền: 0' sẽ giết đường viền mặc định trên đầu vào và quy tắc sau sẽ là làm cho giao diện của bạn trông giống như bạn muốn. –

+0

Xin lỗi tôi đã không rõ ràng. Điều đó sẽ hiệu quả nếu tôi chỉ muốn nó có một đường viền chắc chắn, nhưng tôi muốn nó trông như thế nào trong trình duyệt khi không có kiểu dáng. Tôi muốn kiểu gốc, kiểu viền mặc định. Ví dụ: xem phong cách trong Firefox: http://www.screencast.com/users/jadeonly/folders/Snagit/media/d70dd690-9273-45fb-9893-14b38202ddcc –

+0

Câu trả lời của tôi không thừa. Đường viền: 0 xóa kiểu đường viền trên đầu vào. Kiểu sau áp dụng kiểu mới cho đầu vào. Như trong các bảng định kiểu xếp tầng;) –

Trả lời

10

Khi bạn thay đổi kiểu đường viền hoặc kiểu nền trên đầu vào văn bản Chúng sẽ hoàn nguyên về chế độ hiển thị rất cơ bản. Các đầu vào văn bản có kiểu chữ os thường là các lớp phủ (như flash) được hiển thị trên đầu trang của tài liệu.

Tôi không tin rằng có một bản sửa CSS thuần túy cho vấn đề của bạn. Điều tốt nhất để làm - theo ý kiến ​​của tôi - là chọn một phong cách mà bạn thích và mô phỏng nó bằng CSS. Vì vậy, không có vấn đề gì trình duyệt bạn đang ở, các yếu tố đầu vào sẽ giống nhau. Bạn vẫn có thể có hiệu ứng di chuột và những thứ tương tự. Hiệu ứng ánh sáng kiểu OS X có thể phức tạp, nhưng tôi chắc chắn nó có thể thực hiện được.

@Alex Morales: Giải pháp của bạn là không cần thiết. border: 0; bị bỏ qua ủng hộ đường viền: 1px solid # abadb3; và kết quả là các byte không cần thiết được truyền qua dây.

2

cập nhật!

Ok, đây là giải pháp thay thế mà tôi cho là tương thích với nhiều trình duyệt. Vấn đề duy nhất sẽ là phong cách mặc định khác nhau bởi một vài điểm ảnh để điều này có thể cần một số tinh chỉnh.

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

Bằng cách sử dụng định vị tuyệt đối-tương đối, bạn có thể làm cho các div tuyệt đối (có chứa các hình ảnh) đóng vai trò tuyệt đối trong quan hệ với cha mẹ của mình mà tất cả các trình duyệt tôi biết về (không kể các phiên bản IE6 phụ, IE6 + cũng tốt) có thể xử lý. Quy mô người dùng có thể là một vấn đề, nhưng đây là cách giải quyết vấn đề.

Ở phía trên, bạn không phải thay đổi kiểu dáng trên đầu vào của mình cả (ngoại trừ văn bản thụt lề, nhưng bạn vẫn muốn làm điều đó).

Mặt khác, nó không phải là cách giải quyết đẹp nhất.


Cũ!

Tôi biết đây không phải là những gì bạn muốn, nhưng bạn có thể làm một cái gì đó như thế này để ít nhất là làm cho tất cả các biên giới đầu vào phù hợp.

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

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

Tôi đã không thử nó trong tất cả các trình duyệt, nhưng kể từ khi bạn không được thiết lập border-style nó có thể sử dụng phong cách tự nhiên nhưng với kích thước khác (mặc dù bạn có thể bỏ qua điều đó quá). Tôi nghĩ rằng điều quan trọng là chỉ cần thiết lập màu biên giới để một cái gì đó để tất cả các lĩnh vực đầu vào sẽ sử dụng cùng một màu sắc biên giới và để phần còn lại lên đến trình duyệt.

+0

Điều đó làm cho nó trông gần hơn, nhưng không giống nhau. Và nó không chỉ là cái nhìn tĩnh. Kiểu nhập mặc định trong Firefox sẽ có hiệu ứng di chuột và lấy nét.Trong Chrome, hiệu ứng lấy nét luôn được áp dụng, ngay cả trên biên giới đã thay đổi mà chúng ta đang nói đến, bởi vì hiệu ứng dường như nằm xung quanh biên giới (phác thảo?) Thay vì thay đổi đường viền. –

+0

Tôi hy vọng rằng ai đó đến cùng với các giải pháp thanh lịch hơn, bởi vì tôi khá thô lỗ. Tôi đã cập nhật giải pháp đầu tiên của mình ở trên với một giải pháp khác, mặc dù nó không thực sự là một giải pháp, nhiều giải pháp khác. – varl

+0

Cảm ơn bạn đã đề xuất. Trong khi tôi vẫn hy vọng câu hỏi tràn ngăn xếp này dẫn đến giải pháp hoàn chỉnh, tôi có thể sử dụng đề xuất của bạn để tiến gần hơn. Ngoại trừ IE8. Đó là một trong những trình duyệt mà tôi đã thử nghiệm không bị ảnh hưởng bởi lỗi này, nhưng sau đó ý tưởng của bạn mà làm cho Chrome và Firefox tốt hơn, làm cho IE8 bây giờ phá vỡ và cũng mất phong cách và hiệu ứng di chuột. –

6

Đây là CSS mà tôi sử dụng có thể cung cấp mặc định nhìn lại:

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

Bạn cũng có thể áp dụng :active và đưa ra các điều khiển xanh dương sắc khi họ đang chọn.

+0

Hữu ích, cảm ơn! –

+0

Điều đó có vẻ thực sự tốt trong IE, Firefox và Safari trên Vista. Chrome và Opera có các mặc định khác nhau như một số hệ điều hành khác. Nhưng, đề xuất của bạn là gợi ý tôi sẽ sử dụng nếu tôi quyết định từ bỏ và chỉ thi hành một phong cách. Vì vậy, trong khi điều này về mặt kỹ thuật không trả lời câu hỏi, cảm ơn rất nhiều để chia sẻ. –

+0

np;)! Nếu bạn có thể phân tích cú pháp param đại lý người dùng từ tiêu đề yêu cầu, bạn có thể tham khảo có điều kiện CSS có chứa các khai báo dành riêng cho trình duyệt. Mỗi cái sẽ có 'đầu vào, lựa chọn, văn bản {}' riêng của nó, nơi bạn có thể mô phỏng giao diện * điếc. Làm những việc đúng thường mất rất nhiều công việc :)! –

0

Tôi đã có hình nền văn bản và điều này cũng khiến tôi khó chịu. Vì vậy, tôi đặt một số tương đối <div> làm tròn số < nhập > và sau đó thêm hình ảnh hoàn toàn được định vị trên đầu vào < >. Sau đó tất nhiên tôi cần thêm một chút Javascript để ẩn hình ảnh nếu nó được nhấp, hoặc nếu đầu vào có tiêu điểm bằng tabbing, hoặc bằng cách nhấp vào xung quanh các cạnh của hình ảnh.

Với một chút không quan trọng, điều này trông khá tốt với IE8, Firefox, Chrome và Opera, nhưng đó là một kludge khủng khiếp và sẽ rất tuyệt nếu các trình duyệt sửa nó.

Các vấn đề liên quan