Jaka jest różnica pomiędzy selektorami atrybutów pipe ( / ) i caret ( ^ )?

W W3Schools deklarują zarówno | oraz ^ oznacza: wybierz element z atrybutem rozpoczynający się {[11] } z określoną wartością.

Więc co za różnica?
Author: BoltClock, 2015-12-30

4 answers

Caret (^): wybiera element (<h1>), w którym wartość określonego atrybutu (rel) zaczyna się od określonej wartości (val):

h1[rel^="val"] { /** formatting */ }

h1[rel^="friend"] { color: blue; }
<h1 rel="friend-external-sandwich">I'm Blue.</h1>
<h1 rel="friend2-external-sandwich">I'm Blue.</h1>
<h1 rel="external-sandwich">I'm Black.</h1>

Pipe (|): wybiera element (<h1>), w którym wartość podanego atrybutu (rel) jest albo dokładnie wartością (val), albo rozpoczyna się od wartości, po której następuje - (val-):

h1[rel|="val"] { /**formatting */ }

h1[rel|="friend"] { color: red; }
<h1 rel="friend-external-sandwich">I'm Red.</h1>
<h1 rel="friend2-external-sandwich">I'm Black.</h1>

Więcej informacji na ten temat selektory można znaleźć tutaj: https://css-tricks.com/attribute-selectors/ lub na oficjalnej specyfikacji CSS: https://www.w3.org/TR/css3-selectors/#attribute-selectors

 46
Author: Sebastian Brosch,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-25 08:57:33

Jak W3Schools deklaruje zarówno | jak i ^ select atrybut zaczynający się od zdefiniowanej wartości

Nie , | nie jest używany do wybierania elementów, których wartość atrybutu zaczyna się od określonej wartości.

Oto co W3C Spec mówi o tych selektorach. (nacisk jest mój)

[att/ = val]

Reprezentuje element z atrybutem att, jego wartość jest dokładnie " val " lub zaczyna się od "val" bezpośrednio po " - " (U+002D) .

[att^ = val]

Reprezentuje element z atrybutem att, którego wartość zaczyna się od prefiksu "val". Jeżeli" val " jest pustym łańcuchem, wtedy selektor niczego nie reprezentuje.

Tak więc, symbol | w selektorze atrybutów wybierze tylko elementy, których wartość atrybutu jest dokładnie podaną wartością lub zaczyna się od podanej wartości, po której następuje myślnik .

Jak widać poniżej snippet, selektor atrybutów, który wykorzystuje | ([data-test |= 'val']) nie zaznacza elementu, gdy wartość atrybutu jest taka jak valid, natomiast selektor atrybutów z ^ ([data-test ^= 'val']) tak.

div[data-test |= 'val'] {
  color: beige;
}
div[data-test ^= 'val'] {
  background: red;
}
<div data-test='val'>Hello</div>
<div data-test='val-id'>Hello</div>
<div data-test='valid'>Hello</div>

W bardziej realnym scenariuszu, selektor atrybutów z pipe (|) może być używany do zaznaczania elementów i stosowania specyficznych stylów w zależności od ich języka(które można ustawić za pomocą atrybutu lang). Jak widać na fragmencie |= 'en' wybiera wszystkie elementy którego atrybutem lang jest en lub en-GB lub en-US (lub jakikolwiek inny en-*).

Jak stwierdza spec, głównym zamiarem tego selektora było umożliwienie dopasowania podkodów językowych, ale jak wskazuje BoltClock, zostało to w zasadzie zastąpione przez :lang pseudo-selektor klas.

div[lang |= 'en']{
  font-size: 16px;
  background: steelblue;
}

div[lang |= 'zh']{
  font-size: 14px;
  background: mediumslateblue;
}

div{padding: 4px;}
<div lang='en'>English: The grass is green in colour.</div>
<div lang='en-GB'>English (UK): The grass is green in colour.</div>
<div lang='en-US'>English (US): The grass is green in color.</div>
<hr>
<div lang='zh-CN'>Chinese (Simplified): 草是绿色的。</div>
<div lang='zh-TW'>Chinese (Traditional): 草是綠色的。</div>

