The solution is to build your own button component, using an Aura.action attribute :)
Generic component Button:
<aura:component>
<aura:attribute name="press" type="Aura.Action" access="global" description="JS controller action to perform when button pressed"/>
<aura:attribute name="value" type="String" access="global" description="Button value"/>
<button onclick="{!v.press}" value="{!v.value}">
<!-- manage your styles here with some input parameters -->
</button>
</aura:component>
Then u can call it like that from any component:
<c:Button value="yourvaluehere" press="{!c.onPushTheButton}" />
Js to get the value from any component controller :
onPushTheButton : function(component, event, helper) {
var Val = event.target.value;
// You'll get 'yourvaluehere' in Val, do whatever u need with it :)
}
You could also create a Facet component
<aura:component>
<aura:attribute name="press" type="Aura.Action" access="global" description="JS controller action to perform when button pressed"/>
<aura:attribute name="value" type="String" access="global" description="Button value"/>
<span onclick="{!v.press}" value="{!v.value}">
{!v.body}
</span>
</aura:component>
that you would call like
<c:Button value="yourvaluehere" press="{!c.onPushTheButton}">
<p style="background-color:green;">MyButton,images,whatever u want</p>
</c:Button>