W3C home > Mailing lists > Public > public-css-archive@w3.org > December 2018

Re: [csswg-drafts] [selectors-4] Add a count to :has() (#1547)

From: Tommy Hodgins via GitHub <sysbot+gh@w3.org>
Date: Fri, 07 Dec 2018 06:15:40 +0000
To: public-css-archive@w3.org
Message-ID: <issue_comment.created-445134325-1544163339-sysbot+gh@w3.org>
You might want to check out [quantity queries](http://quantityqueries.com/) which are kind of a selector hack that targets an element based on the number of siblings :D It's functionally similar to what you're asking for and supported in browsers right now, though it is a little ugly to look at and reason with.

Going the JS route, I've implemented responsive conditions like `min-characters`, `characters`, and `max-characters` as element queries a couple of different ways that we can use in the meantime while we wait for browsers to support `:has()`. You can use EQCSS as a custom syntax like this with `(min-children: n)` or `(children: n)` or `(max-children: n)`:

```html
<ul>
  <li>one
</ul>
<ul>
  <li>one
  <li>two
</ul>
<ul>
  <li>one
  <li>two
  <li>three
</ul>

<style>
  @element ul and (children: 2) {
    :self {
      background: lime;
    }
  }
</style>

<script src=https://elementqueries.com/EQCSS.js></script>
```

as well as in CSS, parsed from CSSOM and run through javascript plugins like this:

```html
<ul>
  <li>one
</ul>
<ul>
  <li>one
  <li>two
</ul>
<ul>
  <li>one
  <li>two
  <li>three
</ul>

<style>
  @supports (--element("ul", {"children": 2})) {
    [--self] {
      background: lime;
    }
  }
</style>

<script type=module>
  import deqaf from 'https://unpkg.com/deqaf/index.js'
  import element from 'https://unpkg.com/jsincss-element-query/index.vanilla.js'

  deqaf({stylesheet: {element}})
</script>
```
And I've also written a plugin for supporting the [`:has()` selector](https://www.npmjs.com/package/jsincss-has-selector) which would work too, if you wanted to target the `<ul>` in the way that `:has()` would using a quantity query, rather than by targeting the `<li>` themselves as the quantity query selector would do:

```html
<ul>
  <li>one
</ul>
<ul>
  <li>one
  <li>two
</ul>
<ul>
  <li>one
  <li>two
  <li>three
</ul>

<style>
  ul[--has='"li:nth-last-child(n+2):nth-last-child(-n+2):first-child, li:nth-last-child(n+2):nth-last-child(-n+2):first-child ~ li"'] {
    background: lime;
  }
</style>

<script type=module>
  import deqaf from 'https://unpkg.com/deqaf/index.js'
  import has from 'https://unpkg.com/jsincss-has-selector/index.vanilla.js'

  deqaf({rule: {has}})
</script>
```

-- 
GitHub Notification of comment by tomhodgins
Please view or discuss this issue at https://github.com/w3c/csswg-drafts/issues/1547#issuecomment-445134325 using your GitHub account
Received on Friday, 7 December 2018 06:15:42 UTC

This archive was generated by hypermail 2.4.0 : Tuesday, 5 July 2022 06:41:40 UTC