I ended up using the bootstrap 3 dropdown button, I'm posting my solution here in case it helps someone in future. Adding the bootstrap 3 list-inline to the class for the ul causes it to display in a nicely compact format as well.
<div class="btn-group"> <button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown"> Select icon <span class="caret"></span> </button> <ul class="dropdown-menu list-inline" role="menu"> <li><span class="glyphicon glyphicon-cutlery"></span></li> <li><span class="glyphicon glyphicon-fire"></span></li> <li><span class="glyphicon glyphicon-glass"></span></li> <li><span class="glyphicon glyphicon-heart"></span></li> </ul> </div>
I'm using Angular.js so this is the actual code I used:
<div class="btn-group"> <button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown"> Avatar <span class="caret"></span> </button> <ul class="dropdown-menu list-inline" role="menu"> <li ng-repeat="avatar in avatars" ng-click="avatarSelected(avatar)"> <span ng-class="getAvatar(avatar)"></span> </li> </ul> </div>
And in my controller:
$scope.avatars=['cutlery','eye-open','flag','flash','glass','fire','hand-right','heart','heart-empty','leaf','music','send','star','star-empty','tint','tower','tree-conifer','tree-deciduous','usd','user','wrench','time','road','cloud']; $scope.getAvatar=function(avatar){ return 'glyphicon glyphicon-'+avatar; };