button-groups.html 13.8 KB
Newer Older
Mark Otto's avatar
Mark Otto committed
1
2
3
4
5
6
7
8
9
10
<div class="bs-docs-section">
  <h1 id="btn-groups" class="page-header">Button groups</h1>

  <p class="lead">Group a series of buttons together on a single line with the button group. Add on optional JavaScript radio and checkbox style behavior with <a href="../javascript/#buttons">our buttons plugin</a>.</p>

  <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>

11
12
13
14
15
16
17
  <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
18
19
20
  <h3 id="btn-groups-single">Basic example</h3>
  <p>Wrap a series of buttons with <code>.btn</code> in <code>.btn-group</code>.</p>
  <div class="bs-example">
21
    <div class="btn-group" role="group" aria-label="Basic example">
Mark Otto's avatar
Mark Otto committed
22
23
24
25
26
27
      <button type="button" class="btn btn-default">Left</button>
      <button type="button" class="btn btn-default">Middle</button>
      <button type="button" class="btn btn-default">Right</button>
    </div>
  </div>
{% highlight html %}
28
<div class="btn-group" role="group" aria-label="...">
Mark Otto's avatar
Mark Otto committed
29
30
31
32
33
34
35
36
37
  <button type="button" class="btn btn-default">Left</button>
  <button type="button" class="btn btn-default">Middle</button>
  <button type="button" class="btn btn-default">Right</button>
</div>
{% endhighlight %}

  <h3 id="btn-groups-toolbar">Button toolbar</h3>
  <p>Combine sets of <code>&lt;div class="btn-group"&gt;</code> into a <code>&lt;div class="btn-toolbar"&gt;</code> for more complex components.</p>
  <div class="bs-example">
38
39
    <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
40
41
42
43
44
        <button type="button" class="btn btn-default">1</button>
        <button type="button" class="btn btn-default">2</button>
        <button type="button" class="btn btn-default">3</button>
        <button type="button" class="btn btn-default">4</button>
      </div>
45
      <div class="btn-group" role="group" aria-label="Second group">
Mark Otto's avatar
Mark Otto committed
46
47
48
49
        <button type="button" class="btn btn-default">5</button>
        <button type="button" class="btn btn-default">6</button>
        <button type="button" class="btn btn-default">7</button>
      </div>
50
      <div class="btn-group" role="group" aria-label="Third group">
Mark Otto's avatar
Mark Otto committed
51
52
53
54
55
        <button type="button" class="btn btn-default">8</button>
      </div>
    </div>
  </div>
{% highlight html %}
56
57
58
59
<div class="btn-toolbar" role="toolbar" aria-label="...">
  <div class="btn-group" role="group" aria-label="...">...</div>
  <div class="btn-group" role="group" aria-label="...">...</div>
  <div class="btn-group" role="group" aria-label="...">...</div>
Mark Otto's avatar
Mark Otto committed
60
61
62
63
64
65
</div>
{% endhighlight %}

  <h3 id="btn-groups-sizing">Sizing</h3>
  <p>Instead of applying button sizing classes to every button in a group, just add <code>.btn-group-*</code> to the <code>.btn-group</code>.</p>
  <div class="bs-example">
66
67
68
69
    <div class="btn-group btn-group-lg" role="group" aria-label="Large button group">
      <button type="button" class="btn btn-default">Left</button>
      <button type="button" class="btn btn-default">Middle</button>
      <button type="button" class="btn btn-default">Right</button>
Mark Otto's avatar
Mark Otto committed
70
    </div>
71
72
73
74
75
    <br>
    <div class="btn-group" role="group" aria-label="Default button group">
      <button type="button" class="btn btn-default">Left</button>
      <button type="button" class="btn btn-default">Middle</button>
      <button type="button" class="btn btn-default">Right</button>
Mark Otto's avatar
Mark Otto committed
76
    </div>
77
78
79
80
81
    <br>
    <div class="btn-group btn-group-sm" role="group" aria-label="Small button group">
      <button type="button" class="btn btn-default">Left</button>
      <button type="button" class="btn btn-default">Middle</button>
      <button type="button" class="btn btn-default">Right</button>
