2009-07-03 68 views
7

Tôi muốn có thanh tiến trình XHTML + CSS với màu tương phản giữa các vùng nền trống và trống.Màu văn bản thanh tiến trình CSS cho hình nền trống và tương phản trống?

Tôi gặp sự cố với màu văn bản. Bởi vì nền đầy và trống là quá tương phản (đây là một yêu cầu), để vẫn có thể đọc được văn bản nên được hai màu để được tương phản với cả hai người trong số họ. Hình ảnh nên giải thích nó tốt hơn so với dòng chữ:

Progress bar with dark blue filled area and white empty background http://drdaeman.pp.ru/tmp/20090703/progress-bar-text-example.png Example of the problem http://drdaeman.pp.ru/tmp/20090703/progress-bar-text-problem.png

hiện thực hiện thanh tiến trình của tôi là tầm thường, nhưng như ví dụ trên cho thấy, các văn bản có thể được khó khăn để đọc trong một số trường hợp, đó là chính xác một vấn đề Tôi muốn giải quyết.

hiện nỗ lực thực hiện (giản thể) của tôi (thất bại, vì overflow: hidden không hoạt động mà không cần định vị div.progress mà tôi không thể vị trí vì nội span 's width):

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> 
<head> 
    <meta http-equiv="content-type" content="text/html; charset=UTF-8" /> 
    <title>Progress bar test</title> 
    <style type="text/css"> 
    div.progress_bar { 
     border: 1px #ccc solid; position: relative; 
     text-align: center; height: 32px; 
    } 
    div.progress_bar .progress { 
     height: 32px; 
     overflow: hidden; /* This does NOT work! */ 
    } 
    div.progress_bar .progress div { 
     position: absolute; width: 100%; height: 32px; 
     z-index: 30; overflow: hidden; 
     background-color: #44a; 
    } 
    div.progress_bar span { 
     position: absolute; top: 0; left: 0; width: 100%; 
     z-index: 20; 
     color: #000; 
    } 
    div.progress_bar .progress span { 
     position: absolute; top: 0; left: 0; width: 100%; 
     z-index: 40; 
     color: #eee; 
    } 
    </style> 
</head> 
<body> 
    <!-- Can be of any (unknown) width. Think of "width: auto". 
     The 400px value is just to keep it small on a big monitor. 
     DON'T rely on it! --> 
    <div id="container" style="width: 400px;"> 
    <div class="progress_bar"> 
     <!-- div.progress is a dark filled area container --> 
     <div class="progress" style="width: 51%;"> 
     <!-- Actually dark filled area --> 
     <div style="width: 51%;"></div> 
     <!-- Text (white). 
      Does not clip, even with overflow: hidden on parent! --> 
     <span>This is a test</span> 
     </div> 
     <!-- Text (black) --> 
     <span>This is a test</span> 
    </div> 
    </div> 
</body> 
</html> 

sống phiên bản của trên: http://drdaeman.pp.ru/tmp/20090703/test2.html
nỗ lực trước: http://drdaeman.pp.ru/tmp/20090703/test.html

Các hình ảnh nguyên mẫu GIMP chỉnh sửa, và không chính xác những gì đang hiển thị này.

Thêm: Cảm ơn tất cả các bạn, đặc biệt là Meep3D, Nosredna và Lachlan! Tuy nhiên, tôi vẫn gặp sự cố - trong thanh tiến trình của trường hợp của tôi không có chiều rộng cố định và tất cả không gian có sẵn theo chiều ngang (width: auto; hoặc width: 100% đều được chấp nhận). Nhưng không có quy tắc mã số của Lachlan mà không có quy tắc width: 400px. Và tôi vẫn muốn tránh sử dụng JavaScript, nếu có thể.

+0

Điều gì chính xác là vấn đề với 0% và 100%? – Nosredna

+0

Hoặc là văn bản màu đen trên nền màu xanh đậm (rất khó đọc) hoặc văn bản màu trắng trên nền trắng (không thể đọc được). – drdaeman

+0

Tôi phải thiếu điều gì đó. Tại sao không làm cho nó trắng khi nó trên màu xanh đậm và đen khi nó trên màu trắng? – Nosredna

Trả lời

8

Theo đề nghị Meep3D của, mất 2 bản sao của bản văn.

Bọc từng ảnh trong một div có cùng chiều rộng với vùng chứa. Div "trên" được bao bọc với một div khác mà clip theo tỷ lệ phần trăm mong muốn.

Cập nhật: đã xóa chiều rộng cố định.
div "trên" được định kích thước bằng phần trăm nghịch đảo của trình bao bọc của nó.

<html> 
<head> 
    <style type="text/css"> 
    #container { 
     position: relative; 
     border: 1px solid; 
     text-align: center; 
     width: 400px; 
     height: 32px; 
    } 
    .black-on-white { 
     height: 32px; 
     color: #000; 
    } 
    .white-on-black { 
     height: 32px; 
     color: #fff; 
     background-color: #44a; 
    } 
    .wrapper { 
     width: 53%; 
     overflow: hidden; 
     position: absolute; 
     top: 0; left: 0; 
    } 
    .black-on-white { 
     width: 100%; 
    } 
    .white-on-black { 
     width: 188.7%; 
    } 
    </style> 
