跳到主要内容

在表单、模态框等中使用 Bootstrap 的自定义按钮样式,支持多种尺寸、状态等。

基类

Bootstrap 有一个基础 .btn 类,它设置了基本样式,例如内边距和内容对齐。默认情况下,.btn 控件具有透明的边框和背景颜色,并且缺少任何明确的焦点和悬停样式。

HTML
<button type="button" class="btn">Base class</button>

.btn 类旨在与我们的按钮变体一起使用,或作为你自定义样式的基础。

如果你单独使用 .btn 类,请记得至少定义一些明确的 :focus 和/或 :focus-visible 样式。

变体

Bootstrap 包含几种按钮变体,每种都有其自己的语义用途,还额外提供了一些按钮以获得更多控制。

HTML
<button type="button" class="btn btn-primary">Primary</button>
<button type="button" class="btn btn-secondary">Secondary</button>
<button type="button" class="btn btn-success">Success</button>
<button type="button" class="btn btn-danger">Danger</button>
<button type="button" class="btn btn-warning">Warning</button>
<button type="button" class="btn btn-info">Info</button>
<button type="button" class="btn btn-light">Light</button>
<button type="button" class="btn btn-dark">Dark</button>

<button type="button" class="btn btn-link">Link</button>

无障碍提示:仅使用颜色来增加意义只提供视觉提示,这对于使用辅助技术(如屏幕阅读器)的用户是无法传达的。请确保意义本身在内容中就显而易见(例如,可见文本通过 足够的颜色对比)或者通过其他方式包含,例如使用 .visually-hidden 类隐藏的额外文本。

禁用文本换行

如果你不希望按钮文字换行,可以将 .text-nowrap 类添加到按钮。在 Sass 中,你可以设置 $btn-white-space: nowrap 来禁用每个按钮的文字换行。

按钮标签

.btn 类是为与 <button> 元素一起使用而设计的。然而,你也可以在 <a> 或 <input> 元素上使用这些类(尽管某些浏览器可能会应用稍微不同的渲染)。

当在用于触发页面内功能(例如折叠内容)的<a>元素上使用按钮类时,而不是链接到新页面或当前页面内的部分,这些链接应被赋予role="button",以便向屏幕阅读器等辅助技术适当地传达其用途。

链接
HTML
<a class="btn btn-primary" href="#" role="button">Link</a>
<button class="btn btn-primary" type="submit">Button</button>
<input class="btn btn-primary" type="button" value="Input">
<input class="btn btn-primary" type="submit" value="Submit">
<input class="btn btn-primary" type="reset" value="Reset">

轮廓按钮

需要一个按钮,但不想要它们带来的沉重背景颜色?将默认的修饰类替换为.btn-outline-*类,以移除任何按钮上的所有背景图像和颜色。

HTML
<button type="button" class="btn btn-outline-primary">Primary</button>
<button type="button" class="btn btn-outline-secondary">Secondary</button>
<button type="button" class="btn btn-outline-success">Success</button>
<button type="button" class="btn btn-outline-danger">Danger</button>
<button type="button" class="btn btn-outline-warning">Warning</button>
<button type="button" class="btn btn-outline-info">Info</button>
<button type="button" class="btn btn-outline-light">Light</button>
<button type="button" class="btn btn-outline-dark">Dark</button>

一些按钮样式使用了相对较浅的前景色,应仅在深色背景上使用,以确保有足够的对比度。

尺寸

想要更大或更小的按钮吗?添加 .btn-lg 或 .btn-sm 以获得其他尺寸。

HTML
<button type="button" class="btn btn-primary btn-lg">Large button</button>
<button type="button" class="btn btn-secondary btn-lg">Large button</button>
HTML
<button type="button" class="btn btn-primary btn-sm">Small button</button>
<button type="button" class="btn btn-secondary btn-sm">Small button</button>

你甚至可以使用 CSS 变量自定义自己的尺寸:

HTML
<button type="button" class="btn btn-primary"
        style="--bs-btn-padding-y: .25rem; --bs-btn-padding-x: .5rem; --bs-btn-font-size: .75rem;">
  Custom button