Mark Otto's avatar
Mark Otto committed
82
    </div>
83
84
85
86
87
    <br>
    <div class="btn-group btn-group-xs" role="group" aria-label="Extra-small button group">
      <button type="button" class="btn btn-default">Left</button>
      <button type="button" class="btn btn-default">Middle</button>
      <button type="button" class="btn btn-default">Right</button>
Mark Otto's avatar
Mark Otto committed
88
89
90
    </div>
  </div>
{% highlight html %}
91
92
93
94
<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
95
96
97
98
99
{% endhighlight %}

  <h3 id="btn-groups-nested">Nesting</h3>
  <p>Place a <code>.btn-group</code> within another <code>.btn-group</code> when you want dropdown menus mixed with a series of buttons.</p>
  <div class="bs-example">
100
    <div class="btn-group" role="group" aria-label="Button group with nested dropdown">
Mark Otto's avatar
Mark Otto committed
101
102
103
      <button type="button" class="btn btn-default">1</button>
      <button type="button" class="btn btn-default">2</button>

104
105
      <div class="btn-group" role="group">
        <button id="btnGroupDrop1" type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown" aria-expanded="false">
Mark Otto's avatar
Mark Otto committed
106
107
108
109
110
111
112
113
114
115
116
          Dropdown
          <span class="caret"></span>
        </button>
        <ul class="dropdown-menu" role="menu" aria-labelledby="btnGroupDrop1">
          <li><a href="#">Dropdown link</a></li>
          <li><a href="#">Dropdown link</a></li>
        </ul>
      </div>
    </div>
  </div>
{% highlight html %}
117
<div class="btn-group" role="group" aria-label="...">
Mark Otto's avatar
Mark Otto committed
118
119
120
  <button type="button" class="btn btn-default">1</button>
  <button type="button" class="btn btn-default">2</button>

121
122
  <div class="btn-group" role="group">
    <button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown" aria-expanded="false">
Mark Otto's avatar
Mark Otto committed
123
124
125
      Dropdown
      <span class="caret"></span>
    </button>
126
    <ul class="dropdown-menu" role="menu">
Mark Otto's avatar
Mark Otto committed
127
128
129
130
131
132
133
134
135
136
      <li><a href="#">Dropdown link</a></li>
      <li><a href="#">Dropdown link</a></li>
    </ul>
  </div>
</div>
{% endhighlight %}

  <h3 id="btn-groups-vertical">Vertical variation</h3>
  <p>Make a set of buttons appear vertically stacked rather than horizontally. <strong class="text-danger">Split button dropdowns are not supported here.</strong></p>
  <div class="bs-example">
137
    <div class="btn-group-vertical" role="group" aria-label="Vertical button group">
Mark Otto's avatar
Mark Otto committed
138
139
      <button type="button" class="btn btn-default">Button</button>
      <button type="button" class="btn btn-default">Button</button>
140
141
      <div class="btn-group" role="group">
        <button id="btnGroupVerticalDrop1" type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown" aria-expanded="false">
Mark Otto's avatar
Mark Otto committed
142
143
144
145
146
147
148
149
150
151
          Dropdown
          <span class="caret"></span>
        </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-default">Button</button>
      <button type="button" class="btn btn-default">Button</button>
152
153
      <div class="btn-group" role="group">
        <button id="btnGroupVerticalDrop2" type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown" aria-expanded="false">
Mark Otto's avatar
Mark Otto committed
154
155
156
157
158
159
160
161
          Dropdown
          <span class="caret"></span>
        </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>
162
163
      <div class="btn-group" role="group">
        <button id="btnGroupVerticalDrop3" type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown" aria-expanded="false">
Mark Otto's avatar
Mark Otto committed
164
165
166
167
168
169
170
171
          Dropdown
          <span class="caret"></span>
        </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>
172
173
      <div class="btn-group" role="group">
        <button id="btnGroupVerticalDrop4" type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown" aria-expanded="false">
