2011-10-20 23 views
10

Với một tệp css, có cách nào để phạm vi toàn bộ tệp sao cho nó chỉ áp dụng cho các phần tử trong một phần tử đã cho:Bạn có thể tập hợp các tệp CSS để chúng chỉ áp dụng cho các hậu duệ của một phần tử đã cho không?

ví dụ: đưa ra:

<div id="container"> 
    <span class="some_element"/> 
    <!-- etc --> 
</div> 

Có cách nào để phạm vi toàn bộ một file css để áp dụng cho tất cả các yếu tố bên trong "container" mà không thêm vào trước #container cho mọi khoản css đơn?

Trả lời

7

Tôi không sợ. Một số bộ xử lý trước CSS cho phép bạn viết mã đạt được điều tương tự.

Ví dụ: LESS thực hiện quy tắc lồng nhau:

/* This LESS code... */ 

#header { 
    h1 { 
    font-size: 26px; 
    font-weight: bold; 
    } 
    p { font-size: 12px; 
    a { text-decoration: none; 
     &:hover { border-width: 1px } 
    } 
    } 
} 

/* ...produces this CSS */ 

#header h1 { 
    font-size: 26px; 
    font-weight: bold; 
} 
#header p { 
    font-size: 12px; 
} 
#header p a { 
    text-decoration: none; 
} 
#header p a:hover { 
    border-width: 1px; 
} 

Andy nêu SASS, mà làm điều tương tự.

+0

Bạn có thể thực hiện việc này trong trình duyệt bằng [demo của LESS] (http://leafo.net/lessphp/#demo). Chỉ cần dán vào CSS của bạn và bọc nó với công cụ chọn của bạn, ví dụ: '# your-custom-scope-selector {/ * CSS tại đây * /}', nhấp vào 'Biên dịch' và bạn sẽ có CSS ​​tùy chỉnh của bạn. Hữu ích nếu bạn chỉ cần chuyển đổi một lần và không có LESS hoặc SCSS trên máy của bạn. – Josh

+0

Tất nhiên loại "phạm vi" này sẽ không hoạt động trên các quy tắc được áp dụng cho các phần tử vùng chứa bên ngoài phần tử máy chủ của bạn. I E., nếu tệp CSS nguồn có 'body {font-family: Georgia;}' và bạn thay đổi nó thành '# your-custom-scope-selector body {font-family: Georgia;}', quy tắc đó sẽ dừng làm việc (giả định # của bạn-tùy chỉnh-phạm vi-chọn là một nơi nào đó * bên trong * các yếu tố cơ thể; trong kịch bản của OP, điều này nghe như trường hợp) – Josh

3

Không chỉ với CSS, nhưng bạn có thể sử dụng Sass, được biên dịch thành CSS.

-1

Bạn có thể tải trang bằng php và ném bất kỳ thẻ nào bạn muốn theo cách động hoặc làm tương tự với javascript/jQuery ... mặc dù điều đó khá vụng về. Không có phương thức tích hợp để làm điều này vì CSS luôn được áp dụng cho toàn bộ trang.

6

Bạn có thể sử dụng thuộc tính scoped trên phần tử <style>, mặc dù có rất ít hoặc không hỗ trợ trình duyệt cho nó. Trong ví dụ của bạn:

<div id="container"> 
    <style scoped>.some_element{}</style> 
    <span class="some_element"></span> 
</div> 

Dưới đây là một Polyfill jQuery: http://thingsinjars.com/post/360/scoped-style/

4

Có 2 cách bạn có thể tiếp cận này:

1) Trong HTML5, (không được hỗ trợ rộng rãi chưa) có trở thành một scoped thuộc tính bạn có thể đặt trên thẻ <style>. Here là một bài viết ngắn về chủ đề này.

2) Bạn có thể sử dụng ngôn ngữ định kiểu động (như LESS hoặc SASS) cho phép bạn lồng các quy tắc CSS liên quan với nhau.

+0

# 1 có hy vọng của tôi lên nhưng NO, nó chỉ trong dự thảo HTML5.1, không có trong đặc tả HTML5, và chỉ hoạt động trên firefox hiện thời quá yếu kém # 2 là cách duy nhất để đi – pilavdzice

0

Bạn có thể sử dụng ký pháp đặt tên BEM - http://csswizardry.com/2013/01/mindbemding-getting-your-head-round-bem-syntax/ ("khối, phần tử, công cụ sửa đổi").

dụ của bạn sẽ trở thành:

<div id="container"> 
    <span class="container__some_element"/> 
    <!-- etc --> 
</div> 

Có, nếu bạn không sử dụng từ viết tắt, bạn đang viết cùng một số nhân vật trong CSS của bạn ... nhưng phong cách của bạn sẽ có ít specificity - - có thể mang lại lợi ích.

Hỗ trợ trình duyệt hy vọng cho <style scoped> sẽ trở nên tốt hơn trong những năm tới!

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