(tłumaczenia były przez Google. Każdy błąd był niezamierzony)

Dodatkowe Informacja: selektor atrybutów, który używa pipe (|) został wprowadzony w CSS2, a selektor atrybutów, który używa cap/caret (^) został wprowadzony w CSS3.

 39
Author: Harry,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-06-20 09:12:55

Po prostu:

E [foo / = "en"] zapałki...

Element E, którego atrybut " foo " ma oddzieloną myślnikami listę wartości zaczynającą się od "en"

E[foo^ = "bar"] zapałki...

Element E, którego wartość atrybutu " foo "zaczyna się dokładnie od ciągu znaków" bar "

Rozszerzone Info:

[att/ = val]

Reprezentuje element z att atrybutu, jego wartość albo jest dokładnie "val", albo zaczyna się od" val " zaraz po "-". Ma to przede wszystkim umożliwić dopasowanie podkodów językowych (np. atrybut hreflang na elemencie a w HTML).

[att^ = val]

Reprezentuje element z atrybutem att, którego wartość zaczyna się od prefiksu "val". Jeżeli" val " jest pustym łańcuchem to selektor robi niczego nie reprezentuję.

Źródło: http://www.w3.org/TR/css3-selectors/#selectors


Przykłady

HTML

<ul>
    <li title="test">testing attribute selectors</li>
    <li title="testing">testing attribute selectors</li>
    <li title="testing test">testing attribute selectors</li>
    <li title="testing-test">testing attribute selectors</li>
    <li title="test-testing">testing attribute selectors</li>
</ul>

Testowanie selektora rury ( | ).

li[title|="testing"] { background-color: aqua; }

Tutaj wpisz opis obrazka

Testowanie selektora caret ( ^ ).

li[title^="testing"] { background-color: pink; }

Tutaj wpisz opis obrazka

#pipe > li[title|="testing"] {
  background-color: aqua;
}
#caret > li[title^="testing"] {
  background-color: pink;
}
<p>
  <code>Testing the pipe (|) selector.</code>
</p>
<ul id="pipe">
  <li title="test">testing attribute selectors</li>
  <li title="testing">testing attribute selectors</li>
  <li title="testing test">testing attribute selectors</li>
  <li title="testing-test">testing attribute selectors</li>
  <li title="test-testing">testing attribute selectors</li>
</ul>

<hr>

<p>
  <code>Testing the caret (^) selector.</code>
</p>
<ul id="caret">
  <li title="test">testing attribute selectors</li>
  <li title="testing">testing attribute selectors</li>
  <li title="testing test">testing attribute selectors</li>
  <li title="testing-test">testing attribute selectors</li>
  <li title="test-testing">testing attribute selectors</li>
</ul>

JsFiddle

 9
Author: Michael Benjamin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-28 12:39:08

Właściwie

[attr ^= value] is value*
Caret (^) oznacza zaczynające się od " value " (i oczywiście dokładna wartość)

[attr |= value] is value OR value - * (tj. [attr = value],[attr ^= value-])
Pipe (|) oznacza albo dokładną "wartość", albo zaczynającą się od "wartość -" (po dash (-))

Przykład:

<!DOCTYPE html>
<html>
    <head>
        <style>
            /* [lang=en],[lang^=en-]*/
            [lang|=en] {
                background: cyan;
            }

            [lang^=ar] {
                background: lime;
            }
        </style>
    </head>
    <body>
        <p lang="en">Hello!</p>
        <p lang="en-us">Hi!</p>
        <p lang="en-gb">Ello!</p>
        <p lang="ens">Not me!</p>

        <p lang="ar">سلام</p>
        <p lang="ar-sa">السلام علیکم</p>
        <p lang="ar-ae">السلام علیکم و رحمۃ اللہ</p>
        <p lang="ars">Me as well</p>
    </body>
</html>
 1
Author: TalESid,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-12-06 08:07:57