You can make up HTML tags

(maurycyz.com)

71 points | by todsacerdoti 1 hour ago

15 comments

  • chrismorgan 44 minutes ago

      <div class=article>
      <div class=article-header>
      <div class=article-quote>
      <div class=quote-body>
      ... a bunch more HTML ...
      </div>
      </div>
      </div>
      </div>
    
    Just one quibble over this specific example (not the broader concept, which is sound): it probably didn’t have to be div soup to begin with. Something like this may have been more reasonable:

      <article>
      <header>
      <blockquote>
      <p class=quote-body>
      ... a bunch more HTML ...
      </p>
      </blockquote>
      </header>
      </article>
    • fpoling 6 minutes ago
      This example also shows a weakness of custom tags compared with using the class attribute. An element can have only single name but may have several classes. And as classes are unordered set, one cannot in general emulate that with several elements as the nesting introduces an order absent in the class list.
  • ok123456 1 hour ago
    By default, they will behave like spans.

    You can customize it using the Custom Element API: https://developer.mozilla.org/en-US/docs/Web/API/Web_compone...

  • aaviator42 1 hour ago
    I used this to implement <yes-script>, the opposite of <noscript>, to be able to designate sections of a page to be hidden if JS was disabled. You can of course do the same thing with classes, but custom tags are fun.

    https://github.com/aaviator42/yes-script

  • singpolyma3 12 minutes ago
    You can but you never ever should. Do not do this. Use the `class` attribute to provide extra context about the kind of data your tag represents, that is what it is for.
  • flexagoon 44 minutes ago
    > <main-article>

    > <article-header>

    > <article-quote>

    > <quote-body>

    Not the best example, because in this case, you could just use real HTML tags instead

      <article>
      <header>
      <blockquote>
      <p>
  • ianbutler 1 hour ago
    https://lit.dev/

    That's the premise behind Lit (using the custom elements api)! I've been using it to build out a project recently and it's quite good, simpler to reason about than the current state of React imo.

    It started at google and now is part of OpenJS.

    • sleazebreeze 45 minutes ago
      I just evaluated Lit for work and while we didn't go with it, it was very nice. I love the base custom elements API regardless of using Lit or not, turns out that's all you really need to make intricate UIs that feel seamless.
      • g0wda 18 minutes ago
        Something about Lit/web components that's not written clearly on the label is the hoops you have to jump through to style elements. If you're using tailwind in the whole app, you just want to pull it into your custom elements without much boilerplate. My main app compiles a single minified app.css, it felt not so modular to now include that in every single component. The alternative is create a subclass that injects tailwind into Lit components. It'd be perfect it just had a switch to inherit everything the page already has.
        • hunterloftis 9 minutes ago
          > It'd be perfect it just had a switch to inherit everything the page already has.

          It does! <https://lit.dev/docs/components/shadow-dom/>

          By default, Lit renders into shadow DOM. This carries benefits like encapsulation (including the style encapsulation you mention). If you prefer global styles, you can render into light DOM instead with that one-line switch.

          However, shadow DOM is required for slotting (composing) components, so typically what I'd recommend for theming is leveraging the array option of each component's styles:

              static styles = [themeStyles, componentStyles]
          
          Then you define your shared styles in `themeStyles`, which is shared across all components you wish to have the same theme.
        • spankalee 4 minutes ago
          There's a long standing standards issue for this: https://github.com/WICG/webcomponents/issues/909

          While you can easily turn rendering to shadow DOM off on a per-component basis, that removes the ability to use slots. It only really works for leaf nodes.

          Pulling a stylesheet into every component is actually not bad though. Adopted stylesheets allow you to share the same stylesheet instance across all shadow roots, so it's quite fast.

  • hecanjog 1 hour ago
    You sure can! They all have inline defaults like `<span>` so set some CSS baseline on them as needed, but this is like the best kept secret of HTML or something? Unknown tags will become `HTMLUnknownElement` and behave like a span.

    Edit: the reason for avoiding this in the past was name-spacing. But the standard says you can use a hyphen and then you're OK, native elements won't ever use a `-`.

    Edit 2: also it's great because it works fine with CSS selectors too. Write stuff like `<image-container>` in plain HTML docs and it's fine.

    Edit 3: but also `<albums>` tags and etc which won't be adopted into the HTML standard soon work too if they don't conflict with element names, and the rare case that they might be adopted in the future as an element name can be resolved with a simple text search/replace.

    Edit 4: This all really has little to do with javascript, but you can use `querySelector` and `querySelectorAll` with any of these made up names the same as any native name too.

    It's very nice to write. I used and liked vue for a little while when it was needed(?) but modern HTML fills that gap.

    • ameliaquining 32 minutes ago
      Nitpick: If a nonstandard element name contains a hyphen (and is otherwise a syntactically valid custom element name), the element's DOM object is an instance of HTMLElement, not HTMLUnknownElement.

      Quoth the standard: "The use of HTMLElement instead of HTMLUnknownElement in the case of valid custom element names is done to ensure that any potential future upgrades only cause a linear transition of the element's prototype chain, from HTMLElement to a subclass, instead of a lateral one, from HTMLUnknownElement to an unrelated subclass."

  • orliesaurus 17 minutes ago
    If this works, then the point of having standards, is just for screen readers??
  • callc 37 minutes ago
    Wow, this is great, unlocks lots of freedom. I was under the impression that this was not possible, maybe through web components or <slot>.

    As a side note, I’ve been going through all the HTML elements slowly to learn the fundamentals, and it turns out that lots of elements are just a <div> or <span>, with different default styles and default ARIA things.

    And a <div> is just a <span> with display block…

    This and TFA both help me to realize HTML is pretty darn simple.

    • pests 28 minutes ago
      > And a <div> is just a <span> with display block…

      It's a bit more subtle than that. HTML5 defines "Content Models", two of which are 'Phasing Content' and 'Flow Content'. Phasing Content can only contain text and text-like tags (em, strong, bold) whereas Flow Content can contain anything.

      Technically <span> is defined as accepting Phrasing Content and <div> accepts Flow Content. Changing this with CSS doesn't change the content model.

      Although browsers are very forgiving so it all works anyways and this is very in the deep end, I can't think of the last time I've consciously thought of this stuff.

      https://html.spec.whatwg.org/#the-span-element

      https://html.spec.whatwg.org/#the-div-element

      https://html.spec.whatwg.org/#content-models

  • macintux 1 hour ago
    Huh. That led me to wonder whether anyone has created CSS for DocBook, and it appears it exists.

    http://www.badgers-in-foil.co.uk/projects/docbook-css/

  • ycombiredd 52 minutes ago
    As someone who writes html only rarely (I'm more of a "backend" guy, and even use that term loosely.. most of my webdev experience dates back to the CGI days and often the html was spat out by Perl scripts) and usually in vim, I am pleased to know there is an in-built solution outside of me properly indenting or manually counting divs. Thanks for enlightening me.
    • wging 41 minutes ago
      A more common alternative to counting divs would be CSS classnames or (for unique elements on the page) IDs. You'd do `document.querySelector('.my-class')` to locate `<div class="my-class">` or similar, rather than using the fact that e.g. something is nested 3 divs inside <body>.

      Even if this custom element trick didn't work, I don't see why one would need to count divs (at least if you control the markup, but if not then made-up tags aren't an option anyway). The article even mentions using class names as an option.

      • ycombiredd 20 minutes ago
        Sorry, I didn't mention class names because the article explicitly did and I assumed that my aversion to the extra typing would be presumed by a reader of my comment. My mistake.

        So yeah, I guess what wasn't obvious from my statement of gratitude was that I appreciate knowing that there is a more concise way of keeping track - even without CSS styling. If I make up tags, they will just inherit default styling but to my eye I can be clear about where things are closed, and where to insert things later. I was talking about the manual editing (in vim, as I mentioned), rather than any dynamic query selectors. Make more sense?

  • gkoberger 1 hour ago
    I probably wouldn't do this for a lot of reasons.

    That being said, if you read through that post and were intrigued, you might also like custom web components: https://web.dev/articles/custom-elements-v1

    It's a simple way to add more to your "made up" HTML tags. So you could have a tag called <my-code>, for example, that automatically has a copy button and syntax highlights the code.

  • nektro 31 minutes ago
    the comments here informing us they default to behaving like <span> instead of like <div> is the biggest disappointment of my day so far
  • superkuh 52 minutes ago
    https://blog.jim-nielsen.com/2023/html-web-components/ - Jim Nielsen has a series of posts on how to use made up HTML tags in a way that doesn't just fail to nothing when the javascript defining the custom-element doesn't get successfully executed.
  • coreyzzp 2 minutes ago
    [dead]