</button>

禁用状态

通过添加使按钮看起来不活跃 disabled 布尔属性为任何 <button> 元素。禁用的按钮有 pointer-events: none 应用于,防止悬停和活动状态触发。

HTML
<button type="button" class="btn btn-primary" disabled>Primary button</button>
<button type="button" class="btn btn-secondary" disabled>Button</button>
<button type="button" class="btn btn-outline-primary" disabled>Primary button</button>
<button type="button" class="btn btn-outline-secondary" disabled>Button</button>

使用 <a> 元素的禁用按钮行为略有不同:

  • <a> 不支持 disabled 属性,因此你必须添加 .disabled 类以使其在视觉上显示为禁用状态。
  • 包含一些面向未来的样式,以禁用锚按钮上的所有 pointer-events。
  • 使用 <a> 的禁用按钮应包含 aria-disabled="true" 属性,以向辅助技术指示元素的状态。
  • 使用 <a> 的禁用按钮 不应 包含 href 属性。
HTML
<a class="btn btn-primary disabled" role="button" aria-disabled="true">Primary link</a>
<a class="btn btn-secondary disabled" role="button" aria-disabled="true">Link</a>

为了处理必须在禁用链接上保留href属性的情况,.disabled类使用pointer-events: none尝试禁用<a>的链接功能。请注意,这个CSS属性尚未在HTML中标准化,但所有现代浏览器都支持它。此外,即使在支持pointer-events: none的浏览器中,键盘导航仍不受影响,这意味着有视力的键盘用户和辅助技术用户仍然能够激活这些链接。因此,为了安全起见,除了aria-disabled="true"之外,还应在这些链接上包含tabindex="-1"属性,以防止它们获得键盘焦点,并使用自定义JavaScript完全禁用其功能。

HTML
<a href="#" class="btn btn-primary disabled" tabindex="-1" role="button" aria-disabled="true">Primary link</a>
<a href="#" class="btn btn-secondary disabled" tabindex="-1" role="button" aria-disabled="true">Link</a>

块按钮

创建响应式的全宽“块按钮”堆栈,类似于 Bootstrap 4 中的按钮堆栈,并结合我们的显示和间距工具类。通过使用工具类而不是按钮专用类,我们可以对间距、对齐和响应行为进行更大的控制。

HTML
<div class="d-grid gap-2">
  <button class="btn btn-primary" type="button">Button</button>
  <button class="btn btn-primary" type="button">Button</button>
</div>

在这里,我们创建了一个响应式变体,从垂直堆叠的按钮开始,直到md断点,此时.d-md-block替换了.d-grid类,从而使gap-2工具无效。调整浏览器大小查看它们的变化。

HTML
<div class="d-grid gap-2 d-md-block">
  <button class="btn btn-primary" type="button">Button</button>
  <button class="btn btn-primary" type="button">Button</button>
</div>

你可以使用网格列宽类来调整块按钮的宽度。例如,对于半宽的“块按钮”,使用.col-6。也可以使用.mx-auto将其水平居中。

HTML
<div class="d-grid gap-2 col-6 mx-auto">
  <button class="btn btn-primary" type="button">Button</button>
  <button class="btn btn-primary" type="button">Button</button>
</div>

可以使用额外的工具类来调整按钮横向排列时的对齐方式。在这里,我们使用了之前的响应式示例,并在按钮上添加了一些 flex 工具类和一个 margin 工具类,以便在按钮不再堆叠时将其右对齐。

HTML
<div class="d-grid gap-2 d-md-flex justify-content-md-end">
  <button class="btn btn-primary me-md-2" type="button">Button</button>
  <button class="btn btn-primary" type="button">Button</button>
</div>

按钮插件

按钮插件允许你创建简单的开/关切换按钮。

在视觉上,这些切换按钮与复选框切换按钮完全相同。然而,辅助技术的呈现方式不同:复选框切换按钮会被屏幕阅读器宣布为“已选中/未选中”(因为尽管外观如此,它们本质上仍然是复选框),而这些切换按钮会被宣布为“按钮/按钮已按下”。选择这两种方法中的哪一种取决于你创建的切换类型,以及当以复选框或实际按钮的方式宣布时,该切换是否对用户有意义。

