如何使用Bootstrap 3阻止按钮保持按下状态


78

在单击后如何使Bootstrap 3中的按钮自动取消按下?

要复制我的问题,请制作一个带有一些按钮的页面,为它们提供适当的引导程序类(并包括引导程序):

<input id="one" type="button" class="btn btn-default" value="one">
<input id="two" type="button" class="btn btn-primary" value="two">

加载页面,然后单击按钮之一。它会变得沮丧并突出显示,直到您单击页面上的其他位置(使用FF29和chrome35beta)。

在单击和未单击时检查输入元素不会显示附加的任何类,也不会从中删除任何其他类。

这是一个使Bootstrap按钮保持按下状态的示例:http : //jsfiddle.net/52VtD/5166/

Answers:


97

在您的示例中,按钮不会保持按下状态。他们保持专注。如果要查看区别,请执行以下操作:

  1. 单击并按住一个按钮。
  2. 释放。您会看到,释放鼠标时,按钮的外观略有变化,因为不再按下该按钮。

如果您不希望按钮在释放后保持聚焦,则可以指示浏览器在释放鼠标时将焦点移开。

此示例使用jQuery,但您可以使用原始JavaScript达到相同的效果。

$(".btn").mouseup(function(){
    $(this).blur();
})

小提琴


1
您说得很对,这是焦点,不是真正的沮丧或选择。为了解决这个问题,可以更改焦点的css。就我而言,实际上消除焦点是完美的。谢谢。
罗伯特·拜尔斯

1
@RobertByers更改CSS的问题是您没有禁用bootstrap提供的焦点按钮的特定样式。相反,您将覆盖引导程序默认值,并将聚焦时的样式设置为与未聚焦时的样式相同。因此,如果稍后为另一种类型的按钮添加另一种样式,则必须为两种状态编写样式:聚焦和非聚焦。
2014年

这对我有用。试图用下面提到的css-hacks来解决它,但是就易用性和有效性而言,这个小技巧是成功的。谢谢!
2015年

以及如何使用CSS为网站中的所有控件实现这一目标?
vg

25

或者,您可以仅使用样式可以完全相同的锚标记,但是由于它不是表单元素,因此无法保持焦点:

<a href="#" role="button" class="btn btn-default">one</a>.

请参阅此处的锚元素部分:http : //getbootstrap.com/css/#buttons


我认为这是一个比blur()方法更好的解决方案。在许多浏览器中,焦点样式的闪烁会带有您可能不需要的blur()方法。一种想法是使用<span>元素而不是指向空脆弱区域的锚点,因为这可能导致滚动到顶部行为。这是比较这三个的小提琴
David K.

14
这种方法对我不起作用。我仍然使用锚标签获得焦点突出的按钮元素
Hinrich,2015年

7
在当前的chrome和firefox中进行的快速测试表明,该标签可在带有href(<a role="button" class="btn btn-default">yada</a>)的锚标签工作,但如果它具有href(根据@ jme11示例),则保持选中状态。我本以为没有href的锚点是无效的,但是chrome和firefox之间的一致性使其具有吸引力-哦,它也可以在IE11中也没有href起作用。
暴龙

这是一个非常聪明的方法。而且效果很好。
lgants

1
@Typhlosaurus:一个href-less锚标签是有效的HTML 5:“如果该a元素没有href属性,则该元素表示一个可能会放置链接的占位符”W3C HTML 5规范)。这种方法对我来说很好,没有链接到空虚的潜在副作用。
Daniel Saner

10

该按钮保持焦点。为了有效地消除这一点,您可以将此查询代码添加到您的项目中。

$(document).ready(function () {
  $(".btn").click(function(event) {
    // Removes focus of the button.
    $(this).blur();
  });
});

这也适用于锚链接

$(document).ready(function () {
  $(".navbar-nav li a").click(function(event) {
    // Removes focus of the anchor link.
    $(this).blur();
  });
});

尽管标记的正确答案对我不起作用,但这个答案确实
Kevin Zhao

这个答案为我工作后,我删除eventclick(function())
迪亚

9

我的偏好:

<button onmousedown="event.preventDefault()" class="btn">Calculate</button>

8

或成角度的方式:

function blurElemDirective() {
  return {
    restrict: 'E',
    link: function (scope, element, attrs) {
      element.bind('click', function () {
        element.blur();
      });
    }
  };
}

app.directive('button', blurElemDirective);
app.directive('_MORE_ELEMENT_', blurElemDirective);

_MORE_ELEMENT_替换为其他元素。

或属性方式:

function blurElemDirective() {
  return {
    restrict: 'A',
    link: function (scope, element, attrs) {
      element.bind('click', function () {
        element.blur();
      });
    }
  };
}

app.directive('blurMe', blurElemDirective);

然后将该属性添加到您的html元素中:blur-me

<button blur-me></button>

1
这导致我在正确的方向,但扔了以下错误element.blur() is not a function,所以我做event.target.blur()
thatandrey

当指令被销毁时,请不要忘记取消绑定该监听器!
彼得·柯比

@PeterKirby,如果直接绑定到html-node会自动销毁吗?
斯塔林科

3

这是浏览器的焦点,因为它是表单元素(input)。您只需一点CSS即可轻松移除焦点

input:focus {
    outline: 0;
}

这是您示例的小提琴:http : //jsfiddle.net/52VtD/5167/

编辑

啊,我现在刚刚看到按钮本身的颜色也发生了变化。Bootstrapbtn-default使用此CSS更改例如您的按钮的按钮:

.btn-default:focus {
    color: #333;
    background-color: #ebebeb;
    border-color: #adadad;
}

如果您不希望这种行为,只需用CSS覆盖它即可。


1

这与:active:focus元素状态有关。您需要为这些按钮修改这些状态​​的样式。例如,对于默认按钮:

.btn-default:focus, .btn-default:active, .btn-default.active, .open .dropdown-toggle.btn-default {
    color: #333;
    background-color: #ccc;
    border-color: #fff;
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.