2013-03-07 58 views
5

Tôi có div với 4 css columns và tôi muốn chọn cột thứ 3 và thứ 4 để làm cho văn bản hơi tối hơn vì tôi không có độ tương phản tốt giữa văn bản và background-image. Điều này có thể không? Tôi có thể chấp nhận bất kỳ giải pháp css hoặc js nào.Tôi có thể chọn cột css thứ n không?

Đây là demo.

--EDIT--

Dường như nó không thể tìm thấy một bộ chọn cho khối pseudo (nếu tôi có thể nói) tuy nhiên tôi vẫn cần phải tìm ra một cách để tạo khối đáp ứng (giống như các cột) sẽ tách văn bản bằng nhau (chiều rộng) bất cứ khi nào trình duyệt được thay đổi kích thước.

+0

như xa như tôi biết, không có cách nào để làm điều đó – Luca

+3

Không có (* [nhưng] (http://dev.w3.org/csswg/selectors4/#nth-column-pseudo) *) một thực hiện có nghĩa là để làm điều này. –

+0

@ David Tôi nghĩ vậy. Đó là lý do tại sao tôi đang cố gắng tìm ra cách để làm điều này với js. Ngay cả khi kịch bản tạo khối khác với cột css. – otinanai

Trả lời

3

Theo như tôi biết bạn sẽ không thể áp dụng phong cách để các cột. Tuy nhiên, bạn có thể thử sử dụng độ dốc làm nền để tạo cột 3 và 4 màu khác.

#columns { 
    background: -webkit-linear-gradient(left, rgba(0,0,0,0) 50%, blue 50%); 
    /*... appropriate css for other browser engines*/ 
} 

updated jsFiddle cập nhật với tất cả các trình duyệt hỗ trợ độ dốc

- EDIT -

Kể từ khi ý định đã thực sự thay đổi màu sắc văn bản và không phải là nền cho cột thứ ba và thứ tư một số suy nghĩ bổ sung.

Hiện tại, dường như không thể áp dụng kiểu cho các cột đơn bên trong vùng chứa. Một cách giải quyết khác có thể thay đổi màu văn bản trong các cột cụ thể là đặt mọi từ trong một số span. Sau đó, sử dụng JavaScript để lặp qua các từ và xác định vị trí cột mới bắt đầu. Chỉ định phần tử đầu tiên trong cột thứ ba, một lớp mới sẽ làm cho nó có thể tạo kiểu này và các anh chị em sau với một màu văn bản khác.

Vì vùng chứa là một phần của bố cục đáp ứng và có thể thay đổi về kích thước, tập lệnh sẽ phải được chạy lại trên sự kiện thay đổi kích thước cho tài khoản để thay đổi độ rộng cột.

Mục đích của ví dụ mã là để phác thảo làm thế nào để thực hiện một giải pháp như vậy và cần được cải thiện để sử dụng trong một ứng dụng thực tế (ví dụ như span s đang được tái tạo mỗi khi styleCols đang chạy, rất nhiều giao diện điều khiển đầu ra. ..).

Javascript

function styleCols() { 
    // get #columns 
    var columns = document.getElementById('columns'); 
    // split the text into words 
    var words = columns.innerText.split(' '); 
    // remove the text from #columns 
    columns.innerText = ''; 

    // readd the text to #columns with one span per word 
    var spans = [] 
    for (var i=0;i<words.length;i++) { 
     var span = document.createElement('span'); 
     span.innerText = words[i] + ' '; 
     spans.push(span); 
     columns.appendChild(span); 
    } 

    // offset of the previous word 
    var prev = null; 
    // offset of the column 
    var colStart = null; 
    // number of the column 
    var colCount = 0; 
    // first element with a specific offset 
    var firsts = []; 
    // loop through the spans 
    for (var i=0;i<spans.length;i++) { 
     var first = false; 
     var oL = spans[i].offsetLeft; 
     console.info(spans[i].innerText, oL); 
     // test if this is the first span with this offset 
     if (firsts[oL] === undefined) { 
      console.info('-- first'); 
      // add span to firsts 
      firsts[oL] = spans[i]; 
      first = true; 
     } 
     // if the offset is smaller or equal to the previous offset this 
     // is a new line 
     // if the offset is also greater than the column offset we are in 
     // (the second row of) a new column 
     if ((prev === null || oL <= prev) && (colStart === null || oL > colStart)) { 
      console.info('-- col++', colCount + 1); 
      // update the column offset 
      colStart = oL; 
      // raise the column count 
      colCount++; 
     } 
     // if we have reached the third column 
     if (colCount == 3) { 
      // add our new class to the first span with the column offset 
      // (this is the first span in the current column 
      firsts[oL].classList.add('first-in-col3'); 
      return; 
     } 
     // update prev to reflect the current offset 
     prev = oL; 
    } 
} 
styleCols(); 
addEventListener('resize', styleCols, false); 

CSS

.first-in-col3, .first-in-col3~span { 
    color: red; 
} 

jsFiddle

+0

Đó không phải là một giải pháp thay thế. – Manoj

+0

Cảm ơn đề xuất của bạn nhưng tôi đang tìm cách thay đổi màu văn bản của cột thứ n. Nếu tôi sử dụng tô nền, tôi sẽ ẩn hình nền. – otinanai

+0

Ok đó là một điều khó khăn và tôi không thể nghĩ ra bất kỳ giải pháp CSS nào. Có lẽ bạn có thể cố gắng xác định từ/chữ nào trong đó cột qua JS và tự động bọc nội dung của các cột có liên quan vào một 'span' và kiểu đó? – hsan

3

Hiện tại tôi không nghĩ rằng bạn có thể làm điều đó, tại đây https://bugzilla.mozilla.org/show_bug.cgi?id=371323 là lỗi mở/yêu cầu đối với đối tượng địa lý, bạn có thể bỏ phiếu cho nó. Đến lúc đó bạn có thể xem xét sử dụng bảng.

P.S.

Give Up and Use Tables chỉ vì lợi ích của sự hài hước :)

+0

cũng ... bảng là suy nghĩ thứ hai của tôi, nhưng nếu tôi ít nhất có thể làm cho họ với các bảng css nó muốn được tốt hơn. Nhưng tôi vẫn phải đối mặt với cùng một vấn đề bộ chọn thứ n với 'display: table-column' – otinanai

1

Giải pháp duy nhất tôi có thể nghĩ rằng sẽ là một nền với màu sắc mong muốn của bạn cho cột giữa, tùy chỉnh nó cho kích thước và vị trí để nó đi phía sau colu giữa của bạn mns và làm cho background-clip:text. Thật không may nó không được hỗ trợ rất tốt. Bạn có thể tìm thêm các giải thích khác here.

+0

rất hứa hẹn mặc dù nó thiếu khả năng tương thích. – otinanai

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