切换状态

添加 data-bs-toggle="button" 以切换按钮的 active 状态。如果你在预切换按钮,则必须手动添加 .active 类 和 aria-pressed="true",以确保它能被辅助技术适当地传达。

HTML
<p class="d-inline-flex gap-1">
  <button type="button" class="btn" data-bs-toggle="button">Toggle button</button>
  <button type="button" class="btn active" data-bs-toggle="button" aria-pressed="true">Active toggle button</button>
  <button type="button" class="btn" disabled data-bs-toggle="button">Disabled toggle button</button>
</p>
<p class="d-inline-flex gap-1">
  <button type="button" class="btn btn-primary" data-bs-toggle="button">Toggle button</button>
  <button type="button" class="btn btn-primary active" data-bs-toggle="button" aria-pressed="true">Active toggle button</button>
  <button type="button" class="btn btn-primary" disabled data-bs-toggle="button">Disabled toggle button</button>
</p>
HTML
<p class="d-inline-flex gap-1">
  <a href="#" class="btn" role="button" data-bs-toggle="button">Toggle link</a>
  <a href="#" class="btn active" role="button" data-bs-toggle="button" aria-pressed="true">Active toggle link</a>
  <a class="btn disabled" aria-disabled="true" role="button" data-bs-toggle="button">Disabled toggle link</a>
</p>
<p class="d-inline-flex gap-1">
  <a href="#" class="btn btn-primary" role="button" data-bs-toggle="button">Toggle link</a>
  <a href="#" class="btn btn-primary active" role="button" data-bs-toggle="button" aria-pressed="true">Active toggle link</a>
  <a class="btn btn-primary disabled" aria-disabled="true" role="button" data-bs-toggle="button">Disabled toggle link</a>
</p>

方法

你可以使用按钮构造函数创建一个按钮实例,例如:

const bsButton = new bootstrap.Button('#myButton')
方法描述
dispose销毁元素的按钮。(移除存储在DOM元素上的数据)
getInstance静态方法,可以获取与DOM元素关联的按钮实例,你可以这样使用它:bootstrap.Button.getInstance(element)。
getOrCreateInstance静态方法,返回与DOM元素关联的按钮实例,如果尚未初始化则创建一个新的。你可以这样使用它:bootstrap.Button.getOrCreateInstance(element)。
toggle切换按压状态。使按钮呈现出已被激活的外观。

例如,切换所有按钮

document.querySelectorAll('.btn').forEach(buttonElement => {
  const button = bootstrap.Button.getOrCreateInstance(buttonElement)
  button.toggle()
})

CSS

变量

在 v5.2.0 中添加

作为 Bootstrap 不断发展的 CSS 变量方法的一部分,按钮现在在 .btn 上使用本地 CSS 变量,以增强实时自定义功能。CSS 变量的值通过 Sass 设置,因此仍然支持 Sass 自定义。

