Làm cách nào để ngăn việc kế thừa CSS?


94

Tôi có menu điều hướng phân cấp trong thanh bên sử dụng danh sách lồng nhau (thẻ <ul> và <li>). Tôi đang sử dụng chủ đề tạo sẵn đã có sẵn kiểu cho các mục danh sách, nhưng tôi muốn thay đổi kiểu cho các mục cấp cao nhất nhưng KHÔNG áp dụng nó cho các mục con. Có cách nào dễ dàng để áp dụng các kiểu cho thẻ mục danh sách cấp cao nhất mà KHÔNG để các kiểu đó xếp tầng xuống các mục danh sách con của nó không? Tôi hiểu rằng tôi có thể thêm rõ ràng các kiểu ghi đè vào các mục con nhưng tôi thực sự muốn tránh phải sao chép tất cả mã kiểu đó nếu có một cách dễ dàng chỉ cần nói "áp dụng các kiểu này cho lớp này và KHÔNG phân tầng chúng xuống bất kỳ phần tử con nào ". Đây là html tôi đang sử dụng:

<ul id="sidebar">
  <li class="top-level-nav">
    <span>HEADING 1</span>
    <ul>
      <li>sub-heading A</li>
      <li>sub-heading B</li>
    </ul>
  </li>
  <li class="top-level-nav">
    <span>HEADING 2</span>
    <ul>
      <li>sub-heading A</li>
      <li>sub-heading B</li>
    </ul>
  </li>
</ul>

Vì vậy, CSS có các kiểu cho #sidebar ul#sidebar ul liđã có, nhưng tôi muốn thêm các kiểu bổ sung để #sidebar .top-level-navKHÔNG phân chia thành các kiểu con của nó. Có cách nào để thực hiện việc này một cách đơn giản không hay tôi cần phải sắp xếp lại tất cả các kiểu để các kiểu đã #sidebar ulcó bây giờ là cụ thể cho một số lớp nhất định?


2
Tôi đã tìm kiếm trên trang web cho những câu hỏi tương tự và không tìm thấy bất cứ điều gì (không nói là không có, nhưng tôi đã tìm). Nếu bạn biết nó là gì, bạn có thể vui lòng hướng dẫn tôi với nó? Cảm ơn!

1
stackoverflow.com/questions/747308/break-css-inheritance | nó nói lên khá nhiều điều mà Matthew đã trả lời.
JasonV

1
Vì vậy, tôi cho rằng câu trả lời là "không, không có cách nào để làm điều đó một cách đơn giản - bạn phải ghi đè thủ công mọi cài đặt kiểu trên mục phụ" - tôi hiểu điều này có chính xác không? Cảm ơn một lần nữa.

Câu trả lời:


38

Vì chưa có bộ chọn cha nào (hoặc như Shaun Inman gọi chúng là bộ chọn đủ điều kiện ), vì vậy bạn sẽ phải áp dụng kiểu cho các mục danh sách con để ghi đè các kiểu trên các mục danh sách mẹ.

Cascading là toàn bộ điểm của Cascading Style Sheets, do đó có tên.


13
Thông tin này đã lỗi thời kể từ IE8. Xem câu trả lời của Silviu Postavaru. Hãy cân nhắc để đổi séc sang câu trả lời phù hợp hơn.
tmuecksch

lol, tôi đồng ý xếp tầng là bản chất. Nhưng cần phải có một cách để ngăn chặn việc truyền giống từ một phụ huynh cụ thể có ý định khác.
Obay Abd-Algader

72

Bạn có thể sử dụng bộ chọn con

Vì vậy, sử dụng

#parent > child

Sẽ chỉ làm cho trẻ em cấp một để áp dụng các phong cách. Thật không may, IE6 không hỗ trợ bộ chọn con.

Nếu không bạn có thể sử dụng

#parent child child

Để đặt một kiểu cụ thể khác cho trẻ em hơn một cấp độ bên dưới.


1
Bạn có thể cho tôi thấy điều này đang hoạt động trong JSFiddle không? Tôi đã cố căn giữa một div được hiển thị trong khối nội tuyến, nhưng nó vẫn căn giữa văn bản bên trong div.
Calmarius

41

Có một thuộc tính được gọi alltrong mô-đun kế thừa CSS3 . Nó hoạt động như thế này:

#sidebar ul li {
  all: initial;
}

Kể từ năm 2016-12, tất cả các trình duyệt, trừ IE / Edge và Opera Mini đều hỗ trợ thuộc tính này.


4
@AndriusDobrotinas cuối cùng được hỗ trợ? Tôi dường như không hoàn toàn hiểu nhận xét của bạn. Có một plugin PostCSS cung cấp tính năng này, nếu bạn sử dụng PostCSS: github.com/maximkoretskiy/postcss-initial
Boldewyn

1
@AndriusDobrotinas, Nhận xét của bạn rất không mang tính xây dựng. Câu trả lời được đăng vì lợi ích của cộng đồng; cố gắng hết sức để thấy được lợi ích của nó.
Cody

2
Tính đến bây giờ, chỉ có IE và Opera Mini không hỗ trợ nó, tất cả các trình duyệt chính khác làm
Legends

@Boldewyn không có giá trị 'mặc định', theo như người ta có thể nói từ doc w3 liên kết ...
benomatis

@webeno đã có, khi tôi viết câu trả lời: w3.org/TR/2013/WD-css3-cascade-20130103/#all-shorthand Có vẻ như có một số khác biệt nhỏ giữa cũ defaultvà mới unset, nhưng ngay bây giờ tôi ' không có thời gian để điều tra thêm. Vui lòng chỉnh sửa câu trả lời để cập nhật câu trả lời.
Boldewyn

