From this excellent Introduction to Accessibility page talking about Button vs Link:
Simple set of rules
A link is focusable and can be triggered by the enter key. A link will redirect you to a new page or a section within the same page. In VoiceOver's rotator, it will also be collected within the "Links" window.
A button is focusable, too, and can be triggered by the space key. A button will trigger an action like opening or closing something. Or sending a form. In most cases JavaScript is used to do this. In VoiceOver's rotator, it will be collected within the "Form controls" window. That alone says something.
They also have great embedded youtube video showing how confusing it is for screen-readers when people mix up buttons and links
Where I hit a boundary issue between these two was generating a PDF that would open in a separate tab. It's a button because you generate something, but you generate a download that I wanted to automatically link to in a separate tab so that the web application that generated the PDF stayed in it's own tab.
My decision for this was to use an icon image link.
Update:
CSS Tricks' When To Use The Button Element from another answer here that was deleted because there was nothing but a link. But it is a great link.
So as not to get complaints about just a link, here's some of the useful snippets:
- Button is a Form Element
- “if a button (link) doesn’t have a meaningful href, it’s a
<button>
”
- If you don’t like those meaningless href’s, a
<button>
can seem like a nice alternative. But unfortunately outside of the context of a <form>
, a <button>
is equally meaningless.
- Even if a
<button>
doesn’t do anything outside of a form without the help of JavaScript, it still feels better for things you can click that do stuff other than change pages. A bogus href link definitely doesn’t feel right.
- Go forth and uhm, make clickable things correctly.