--#{$prefix}btn-padding-x: #{$btn-padding-x};
--#{$prefix}btn-padding-y: #{$btn-padding-y};
--#{$prefix}btn-font-family: #{$btn-font-family};
@include rfs($btn-font-size, --#{$prefix}btn-font-size);
--#{$prefix}btn-font-weight: #{$btn-font-weight};
--#{$prefix}btn-line-height: #{$btn-line-height};
--#{$prefix}btn-color: #{$btn-color};
--#{$prefix}btn-bg: transparent;
--#{$prefix}btn-border-width: #{$btn-border-width};
--#{$prefix}btn-border-color: transparent;
--#{$prefix}btn-border-radius: #{$btn-border-radius};
--#{$prefix}btn-hover-border-color: transparent;
--#{$prefix}btn-box-shadow: #{$btn-box-shadow};
--#{$prefix}btn-disabled-opacity: #{$btn-disabled-opacity};
--#{$prefix}btn-focus-box-shadow: 0 0 0 #{$btn-focus-width} rgba(var(--#{$prefix}btn-focus-shadow-rgb), .5);

每个 .btn-* 修饰类都会更新相应的 CSS 变量,以使用我们的 button-variant()、button-outline-variant() 和 button-size() mixin来最小化额外的 CSS 规则。

这是一个构建自定义.btn-*修饰符类的示例,就像我们为文档中特有的按钮所做的那样,通过重新分配 Bootstrap 的 CSS 变量,并混合使用我们自己的 CSS 和 Sass 变量。

.btn-bd-primary {
  --bs-btn-font-weight: 600;
  --bs-btn-color: var(--bs-white);
  --bs-btn-bg: var(--bd-violet-bg);
  --bs-btn-border-color: var(--bd-violet-bg);
  --bs-btn-hover-color: var(--bs-white);
  --bs-btn-hover-bg: #{shade-color($bd-violet, 10%)};
  --bs-btn-hover-border-color: #{shade-color($bd-violet, 10%)};
  --bs-btn-focus-shadow-rgb: var(--bd-violet-rgb);
  --bs-btn-active-color: var(--bs-btn-hover-color);
  --bs-btn-active-bg: #{shade-color($bd-violet, 20%)};
  --bs-btn-active-border-color: #{shade-color($bd-violet, 20%)};
}

Sass 变量

$btn-color:                   var(--#{$prefix}body-color);
$btn-padding-y:               $input-btn-padding-y;
$btn-padding-x:               $input-btn-padding-x;
$btn-font-family:             $input-btn-font-family;
$btn-font-size:               $input-btn-font-size;
$btn-line-height:             $input-btn-line-height;
$btn-white-space:             null; // Set to `nowrap` to prevent text wrapping

$btn-padding-y-sm: $input-btn-padding-y-sm; $btn-padding-x-sm: $input-btn-padding-x-sm; $btn-font-size-sm: $input-btn-font-size-sm;

$btn-padding-y-lg: $input-btn-padding-y-lg; $btn-padding-x-lg: $input-btn-padding-x-lg; $btn-font-size-lg: $input-btn-font-size-lg;

$btn-border-width: $input-btn-border-width;

$btn-font-weight: $font-weight-normal; $btn-box-shadow: inset 0 1px 0 rgba($white, .15), 0 1px 1px rgba($black, .075); $btn-focus-width: $input-btn-focus-width; $btn-focus-box-shadow: $input-btn-focus-box-shadow; $btn-disabled-opacity: .65; $btn-active-box-shadow: inset 0 3px 5px rgba($black, .125);

$btn-link-color: var(--#{$prefix}link-color); $btn-link-hover-color: var(--#{$prefix}link-hover-color); $btn-link-disabled-color: $gray-600; $btn-link-focus-shadow-rgb: to-rgb(mix(color-contrast($link-color), $link-color, 15%));

// Allows for customizing button radius independently from global border radius $btn-border-radius: var(--#{$prefix}border-radius); $btn-border-radius-sm: var(--#{$prefix}border-radius-sm); $btn-border-radius-lg: var(--#{$prefix}border-radius-lg);

$btn-transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out;

$btn-hover-bg-shade-amount: 15%; $btn-hover-bg-tint-amount: 15%; $btn-hover-border-shade-amount: 20%; $btn-hover-border-tint-amount: 10%; $btn-active-bg-shade-amount: 20%; $btn-active-bg-tint-amount: 20%; $btn-active-border-shade-amount: 25%; $btn-active-border-tint-amount: 10%;

Sass mixin

按钮有三个mixin:按钮和按钮轮廓变体mixin(两者都基于$theme-colors),此外还有一个按钮大小mixin。

@mixin button-variant(
  $background,
  $border,
  $color: color-contrast($background),
  $hover-background: if($color == $color-contrast-light, shade-color($background, $btn-hover-bg-shade-amount), tint-color($background, $btn-hover-bg-tint-amount)),
  $hover-border: if($color == $color-contrast-light, shade-color($border, $btn-hover-border-shade-amount), tint-color($border, $btn-hover-border-tint-amount)),
  $hover-color: color-contrast($hover-background),
  $active-background: if($color == $color-contrast-light, shade-color($background, $btn-active-bg-shade-amount), tint-color($background, $btn-active-bg-tint-amount)),
  $active-border: if($color == $color-contrast-light, shade-color($border, $btn-active-border-shade-amount), tint-color($border, $btn-active-border-tint-amount)),
  $active-color: color-contrast($active-background),
  $disabled-background: $background,
  $disabled-border: $border,
  $disabled-color: color-contrast($disabled-background)
) {
  --#{$prefix}btn-color: #{$color};
  --#{$prefix}btn-bg: #{$background};
  --#{$prefix}btn-border-color: #{$border};
  --#{$prefix}btn-hover-color: #{$hover-color};
  --#{$prefix}btn-hover-bg: #{$hover-background};
  --#{$prefix}btn-hover-border-color: #{$hover-border};
  --#{$prefix}btn-focus-shadow-rgb: #{to-rgb(mix($color, $border, 15%))};
  --#{$prefix}btn-active-color: #{$active-color};
  --#{$prefix}btn-active-bg: #{$active-background};
  --#{$prefix}btn-active-border-color: #{$active-border};
  --#{$prefix}btn-active-shadow: #{$btn-active-box-shadow};
  --#{$prefix}btn-disabled-color: #{$disabled-color};
  --#{$prefix}btn-disabled-bg: #{$disabled-background};
  --#{$prefix}btn-disabled-border-color: #{$disabled-border};
}
@mixin button-outline-variant(
  $color,
  $color-hover: color-contrast($color),
  $active-background: $color,
  $active-border: $color,
  $active-color: color-contrast($active-background)
) {
  --#{$prefix}btn-color: #{$color};
  --#{$prefix}btn-border-color: #{$color};
  --#{$prefix}btn-hover-color: #{$color-hover};
  --#{$prefix}btn-hover-bg: #{$active-background};
  --#{$prefix}btn-hover-border-color: #{$active-border};
  --#{$prefix}btn-focus-shadow-rgb: #{to-rgb($color)};
  --#{$prefix}btn-active-color: #{$active-color};
  --#{$prefix}btn-active-bg: #{$active-background};
  --#{$prefix}btn-active-border-color: #{$active-border};
  --#{$prefix}btn-active-shadow: #{$btn-active-box-shadow};
  --#{$prefix}btn-disabled-color: #{$color};
  --#{$prefix}btn-disabled-bg: transparent;
  --#{$prefix}btn-disabled-border-color: #{$color};
  --#{$prefix}gradient: none;
}
@mixin button-size($padding-y, $padding-x, $font-size, $border-radius) {
  --#{$prefix}btn-padding-y: #{$padding-y};
  --#{$prefix}btn-padding-x: #{$padding-x};
  @include rfs($font-size, --#{$prefix}btn-font-size);
  --#{$prefix}btn-border-radius: #{$border-radius};
}

Sass 循环

按钮变体(用于常规按钮和轮廓按钮)使用它们各自的mixin和我们的$theme-colors映射在scss/_buttons.scss中生成修饰符类。

@each $color, $value in $theme-colors {
  .btn-#{$color} {
    @if $color == "light" {
      @include button-variant(
        $value,
        $value,
        $hover-background: shade-color($value, $btn-hover-bg-shade-amount),
        $hover-border: shade-color($value, $btn-hover-border-shade-amount),
        $active-background: shade-color($value, $btn-active-bg-shade-amount),
        $active-border: shade-color($value, $btn-active-border-shade-amount)
      );
    } @else if $color == "dark" {
      @include button-variant(
        $value,
        $value,
        $hover-background: tint-color($value, $btn-hover-bg-tint-amount),
        $hover-border: tint-color($value, $btn-hover-border-tint-amount),
        $active-background: tint-color($value, $btn-active-bg-tint-amount),
        $active-border: tint-color($value, $btn-active-border-tint-amount)
      );
    } @else {
      @include button-variant($value, $value);
    }
  }
}

@each $color, $value in $theme-colors { .btn-outline-#{$color} { @include button-outline-variant($value); } }