26

Bạn có thể sử dụng công cụ chọn * để thay đổi các kiểu con trở về mặc định

thí dụ

#parent {
    white-space: pre-wrap;
}

#parent * {
    white-space: initial;
}

1
Đó là một giải pháp rất hay - đặc biệt nếu bạn không biết lớp của phụ huynh.
BurninLeo

Tôi nghĩ rằng tôi biết câu trả lời cho điều này nhưng vẫn có cách đặt nội tuyến này? <div id="parent" style="white-space:pre-wrap;*white-space:initial;"/>
1,21 gigawatts

11

Việc bao bọc bằng iframe khiến css gốc trở nên lỗi thời.


2
Thật buồn cười khi đây là câu trả lời tồi tệ nhất vì về mặt kỹ thuật, nó là cách vật lý duy nhất để ngăn việc kế thừa CSS. Không phải tôi đang tranh luận rằng bạn nên sử dụng nó theo cách này.
davidelrizzo

2
Tôi khuyên bạn không nên sử dụng CSS vật lý, hãy để nó trong thế giới ảo nơi nó thuộc về!
michaelward82

Trên thực tế, việc thêm vào iframelàm cho thành phần con của tôi vô hình. Suy nghĩ?
Kevin Ghaboosi

5

Câu trả lời ngắn gọn là: Không, không thể ngăn việc kế thừa CSS. Bạn chỉ có thể ghi đè các kiểu được đặt trên cha mẹ. Xem thông số kỹ thuật:

Mỗi phần tử trong tài liệu HTML sẽ kế thừa tất cả các thuộc tính có thể kế thừa từ phần tử gốc ngoại trừ phần tử gốc ( html), không có phần tử gốc . - W3C

Ngoài việc ghi đè mọi tài sản được thừa kế. Bạn cũng có thể sử dụng initialtừ khóa, ví dụ color: initial;. Nó cũng có thể được sử dụng cùng với all, ví dụ all: initial;, sẽ thiết lập lại tất cả các thuộc tính cùng một lúc. Thí dụ:

.container {
  color: blue;
  font-style: italic;
}
.initial {
  all: initial;
}
<div class="container">
  The quick brown <span class="initial">fox</span> jumps over the lazy dog
</div>

Bảng hỗ trợ trình duyệt theo Tôi có thể sử dụng ...

  • all (Hiện tại không có hỗ trợ trong cả IE và Edge, những thứ khác đều tốt)
  • initial (Hiện tại không có hỗ trợ trong IE, những cái khác đều tốt)

Bạn có thể thấy hữu ích bằng cách sử dụng bộ chọn trẻ em trực tiếp> trong một số trường hợp. Thí dụ:

.list > li {
  border: 1px solid red;
  color: blue;
}
<ul class="list">
  <li>
    <span>HEADING 1</span>
    <ul>
      <li>sub-heading A</li>
      <li>sub-heading B</li>
    </ul>
  </li>
  <li>
    <span>HEADING 2</span>
    <ul>
      <li>sub-heading A</li>
      <li>sub-heading B</li>
    </ul>
  </li>
</ul>

Kiểu viền chỉ được áp dụng cho những người con trực tiếp <li>, cũng như bordermột tài sản không được thừa kế. Nhưng màu văn bản đã được áp dụng cho tất cả các phần tử con, cũng như colormột tài sản được thừa kế.

Do đó, >bộ chọn sẽ chỉ hữu ích với các thuộc tính không được kế thừa, khi nói đến việc ngăn kế thừa.


2

Bạn có thể sử dụng một cái gì đó như jQuery để "vô hiệu hóa" hành vi này, mặc dù tôi khó nghĩ rằng đó là một giải pháp tốt khi bạn nhận được logic hiển thị trong css & javascript. Tuy nhiên, tùy thuộc vào yêu cầu của bạn, bạn có thể thấy css utils của jQuery làm cho cuộc sống của bạn dễ dàng hơn so với thử hacky css, đặc biệt nếu bạn đang cố gắng làm cho nó hoạt động cho IE6


2

Ví dụ: nếu bạn có hai div trong tài liệu XHTML.

<div id='div1'>
    <p>hello, how are you?</p>
    <div id='div2'>
        <p>I am fine, thank you.</p>
    </div>
</div>

Sau đó, hãy thử điều này trong CSS.

#div1 > #div2 > p{
    color: red;
}

chỉ ảnh hưởng đến đoạn 'div2'.

#div1 > p {
    color: red;
} 

chỉ ảnh hưởng đến đoạn 'div1'.


2

Bạn không cần tham chiếu lớp cho lis. Thay vì có CSS ​​như

li.top-level-nav { color:black; }

bạn có thể viết

ul#sidebar > li { color:black; }

Điều này sẽ chỉ áp dụng kiểu dáng cho các kiểu lingay lập tức đi xuống từ thanh bên ul.


0

chỉ cần đặt chúng trở lại mặc định trong bộ chọn "#sidebar ul li"


Cảm ơn vì câu trả lời. Có, tôi hiểu rằng tôi có thể đặt chúng trở lại theo phong cách của mục phụ, nhưng tôi đang cố gắng tránh điều đó vì tôi đang sử dụng chủ đề mà tôi không tạo và tôi tự hỏi liệu mình có thể tiết kiệm nhiều thời gian không bằng cách chỉ sử dụng một số quy tắc "do-not-cascade: true" hoặc tương tự như vậy, thay vì định vị tất cả các kiểu khác nhau cho ul's và li's nằm rải rác khắp nơi và sau đó lo lắng về những hậu quả không mong muốn ở các khu vực khác của trang web .
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.