button-group.md 10.5 KB
Newer Older
Mark Otto's avatar
Mark Otto committed
1
2
3
4
5
---
layout: page
title: Button group
---

Mark Otto's avatar
Mark Otto committed
6
Group a series of buttons together on a single line with the button group. Add on optional JavaScript radio and checkbox style behavior with [our buttons plugin](../javascript/#buttons).
Mark Otto's avatar
Mark Otto committed
7

Mark Otto's avatar
Mark Otto committed
8
9
10
11
<div class="bs-callout bs-callout-warning">
  <h4>Tooltips &amp; popovers in button groups require special setting</h4>
  <p>When using tooltips or popovers on elements within a <code>.btn-group</code>, you'll have to specify the option <code>container: 'body'</code> to avoid unwanted side effects (such as the element growing wider and/or losing its rounded corners when the tooltip or popover is triggered).</p>
</div>
Mark Otto's avatar
Mark Otto committed
12

Mark Otto's avatar
Mark Otto committed
13
14
15
16
17
18
19
<div class="bs-callout bs-callout-warning">
  <h4>Ensure correct <code>role</code> and provide a label</h4>
  <p>In order for assistive technologies – such as screen readers – to convey that a series of buttons is grouped, an appropriate <code>role</code> attribute needs to be provided. For button groups, this would be <code>role="group"</code>, while toolbars should have a <code>role="toolbar"</code>.</p>
  <p>One exception are groups which only contain a single control (for instance the <a href="#btn-groups-justified">justified button groups</a> with <code>&lt;button&gt;</code> elements) or a dropdown.</p>
  <p>In addition, groups and toolbars should be given an explicit label, as most assistive technologies will otherwise not announce them, despite the presence of the correct <code>role</code> attribute. In the examples provided here, we use <code>aria-label</code>, but alternatives such as <code>aria-labelledby</code> can also be used.</p>
</div>

Mark Otto's avatar
Mark Otto committed
20
### Basic example
Mark Otto's avatar
Mark Otto committed
21

Mark Otto's avatar
Mark Otto committed
22
23
24
Wrap a series of buttons with `.btn` in `.btn-group`.

{% example html %}
Mark Otto's avatar
Mark Otto committed
25
<div class="btn-group" role="group" aria-label="Basic example">
Mark Otto's avatar
Mark Otto committed
26
27
28
  <button type="button" class="btn btn-secondary">Left</button>
  <button type="button" class="btn btn-secondary">Middle</button>
  <button type="button" class="btn btn-secondary">Right</button>
Mark Otto's avatar
Mark Otto committed
29
</div>
Mark Otto's avatar
Mark Otto committed
30
{% endexample %}
Mark Otto's avatar
Mark Otto committed
31

Mark Otto's avatar
Mark Otto committed
32
33
34
35
36
### Button toolbar

Combine sets of button groups into button toolbars for more complex components.

{% example html %}
Mark Otto's avatar
Mark Otto committed
37
38
<div class="btn-toolbar" role="toolbar" aria-label="Toolbar with button groups">
  <div class="btn-group" role="group" aria-label="First group">
Mark Otto's avatar
Mark Otto committed
39
40
41
42
43
    <button type="button" class="btn btn-secondary">1</button>
    <button type="button" class="btn btn-secondary">2</button>
    <button type="button" class="btn btn-secondary">3</button>
    <button type="button" class="btn btn-secondary">4</button>
  </div>
Mark Otto's avatar
Mark Otto committed
44
  <div class="btn-group" role="group" aria-label="Second group">
Mark Otto's avatar
Mark Otto committed
45
46
47
48
    <button type="button" class="btn btn-secondary">5</button>
    <button type="button" class="btn btn-secondary">6</button>
    <button type="button" class="btn btn-secondary">7</button>
  </div>
Mark Otto's avatar
Mark Otto committed
49
  <div class="btn-group" role="group" aria-label="Third group">
Mark Otto's avatar
Mark Otto committed
50
51
    <button type="button" class="btn btn-secondary">8</button>
  </div>
Mark Otto's avatar
Mark Otto committed
52
</div>
Mark Otto's avatar
Mark Otto committed
53
54
55
56
57
{% endexample %}

### Sizing

Instead of applying button sizing classes to every button in a group, just add `.btn-group-*` to the `.btn-group`.
Mark Otto's avatar
Mark Otto committed
58

Mark Otto's avatar
Mark Otto committed
59
<div class="bs-example">
Mark Otto's avatar
Mark Otto committed
60
61
62
63
  <div class="btn-group btn-group-lg" role="group" aria-label="Large button group">
    <button type="button" class="btn btn-secondary">Left</button>
    <button type="button" class="btn btn-secondary">Middle</button>
    <button type="button" class="btn btn-secondary">Right</button>
Mark Otto's avatar
Mark Otto committed
64
  </div>
Mark Otto's avatar
Mark Otto committed
65
66
67
68
69
  <br>
  <div class="btn-group" role="group" aria-label="Default button group">
    <button type="button" class="btn btn-secondary">Left</button>
    <button type="button" class="btn btn-secondary">Middle</button>
    <button type="button" class="btn btn-secondary">Right</button>
Mark Otto's avatar
Mark Otto committed
70
  </div>
Mark Otto's avatar
Mark Otto committed
71
72
73
74
75
  <br>
  <div class="btn-group btn-group-sm" role="group" aria-label="Small button group">
    <button type="button" class="btn btn-secondary">Left</button>
    <button type="button" class="btn btn-secondary">Middle</button>
    <button type="button" class="btn btn-secondary">Right</button>
Mark Otto's avatar
Mark Otto committed
76
  </div>
Mark Otto's avatar
Mark Otto committed
77
78
79
80
81
  <br>
  <div class="btn-group btn-group-xs" role="group" aria-label="Extra small button group">
    <button type="button" class="btn btn-secondary">Left</button>
    <button type="button" class="btn btn-secondary">Middle</button>
    <button type="button" class="btn btn-secondary">Right</button>
Mark Otto's avatar
Mark Otto committed
82
  </div>
Mark Otto's avatar
Mark Otto committed
83
84
</div>

Mark Otto's avatar
Mark Otto committed
85
{% highlight html %}
Mark Otto's avatar
Mark Otto committed
86
87
88
89
<div class="btn-group btn-group-lg" role="group" aria-label="...">...</div>
<div class="btn-group" role="group" aria-label="...">...</div>
<div class="btn-group btn-group-sm" role="group" aria-label="...">...</div>
<div class="btn-group btn-group-xs" role="group" aria-label="...">...</div>
Mark Otto's avatar
Mark Otto committed
90
91
{% endhighlight %}

Mark Otto's avatar
Mark Otto committed
92
### Nesting
Mark Otto's avatar
Mark Otto committed
93

Mark Otto's avatar
Mark Otto committed
94
95
96
Place a `.btn-group` within another `.btn-group` when you want dropdown menus mixed with a series of buttons.

{% example html %}
Mark Otto's avatar
Mark Otto committed
97
<div class="btn-group" role="group" aria-label="Button group with nested dropdown">
Mark Otto's avatar
Mark Otto committed
98
99
  <button type="button" class="btn btn-secondary">1</button>
  <button type="button" class="btn btn-secondary">2</button>
Mark Otto's avatar
Mark Otto committed
100

Mark Otto's avatar
Mark Otto committed
101
102
  <div class="btn-group" role="group">
    <button id="btnGroupDrop1" type="button" class="btn btn-secondary dropdown-toggle" data-toggle="dropdown" aria-expanded="false">
Mark Otto's avatar
Mark Otto committed
103
104
      Dropdown
    </button>
Mark Otto's avatar
Mark Otto committed
105
    <ul class="dropdown-menu" role="menu" aria-labelledby="btnGroupDrop1">
Mark Otto's avatar
Mark Otto committed
106
107
108
109
110
      <li><a href="#">Dropdown link</a></li>
      <li><a href="#">Dropdown link</a></li>
    </ul>
  </div>
</div>
Mark Otto's avatar
Mark Otto committed
111
{% endexample %}
Mark Otto's avatar
Mark Otto committed
112

Mark Otto's avatar
Mark Otto committed
113
114
115
116
117
### Vertical variation

Make a set of buttons appear vertically stacked rather than horizontally. **Split button dropdowns are not supported here.**

<div class="bs-example">
Mark Otto's avatar
Mark Otto committed
118
  <div class="btn-group-vertical" role="group" aria-label="Vertical button group">
Mark Otto's avatar
Mark Otto committed
119
120
    <button type="button" class="btn btn-secondary">Button</button>
    <button type="button" class="btn btn-secondary">Button</button>
Mark Otto's avatar
Mark Otto committed
121
122
    <div class="btn-group" role="group">
      <button id="btnGroupVerticalDrop1" type="button" class="btn btn-secondary dropdown-toggle" data-toggle="dropdown" aria-expanded="false">
Mark Otto's avatar
Mark Otto committed
123
124
125
126
127
128
129
130
131
        Dropdown
      </button>
      <ul class="dropdown-menu" role="menu" aria-labelledby="btnGroupVerticalDrop1">
        <li><a href="#">Dropdown link</a></li>
        <li><a href="#">Dropdown link</a></li>
      </ul>
    </div>
    <button type="button" class="btn btn-secondary">Button</button>
    <button type="button" class="btn btn-secondary">Button</button>
Mark Otto's avatar
Mark Otto committed
132
133
    <div class="btn-group" role="group">
      <button id="btnGroupVerticalDrop2" type="button" class="btn btn-secondary dropdown-toggle" data-toggle="dropdown" aria-expanded="false">
Mark Otto's avatar
Mark Otto committed
134
135
136
137
138
139
140
        Dropdown
      </button>
      <ul class="dropdown-menu" role="menu" aria-labelledby="btnGroupVerticalDrop2">
        <li><a href="#">Dropdown link</a></li>
        <li><a href="#">Dropdown link</a></li>
      </ul>
    </div>
Mark Otto's avatar
Mark Otto committed
141
142
    <div class="btn-group" role="group">
      <button id="btnGroupVerticalDrop3" type="button" class="btn btn-secondary dropdown-toggle" data-toggle="dropdown" aria-expanded="false">
Mark Otto's avatar
Mark Otto committed
143
144
145
146
147
148
149
        Dropdown
      </button>
      <ul class="dropdown-menu" role="menu" aria-labelledby="btnGroupVerticalDrop3">
        <li><a href="#">Dropdown link</a></li>
        <li><a href="#">Dropdown link</a></li>
      </ul>
    </div>
Mark Otto's avatar
Mark Otto committed
150
151
    <div class="btn-group" role="group">
      <button id="btnGroupVerticalDrop4" type="button" class="btn btn-secondary dropdown-toggle" data-toggle="dropdown" aria-expanded="false">
Mark Otto's avatar
Mark Otto committed
152
153
154
155
156
157
        Dropdown
      </button>
      <ul class="dropdown-menu" role="menu" aria-labelledby="btnGroupVerticalDrop4">
        <li><a href="#">Dropdown link</a></li>
        <li><a href="#">Dropdown link</a></li>
      </ul>
Mark Otto's avatar
Mark Otto committed
158
159
    </div>
  </div>
Mark Otto's avatar
Mark Otto committed
160
161
</div>

Mark Otto's avatar
Mark Otto committed
162
163
164
165
166
167
{% highlight html %}
<div class="btn-group-vertical">
  ...
</div>
{% endhighlight %}

Mark Otto's avatar
Mark Otto committed
168
### Justified button groups
Mark Otto's avatar
Mark Otto committed
169

Mark Otto's avatar
Mark Otto committed
170
Make a group of buttons stretch at equal sizes to span the entire width of its parent. Also works with button dropdowns within the button group.
Mark Otto's avatar
Mark Otto committed
171

Mark Otto's avatar
Mark Otto committed
172
173
174
175
176
177
178
179
180
<div class="bs-callout bs-callout-warning">
  <h4>Handling borders</h4>
  <p>Due to the specific HTML and CSS used to justify buttons (namely <code>display: table-cell</code>), the borders between them are doubled. In regular button groups, <code>margin-left: -1px</code> is used to stack the borders instead of removing them. However, <code>margin</code> doesn't work with <code>display: table-cell</code>. As a result, depending on your customizations to Bootstrap, you may wish to remove or re-color the borders.</p>
</div>

#### With `<a>` elements

Just wrap a series of `.btn`s in `.btn-group.btn-group-justified`.

Mark Otto's avatar
Mark Otto committed
181
{% example html %}
Mark Otto's avatar
Mark Otto committed
182
<div class="bs-example">
Mark Otto's avatar
Mark Otto committed
183
  <div class="btn-group btn-group-justified" role="group" aria-label="Justified button group">
Mark Otto's avatar
Mark Otto committed
184
185
186
    <a class="btn btn-secondary" href="#" role="button">Left</a>
    <a class="btn btn-secondary" href="#" role="button">Middle</a>
    <a class="btn btn-secondary" href="#" role="button">Right</a>
Mark Otto's avatar
Mark Otto committed
187
188
  </div>
  <br>
Mark Otto's avatar
Mark Otto committed
189
  <div class="btn-group btn-group-justified" role="group" aria-label="Justified button group with nested dropdown">
Mark Otto's avatar
Mark Otto committed
190
191
    <a class="btn btn-secondary" href="#" role="button">Left</a>
    <a class="btn btn-secondary" href="#" role="button">Middle</a>
Mark Otto's avatar
Mark Otto committed
192
193
    <div class="btn-group" role="group">
      <a class="btn btn-secondary dropdown-toggle" href="#" data-toggle="dropdown"role="button" aria-expanded="false">
Mark Otto's avatar
Mark Otto committed
194
195
196
197
198
199
200
201
202
        Dropdown
      </a>
      <ul class="dropdown-menu" role="menu">
        <li><a href="#">Action</a></li>
        <li><a href="#">Another action</a></li>
        <li><a href="#">Something else here</a></li>
        <li class="divider"></li>
        <li><a href="#">Separated link</a></li>
      </ul>
Mark Otto's avatar
Mark Otto committed
203
204
    </div>
  </div>
Mark Otto's avatar
Mark Otto committed
205
</div>
Mark Otto's avatar
Mark Otto committed
206
{% endexample %}
Mark Otto's avatar
Mark Otto committed
207

Mark Otto's avatar
Mark Otto committed
208
209
210
<div class="bs-callout bs-callout-warning">
  <h4>Links acting as buttons</h4>
  <p>If the <code>&lt;a&gt;</code> elements are used to act as buttons – triggering in-page functionality, rather than navigating to another document or section within the current page – they should also be given an appropriate <code>role="button"</code>.</p>
Mark Otto's avatar
Mark Otto committed
211
212
</div>

Mark Otto's avatar
Mark Otto committed
213
214
#### With `<button>` elements

Mark Otto's avatar
Mark Otto committed
215
To use justified button groups with `<button>` elements, **you must wrap each button in a button group**. Most browsers don't properly apply our CSS for justification to `<button>` elements, but since we support button dropdowns, we can work around that.
Mark Otto's avatar
Mark Otto committed
216

Mark Otto's avatar
Mark Otto committed
217
{% example html %}
Mark Otto's avatar
Mark Otto committed
218
<div class="bs-example">
Mark Otto's avatar
Mark Otto committed
219
220
  <div class="btn-group btn-group-justified" role="group" aria-label="Justified button group">
    <div class="btn-group" role="group">
Mark Otto's avatar
Mark Otto committed
221
222
      <button type="button" class="btn btn-secondary">Left</button>
    </div>
Mark Otto's avatar
Mark Otto committed
223
    <div class="btn-group" role="group">
Mark Otto's avatar
Mark Otto committed
224
225
      <button type="button" class="btn btn-secondary">Middle</button>
    </div>
Mark Otto's avatar
Mark Otto committed
226
    <div class="btn-group" role="group">
Mark Otto's avatar
Mark Otto committed
227
      <button type="button" class="btn btn-secondary">Right</button>
Mark Otto's avatar
Mark Otto committed
228
229
    </div>
  </div>
Mark Otto's avatar
Mark Otto committed
230
</div>
Mark Otto's avatar
Mark Otto committed
231
{% endexample %}