HTML5 semantic element for Tip/Warning/Error pullouts? - html

I am using XML-safe HTML5 and would like to know the semantic way of documenting extra tip/warning/error boxes (like those often found in technical manuals):
<div class="info-tip" role="contentinfo">
<p><strong>Tip:</strong> Holding the control key when doing this will make life easier.</p>
</div>
Except if possible I would like to use a more appropriate element. I am not even sure if contentinfo is an appropriate choice here.
ADDED: I am after a HTML5 alternative of the <note> element in DITA.
A little context: I will be using stylesheets (both XSLT2 and CSS) to re-format the content for a number of outputs.

The semantically closest one seems to be the <details> element - usage

Related

Do HTML5 custom elements have any drawbacks compared to classes?

I don't like div soups. You don't easily see which end tag belongs to which start tag (correct indentation helps, I know), yadda yadda. HTML5 introduced custom elements. Is there any drawback using them instead of classes except for browser support, since older Edge and IE don't support them?
I think this this HTML code:
<blog-posts>
<blog-post>
<blog-title>Do HTML5 custom elements have any drawbacks compared to classes?</blog-title>
<blog-content>I don't like div soups</blog-content>
</blog-post>
</blog-posts>
is much nicer to read than
<div class="blog-posts">
<div class="blog-posts">
<div class="blog-title">Do HTML5 custom elements have any drawbacks compared to classes?</div>
<div>I don't like div soups</div>
</div>
</div>
If I understood correctly, even if I don't call document.registerElement for my custom elements, this will work just fine, since the elements will by default inherit from HTMLElement, which gives my more or less the same behavior as the HTMLDivElement.
Always distrust developers who tell you what you should or shouldn't do.
It is your code, if it works for you, it works.
You are using W3C standard technologies so it will work for as long Browsers run JavaScript.
Yes, Web Components V0 (Google threw something against the wall) got a bad reputation;
but we are on V1 now, since 2018, and Google, Apple, Mozilla, Microsoft are now more closely working together.
(WTF.. Where is Facebook?)
Personally, I prefer:
<blog-posts-listing>
<blog-post title="Do HTML5 custom elements have any drawbacks compared to classes?">
I don't like DIV soups
</blog-post>
<blog-post title="What is the future for React?" tags="React">
I don't like **JSX** soup either
</blog-post>
</blog-posts-listing>
Because <blog-post> would be the work-horse that creates content in shadowDOM from this lightDOM.
Good use of attributes allow for great CSS
blog-post:not([title*="React"]){
background-color:lightgreen;
}
blog-post[title*="React"]{
background-color:lightcoral;
}
You can even add search with minimal JS, create styles dynamically
Adding functionality like a MarkDown parser is a breeze then
Do not create HTML tags just because you can create HTML tags...
But remember what I said about Developer advice.

Correct Microdata syntax for breadcrumbs NOT in a list?

Trying to determine the correct syntax for using Microdata inside my breadcumbs implementation. Everything I have read seems to lean towards the fact that the breadcrumbs are structured inside an ordered or unorderd list. Mine is not.
<body itemscope="" itemtype="http://schema.org/WebPage">
...
<div class="breadcrumbs" itemprop="breadcrumb">
Home
<span class="delimiter"> > </span>
Parent Item
<span class="delimiter"> > </span>
<span>Child</span>
</div>
...
</body>
If I run it inside Google's tool it seems correct, but compared to their example it is missing a lot of elements and doesn't have the structure of their example BreadcrumbList.
I'm also a little confused about the correct properties for the links. Should they all have title and url properties?
I was looking at the examples at the bottom of the page here: http://schema.org/WebPage
The breadcrumb property expects one of two values:
Text
BreadcrumbList
If you provide a Text value (like you do in the example), you can’t provide data about each link. If you are fine with that, the Microdata in your example is correct (but it also contains RDFa, which doesn’t seem to make sense, at least not without further context; so if you didn’t add them intentionally, you might want to remove the property attributes).
If you want to provide data about each link, you have to provide a BreadcrumbList value.
For the Microdata, it doesn’t matter whether or not you use a list. If the example uses ol→li→a→span, you could as well use something like div→span→a→span. You just have to make sure to use the correct element type.
If you can’t add parent elements to the a elements, it’s still possible to use BreadcrumbList. But then you would have to duplicate the URL with a link element inside the a element.

What should I do with custom elements?

