HTML Attribute rel Errors using fancyBox

I'm using fancyBox to create a gallery with the following code:

<a class="fancybox" rel="group1" href="img/work/1.jpg"></a>
<a class="fancybox" rel="group1" href="img/work/2.jpg"></a>
<a class="fancybox" rel="group1" href="img/work/3.jpg"><img src="img/th/thumb.jpg" alt="Thumb" /></a>

But I'm getting errors while validating the code. It says:

Bad value group1 for attribute rel on element a: Keyword group1 is not registered.

How do I fix this issue? Am I not writing the code out correctly? I basically wanted one thumbnail, with 3 photos to scroll through.

Thank you.


If you want to have a fancybox gallery within a valid HTML document (just because we are all purists ;) then you need two things:

1: An HTML5 DOCTYPE

<!DOCTYPE html>

2: use the data-fancybox-group attribute rather than the rel attribute like:

<a class="fancybox" data-fancybox-group="group1" href="img/work/1.jpg"></a>

That validates!! ... see sample here

NOTE: this is for fancybox v2.x


How do I fix this issue?

You rewrite the code so it doesn't try to describe the relationship between the current page and the image with the nonsense term "group1".

HTML 5 provides the data-* series of attributes for adding data solely for the purpose of JS. There is no need to hijack rel, which has a defined meaning.


If you are still using fancybox v 1.x (which does not support data-fancybox-group) you can easily modify the script a bit.

You only have to search and replace the "rel" attribute with something else, for instance "data-fancybox-gallery".

When searching for the string "rel" you will find 4 elements. Be carefull only to change the last 3, because the first "rel" you find is part of position:relative.

This is the part you have to change:

        var c = a(this).attr("rel") || "";
        if (!c || c == "" || c === "nofollow") {
            n.push(this)
        } else {
            n = a("a[rel=" + c + "], area[rel=" + c + "]");
            l = n.index(this)
        }

Make it:

        var c = a(this).attr("data-fancybox-gallery") || "";
        if (!c || c == "" || c === "nofollow") {
            n.push(this)
        } else {
            n = a("a[data-fancybox-gallery=" + c + "], area[data-fancybox-gallery=" + c + "]");
            l = n.index(this)
        }

And then your code should be:

    <a class="fancybox" data-fancybox-gallery="group1" href="img/work/1.jpg"></a>
    <a class="fancybox" data-fancybox-gallery="group1" href="img/work/2.jpg"></a>
    <a class="fancybox" data-fancybox-gallery="group1" href="img/work/3.jpg"><img src="img/th/thumb.jpg" alt="Thumb" /></a>

You are getting the validation error because the rel attribute has a list of values that it is expecting (see http://www.w3schools.com/html5/att_a_rel.asp).

There is nothing you can do to fix this, Fancybox is using the attribute for a purpose for which is was not intended. There's nothing wrong with that. Web pages don't have to be 100% 'valid'.


How do I fix this issue?

You don't need to. The range of values that the validator accepts for the rel attribute is limited.

Obviously Fancybox makes use of that attribute in a way that the validator does not appreciate, so it issues a warning an error; but this does not have to concern you.

Am I not writing the code out correctly?

Yes, you are.