</head> 
<body> 
    <div id="container"> 
    <div class="wrapper"> 
     <div class="white-on-black"> 
      <span>This is a test</span> 
     </div> 
    </div> 
    <div class="black-on-white"> 
     <span>This is a test</span> 
    </div> 
    </div> 
</body> 
</html> 
+0

Cảm ơn bạn, đây là những gì tôi đã thử ngày hôm qua quá. Một vấn đề - trong thanh tiến trình trường hợp của tôi không có chiều rộng cố định và có tất cả không gian có sẵn theo chiều ngang. Nhưng không có quy tắc 'width: 400px' thì mọi thứ đều bị hỏng. Và tôi muốn tránh sử dụng JavaScript, nếu có thể. – drdaeman

+0

Tuyệt vời! Cảm ơn bạn rất nhiều, nó hoạt động rất tốt. Đã không suy nghĩ về (1/phần trăm) chiều rộng. – drdaeman

1

Bạn có thể:

  • Tìm một màu xám mà phù hợp với
  • Sử dụng JavaScript để thay đổi màu sắc giữa màu trắng và màu đen năng động, tùy thuộc vào nơi nó là
  • Tận dụng tối màu giữa gradient nền gần sang màu trắng, và luôn luôn sử dụng chữ màu tối
  • Đặt tiến độ outisde hộp:
[#########    ] 50 %
+0

Cảm ơn bạn. Tôi đang xem xét những đề xuất như là một tùy chọn "dự phòng" nếu tôi không thực hiện những gì tôi muốn chính xác. Tuy nhiên, nếu có thể, tôi thực sự muốn thực hiện nó theo cách nó được hiển thị trên hình ảnh trong câu hỏi của tôi. – drdaeman

8

Điều gì về việc đặt một bản sao thứ hai của văn bản thanh tiến trình bên trong div, và đặt tràn của div để ẩn, vì vậy nó tiết lộ với nó?

-

Cập nhật: Tôi cũng không phải là một chuyên gia về javascript, nhưng tôi chắc chắn rằng bạn có thể tìm hiểu chiều rộng của một đối tượng và sau đó đặt bù đắp dựa trên rằng nếu chiều rộng là linh hoạt như bạn nói .

+2

Đây là những gì bạn muốn làm. Có hai phiên bản của thanh trên đầu trang mỗi khác và dần dần tiết lộ một trong số họ. – Nosredna

+0

Âm thanh như một ý tưởng hay. Cảm ơn bạn, tôi sẽ cố gắng! – drdaeman

+0

Tôi đã có ý tưởng tổng thể - nó có vẻ là một cách đúng đắn, nhưng tiến trình không có chiều rộng cố định và tự động kéo dài đến tất cả không gian có sẵn, vì vậy đặt một bản sao vào div bên trong (đầy) với ví dụ 'width: 50% 'không hoạt động. – drdaeman

1

Bạn có thể sử dụng bóng văn bản cho văn bản "phần trăm" của mình. Nhược điểm duy nhất cho điều này là nó sẽ chỉ làm việc trong các trình duyệt mới nhất. Chỉ Firefox 3.5, Safari (tất cả các phiên bản) và Chrome 2+ hỗ trợ nó.

Đây là bản trình diễn về cách sử dụng bóng văn bản theo cách có thể làm cho tiến trình của bạn có thể đọc được.
http://www.w3.org/Style/Examples/007/text-shadow#white

Nếu bạn sẵn sàng để sử dụng nhiều JavaScript, bạn có thể thử jQuery plugin này:

http://kilianvalkhof.com/2008/javascript/text-shadow-in-ie-with-jquery/

Bài báo cho biết nó hoạt động trong IE mà thôi, tuy nhiên nó hoạt động trong Chrome 3 (những gì Tôi đang sử dụng), Firefox 3.5, Internet Explorer và Safari. Nó có thể làm việc trong các trình duyệt cũ hơn nhưng tôi chưa thử nghiệm nó.

1

Meep3D có câu trả lời đúng. Hai phiên bản của hộp. Tiết lộ n% của phần trên cùng.

Tùy chọn khác:

  • Đặt một hộp mờ dưới số rằng hoặc làm tối vùng đối với một số màu trắng sáng hoặc làm khu vực đối với một số màu đen.
  • Sử dụng màu đỏ và trắng làm hình nền và số màu đen. (Vấn đề ở đây là màu đỏ có liên quan đến lỗi, vì vậy bạn có thể chơi với các kết hợp khác của ba màu sắc mà là tất cả các cao độ tương phản với nhau.)
Các vấn đề liên quan