In theory, I could use anything, anywhere and style a <table> into a <ul>. Or style an <imsocool> blue.
<style>
imsocool {
color: blue;
}
<imsocool>HELLO</imsocool>
Sometimes the validator complains (not like I care - it complains about "parse error" when validating calc()s in css), but the browsers never do. The only problem I guess, is that browsers, screen readers, search engines, and everything else don't have any idea what <imsocool>s are. Unknown tags don't have are, well, unknown. So when is this ok?
Is it ok to make special widgets like this (with JS, of course)?
<calendar>
<ctrlgroup>
<ctrl class="left"><-</ctrl>
<ctrl class="left">-></ctrl>
</ctrlgroup>
<week>
<day>1</day><day>2</day><day>3</day><!-- Etc. -->
</week>
</calendar>
Do I need to use dashes? (as the spec says - it's supposed to prevent conflicts with future elements)
<calendar-widget>
<ctrl-group>
<cal-ctrl class="left"><-</cal-ctrl>
<cal-ctrl class="left">-></cal-ctrl>
</ctrl-group>
<calendar-week>
<calendar-day>1</calendar-day><calendar-day>2</calendar-day><calendar-day>3</calendar-day><!-- Etc. -->
</calendar-week>
</calendar-widget>
Or should I not use it at all?
<div class="calendar">
<div class="controls">
<div class="left"><-</div>
<div class="left">-></div>
</div>
<div class="week">
<span class="day">1</span><span class="day">2</span><span class="day">3</span><!-- Etc. -->
</div>
</div>
Ignoring browser support, what are the pros and cons of using unknown HTML elements? When is it appropriate?
What I can think of:
If no element in the spec fits the job good enough, there isn't going to be any semantic meaning lost - <div> doesn't mean any more than <imsocool>.
Classes are annoying.
It's a good idea to use the correct elements, if they exist (like use <em> for emphasis, not <big-and-red>)
Don't abuse existing elements. You shouldn't style a <table> into a <ul> - it'll confuse the robots (browser, accessibility software, google). So don't abuse possible future elements which might conflict?
As with any deviation from a standard in the world of code, any non-standard way of doing things will yield undefined behavior because not every agent will agree on handling the situation the same way.
So, to answer your question, this is only okay if you are okay with having unexpected behavior from the browsers, etc. This means that not everyone that encounters your HTML will have the same experience. That is what following the HTML/CSS standards guarantees.
The examples you have provided actually seem to resemble XML, which gives you more freedom in terms of tag names. You could easily create XML documents with style sheets if that is more suitable for your preferences:
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/css" href="mytest2.css"?>
<people>
<person>
<name status="real">Deron Eriksson</name>
<birthdate>January 22, 1972</birthdate>
<eyes>blue</eyes>
</person>
<person>
<name status="imaginary">Bob Smith</name>
<birthdate>December 25, 1989</birthdate>
<eyes>brown</eyes>
</person>
</people>
Also, there is a standard being developed for custom HTML tags.
There is really no advantage to using custom tags. The only advantage is that it could increase readability, but classes are readable enough.
Here is another stackoverflow question that is similar: Is there a way to create your own html tag in HTML5?

CKEditor 4 and nonstandard HTML element

Here is a nonstandard HTML element that I defined (AngularJS makes this easy):
<exercise id="Sample Exercise" language="Scala" lectureId="5437">
This is the text of the lecture
</exercise>
If I use this element in an HTML document, each time I switch from CKEditor's rendered mode to source mode a new empty paragraph is added between each of the block elements in the document:
<p> </p>
The 2nd time I switch, I get two insertions:
<p> </p>
<p> </p>
The 3rd time I switch, I get three insertions between each block-level element, etc:
<p> </p>
<p> </p>
<p> </p>
Can anyone suggest a workaround?
It seemed easier to avoid custom elements and so I used HTML5 data attributes.
<div class="exercise" data-id="Challenge #42" data-language="Scala" data-lectureid="5437">
<p>Create a program that outputs the meaning of life, the universe, and everything.</p></div>
This worked out. Maybe greater integration between CKEditor and AngularJS will evolve over time.
Pekka's question is very good - why do you need to load a custom element into CKEditor? Neither browsers (which do one part of WYSIWYG editing) not CKEditor (which does another part) know how to handle this element, what it means, how to render it and how editing features should work around it. For example, if I understood your question, you wrote about <exercise> that it is a block element. How do CKEditor and browsers know that it is a block element? :|
Second thing you should understand is that CKEditor is not a WYSIWYG website builder, but a "documents" editor. Its content has to have a meaning for it and that tag won't have it.
Anyway, if you must go this way, there are some things you can do.
Here are two answers that can give you an idea what you can do: CKEditor strips <i> Tag.
If you'll decide not to protect source of your <exercise> tags, but to render them, then you should also know about the CKEDITOR.dtd object, which I described briefly here: ckeditor how to allow for .insertHtml("<customTag myAttr='value'"></customTag>").

Is there a way to create your own html tag in HTML5?

I want to create something like
<menu>
<lunch>
<dish>aaa</dish>
<dish>bbb</dish>
</lunch>
<dinner>
<dish>ccc</dish>
</dinner>
</menu>
Can it be done in HTML5?
I know I can do it with
<ul id="menu">
<li>
<ul id="lunch">
<li class="dish">aaa</li>
<li class="dish">bbb</li>
</ul>
</li>
<li>
<ul id="dinner">
<li class="dish">ccc</li>
</ul>
</li>
</ul>
but it is so much less readable :(
You can use custom tags in browsers, although they won’t be HTML5 (see Are custom elements valid HTML5? and the HTML5 spec).
Let's assume you want to use a custom tag element called <stack>. Here's what you should do...
STEP 1
Normalize its attributes in your CSS Stylesheet (think css reset) -
Example:
stack{display:block;margin:0;padding:0;border:0; ... }
STEP 2
To get it to work in old versions of Internet Explorer, you need to append this script to the head (Important if you need it to work in older versions of IE!):
<!--[if lt IE 9]>
<script> document.createElement("stack"); </script>
<![endif]-->
Then you can use your custom tag freely.
<stack>Overflow</stack>
Feel free to set attributes as well...
<stack id="st2" class="nice"> hello </stack>
I'm not so sure about these answers. As I've just read:
"CUSTOM TAGS HAVE ALWAYS BEEN ALLOWED IN HTML."
http://www.crockford.com/html/
The point here being, that HTML was based on SGML. Unlike XML with its doctypes and schemas, HTML does not become invalid if a browser doesn't know a tag or two. Think of <marquee>. This has not been in the official standard. So while using it made your HTML page "officially unapproved", it didn't break the page either.
Then there is <keygen>, which was Netscape-specific, forgotten in HTML4 and rediscovered and now specified in HTML5.
And also we have custom tag attributes now, like data-XyZzz="..." allowed on all HTML5 tags.
So, while you shouldn't invent a whole custom unspecified markup salad of your own, it's not exactly forbidden to have custom tags in HTML. That is however, unless you want to send it with an +xml Content-Type or embed other XML namespaces, like SVG or MathML. This applies only to SGML-confined HTML.
I just want to add to the previous answers that there is a meaning to use only two-words tags for custom elements.
They should never be standardised.
For example, you want to use the tag <icon>, because you don't like <img>, and you don't like <i> neither...
Well, keep in mind that you're not the only one. Maybe in the future, w3c and/or browsers will specify/implement this tag.
At this time, browsers will probably implements native style for this tag and your website's design may break.
So I'm suggesting to use (according to this example) <img-icon>.
As a matter of fact, the tag <menu> is well defined ie not so used, but defined. It should contain <menuitem> which behave like <li>.
As Michael suggested in the comments, what you want to do is quite possible, but your nomenclature is wrong. You aren't "adding tags to HTML 5," you are creating a new XML document type with your own tags.
I did this for some projects at my last job. Some practical advice:
When you say you want to "add these to HTML 5," I assume what you really mean is that you want the pages to display correctly in a modern browser, without having to do a lot of work on the server side. This can be accomplished by inserting a "stylesheet processing instruction" at the top of the xml file, like <?xml-stylesheet type="text/xsl" href="menu.xsl"?>. Replace "menu.xsl" with the path to the XSL stylesheet that you create to convert your custom tags into HTML.
Caveats: Your file must be a well-formed XML document, complete with XML header <xml version="1.0">. XML is pickier than HTML about things like mismatched tags. Also, unlike HTML, tags are case-sensitive. You must also make sure that the web server is sending the files with the appropriate mime type "application/xml". Often the web server will be configured to do this automatically if the file extension is ".xml", but check.
Big Caveat: Finally, using the browsers' automatic XSL transformation, as I've described, is really best only for debugging and for limited applications where you have a lot of control. I used it successfully in setting up a simple intranet at my last employer, that was accessed only by a few dozen people at most. Not all browsers support XSL, and those that do don't have completely compatible implementations. So if your pages are to be released into the "wild," it's best to transform them all into HTML on the server side, which can be done with a command line tool, or with a button in many XML editors.
Creating your own tag names in HTML is not possible / not valid. That's what XML, SGML and other general markup languages are for.
What you probably want is
<div id="menu">
<div id="lunch">
<span class="dish">aaa</span>
<span class="dish">bbb</span>
</div>
<div id="dinner">
<span class="dish">ccc</span>
</div>
</div>
Or instead of <div/> and <span/> something like <ul/> and <li/>.
In order to make it look and function right, just hook up some CSS and Javascript.
Custom tags can be used in Safari, Chrome, Opera, and Firefox, at least as far as using them in place of "class=..." goes.
green {color: green} in css works for
<green>This is some text.</green>
<head>
<lunch>
<style type="text/css">
lunch{
color:blue;
font-size:32px;
}
</style>
</lunch>
</head>
<body>
<lunch>
This is how you create custom tags like what he is asking for its very simple just do what i wrote it works yeah no js or convoluted work arounds needed this lets you do exactly what he wrote.
</lunch>
</body>
For embedding metadata, you could try using HTML microdata, but it's even more verbose than using class names.
<div itemscope>
<p>My name is <span itemprop="name">Elizabeth</span>.</p>
</div>
<div itemscope>
<p>My name is <span itemprop="name">Daniel</span>.</p>
</div>
Besides writing an XSL stylesheet, as I described earlier, there is another approach, at least if you are certain that Firefox or another full-fledged XML browser will be used (i.e., NOT Internet Explorer). Skip the XSL transform, and write a complete CSS stylesheet that tells the browser how to format the XML directly. The upside here is that you wouldn't have to learn XSL, which many people find to be a difficult and counterintuitive language. The downside is that your CSS will have to specify the styling very completely, including what are block nodes, what are inlines, etc. Usually, when writing CSS, you can assume that the browser "knows" that <em>, for instance, is an inline node, but it won't have any idea what to do with <dish>.
Finally, its been a few years since I tried this, but my recollection is that IE (at least a few versions back) refused to apply CSS stylesheets directly to XML documents.
The point of HTML is that the tags included in the language have an agreed meaning, that everyone in the world can use and base decisions on - like default styling, or making links clickable, or submitting a form when you click on an <input type="submit">.
Made-up tags like yours are great for humans (because we can learn English and thus know, or at least guess, what your tags mean), but not so good for machines.
Polymer or X-tags allow you to build your own html tags. It is based on native browser's "shadow DOM".
In some circumstances, it may look like creating your own tag names just works fine.
However, this is just your browser's error handling routines at work. And the problem is, different browsers have different error handling routines!
See this example.
The first line contains two made-up elements, what and ever, and they get treated differently by different browsers. The text comes out red in IE11 and Edge, but black in other browsers.
For comparison, the second line is similar, except it contains only valid HTML elements, and it will therefore look the same in all browsers.
body {color:black; background:white;} /* reset */
what, ever:nth-of-type(2) {color:red}
code, span:nth-of-type(2) {color:red}
<p><what></what> <ever>test</ever></p>
<p><code></code> <span>test</span></p>
Another problem with made-up elements is that you won't know what the future holds. If you created a website a couple of years ago with tag names like picture, dialog, details, slot, template etc, expecting them to behave like spans, are you in trouble now!
This is not an option in any HTML specification :)
You can probably do what you want with <div> elements and classes, from the question I'm not sure exactly what you're after, but no, creating your own tags is not an option.
As Nick said, custom tags are not supported by any version of HTML.
But, it won't give any error if you use such markup in your HTML.
It seems like you want to create a list. You can use unordered list <ul> to create the rool elements, and use the <li> tag for the items underneath.
If that's not what you want to achieve, please specify exactly what you want. We can come up with an answer then.
You can add custom attribute through HTML 5 data- Attributes.
For example: Message
That is valid for HTML 5. See http://ejohn.org/blog/html-5-data-attributes/ to get details.
You can just do some custom css styling, this will create a tag that will make the background color red:
redback {background-color:red;}
<redback>This is red</redback>
you can use this:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>MyExample</title>
<style>
bloodred {color: red;}
</style>
</head>
<body>
<bloodred>
this is BLOODRED (not to scare you)
</bloodred>
</body>
<script>
var btn = document.createElement("BLOODRED")
</script>
</html>
I found this article on creating custom HTML tags and instantiating them. It simplifies the process and breaks it down into terms anyone can understand and utilize immediately -- but I'm not entirely sure the code samples it contains are valid in all browsers, so caveat emptor and test thoroughly. Nevertheless, it's a great introduction to the subject to get started.
Custom Elements : Defining new elements in HTML