css 为什么当我在元素上按下鼠标时,轮廓会隐藏?

jslywgbw  于 2023-08-08  发布在  其他
关注(0)|答案(2)|浏览(103)

当我聚焦这个控件时,它会得到一个轮廓,如所期望的那样,但是当我用主鼠标按钮单击并按住它时,轮廓就会消失。我该怎么解决?

:root {
  --color-mint: #02b689;
  --color-white: #ffffff;
  --color-silver: #c2c2c2;
  --focus-color: #3b3e3f;
  --focus-opacity: 0.5;
}

.toggle {
  position: relative;
  display: inline-block;
  width: 60px;
  height: 26px;
}

.toggle input {
  width: 0;
  height: 16px;
  pointer-events: none;
}

.toggle_slider {
  position: absolute;
  cursor: pointer;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
  background-color: var(--color-silver);
  transition: .3s;
  border-radius: 26px;
}

.toggle_slider:before {
  position: absolute;
  content: "";
  height: 22px;
  width: 22px;
  left: 2px;
  bottom: 2px;
  background-color: var(--color-white);
  transition: .3s;
  border-radius: 50%;
}

.toggle_slider::after {
  content: "";
  border-radius: 26px;
  position: absolute;
  top: 0;
  right: 0;
  bottom: 0;
  left: 0;
  border: 2px solid var(--focus-color);
  margin: -3px;
  opacity: 0;
}

input:checked+.toggle_slider {
  background-color: var(--color-mint);
}

input:checked+.toggle_slider:before {
  transform: translateX(34px);
}

.toggle input:focus+.toggle_slider::after {
  opacity: var(--focus-opacity);
}

个字符
注意:如果可能的话,我不想使用JavaScript。

trnvg8h3

trnvg8h31#

以下是CSS解决方案:您可以将伪选择器::after定位到.toggle_slider的活动状态

.toggle_slider:active::after{
  opacity: var(--focus-opacity);
}

字符串

:root {
  --color-mint: #02b689;
  --color-white: #ffffff;
  --color-silver: #c2c2c2;
  --focus-color: #3b3e3f;
  --focus-opacity: 0.5;
}

.toggle {
  position: relative;
  display: inline-block;
  width: 60px;
  height: 26px;
}

.toggle input {
  width: 0;
  height: 16px;
  pointer-events: none;
}

.toggle_slider {
  position: absolute;
  cursor: pointer;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
  background-color: var(--color-silver);
  transition: .3s;
  border-radius: 26px;
}

.toggle_slider:before {
  position: absolute;
  content: "";
  height: 22px;
  width: 22px;
  left: 2px;
  bottom: 2px;
  background-color: var(--color-white);
  transition: .3s;
  border-radius: 50%;
}

.toggle_slider::after {
  content: "";
  border-radius: 26px;
  position: absolute;
  top: 0;
  right: 0;
  bottom: 0;
  left: 0;
  border: 2px solid var(--focus-color);
  margin: -3px;
  opacity: 0;
}

.toggle_slider:active::after{
  opacity: var(--focus-opacity);
}

input:checked+.toggle_slider {
  background-color: var(--color-mint);
}

input:checked+.toggle_slider:before {
  transform: translateX(34px);
}

.toggle input:focus+.toggle_slider::after {
  opacity: var(--focus-opacity);
}
<label class="toggle">
  <input type=checkbox aria-hidden="true"/>
  <span class="toggle_slider round"></span>
</label>

的数据

9jyewag0

9jyewag02#

您遇到的问题是由于某些浏览器的默认行为,即在单击元素或元素获得焦点时删除轮廓。此行为通常与CSS**:focus伪类相关联。
要防止在单击并按住元素时轮廓消失,可以修改
:focus**样式以显式定义聚焦状态的轮廓。

.toggle {
  position: relative;
  display: inline-block;
  width: 60px;
  height: 26px;
}

.toggle input {
  width: 0;
  height: 16px;
  pointer-events: none;
}

.toggle_slider {
  position: absolute;
  cursor: pointer;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
  background-color: var(--color-silver);
  transition: .3s;
  border-radius: 26px;
}

/* Add the following style to explicitly define the outline for the :focus state */
.toggle input:focus + .toggle_slider {
  outline: 2px solid var(--focus-color);
  outline-offset: -1px;
}

字符串
通过此修改,当**.toggle元素内的复选框获得焦点时(例如,单击它时),.toggle_slider将具有2 px实心轮廓,并在:root块中指定--focus-color**。outline-offset用于使轮廓包围元素,而不影响其大小。
现在,当您单击并按住元素时,轮廓将保持可见。

相关问题