Mark Otto's avatar
Mark Otto committed
174
175
176
177
178
179
180
181
182
183
184
          Dropdown
          <span class="caret"></span>
        </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>
      </div>
    </div>
  </div>
{% highlight html %}
185
<div class="btn-group-vertical" role="group" aria-label="...">
Mark Otto's avatar
Mark Otto committed
186
187
188
189
190
191
192
193
194
195
196
197
198
  ...
</div>
{% endhighlight %}

  <h3 id="btn-groups-justified">Justified button groups</h3>
  <p>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.</p>

  <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>
  <div class="bs-callout bs-callout-warning">
    <h4>IE8 and borders</h4>
199
    <p>Internet Explorer 8 doesn't render borders on buttons in a justified button group, whether it's on <code>&lt;a&gt;</code> or <code>&lt;button&gt;</code> elements. To get around that, wrap each button in another <code>.btn-group</code>.</p>
Mark Otto's avatar
Mark Otto committed
200
201
202
203
204
205
    <p>See <a href="https://github.com/twbs/bootstrap/issues/12476">#12476</a> for more information.</p>
  </div>

  <h4>With <code>&lt;a&gt;</code> elements</h4>
  <p>Just wrap a series of <code>.btn</code>s in <code>.btn-group.btn-group-justified</code>.</p>
  <div class="bs-example">
206
    <div class="btn-group btn-group-justified" role="group" aria-label="Justified button group">
207
208
209
      <a href="#" class="btn btn-default" role="button">Left</a>
      <a href="#" class="btn btn-default" role="button">Middle</a>
      <a href="#" class="btn btn-default" role="button">Right</a>
Mark Otto's avatar
Mark Otto committed
210
211
    </div>
    <br>
212
    <div class="btn-group btn-group-justified" role="group" aria-label="Justified button group with nested dropdown">
213
214
      <a href="#" class="btn btn-default" role="button">Left</a>
      <a href="#" class="btn btn-default" role="button">Middle</a>
215
216
      <div class="btn-group" role="group">
        <a href="#" class="btn btn-default dropdown-toggle" data-toggle="dropdown" role="button" aria-expanded="false">
Mark Otto's avatar
Mark Otto committed
217
218
219
220
221
222
223
224
225
226
227
228
229
          Dropdown <span class="caret"></span>
        </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>
      </div>
    </div>
  </div>
{% highlight html %}
230
<div class="btn-group btn-group-justified" role="group" aria-label="...">
Mark Otto's avatar
Mark Otto committed
231
232
233
234
  ...
</div>
{% endhighlight %}

235
236
237
238
239
  <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>
  </div>

Mark Otto's avatar
Mark Otto committed
240
  <h4>With <code>&lt;button&gt;</code> elements</h4>
241
  <p>To use justified button groups with <code>&lt;button&gt;</code> elements, <strong class="text-danger">you must wrap each button in a button group</strong>. Most browsers don't properly apply our CSS for justification to <code>&lt;button&gt;</code> elements, but since we support button dropdowns, we can work around that.</p>
Mark Otto's avatar
Mark Otto committed
242
  <div class="bs-example">
243
244
    <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
245
246
        <button type="button" class="btn btn-default">Left</button>
      </div>
247
      <div class="btn-group" role="group">
Mark Otto's avatar
Mark Otto committed
248
249
        <button type="button" class="btn btn-default">Middle</button>
      </div>
250
      <div class="btn-group" role="group">
Mark Otto's avatar
Mark Otto committed
251
252
253
254
255
        <button type="button" class="btn btn-default">Right</button>
      </div>
    </div>
  </div>
{% highlight html %}
256
257
<div class="btn-group btn-group-justified" role="group" aria-label="...">
  <div class="btn-group" role="group">
Mark Otto's avatar
Mark Otto committed
258
259
    <button type="button" class="btn btn-default">Left</button>
  </div>
260
  <div class="btn-group" role="group">
Mark Otto's avatar
Mark Otto committed
261
262
    <button type="button" class="btn btn-default">Middle</button>
  </div>
263
  <div class="btn-group" role="group">
Mark Otto's avatar
Mark Otto committed
264
265
266
267
268
    <button type="button" class="btn btn-default">Right</button>
  </div>
</div>
{% endhighlight %}
</div>