【问题标题】:Make element appear on focus使元素出现在焦点上
【发布时间】:2020-05-08 16:00:48
【问题描述】:

我有以下想要出现在焦点上的元素。通过按键盘上的 Tab 键浏览网页时。

我有默认隐藏的 .pagemenu,当我将鼠标悬停在 .stub 上时会出现。当我通过键盘上的 Tab 按钮导航页面时,我希望 .pagemenu 出现(可访问性)。

通常,:focus 完全符合我的需要。通常,当我将:focus 用于元素时,使用background color 之类的属性时,背景颜色会发生变化,但为.stub 或.pagenav 设置:focus 不起作用。

好的,我现在明白了,不可能专注于未显示的元素,所以我不能专注于 .pagenav。但我可以专注于.sub,不是吗?那为什么这不起作用:

.stub a:focus .pagenav {
display: block;
position: absolute;
top: 100%;
left: -3px;
width: calc(100% + 6px);
}

我不想像here 建议的那样使用复选框,因为我不想在 HTML 中添加额外的行(而且我无法理解复选框)。

为 .pagenav 添加不透明度是个好主意,但是当 .pagenav 不显示时(不知道为什么),它会与 .stub 的宽度混淆,并且会消除 .pagenav 内容的居中。我愿意接受任何解决方案,包括 JS。

下面的gengns 提出了一个不透明的解决方案,可以消除上述问题,但仍然不能解决选项卡上:focus 的问题。

我需要做什么才能使 .pagenav 出现在 .stub 或 .pagenav 本身的焦点上?

var prevScrollpos = window.pageYOffset;
window.onscroll = function() {
  var currentScrollPos = window.pageYOffset;
  if (prevScrollpos > currentScrollPos) {
    document.getElementById("stub").style.top = "0";
  } else {
    document.getElementById("stub").style.top = "150px";
  }
  prevScrollpos = currentScrollPos;
}
.stub {
  background-color: #577284;
  float: right;
  position: fixed;
  right: 0;
  text-transform: uppercase;
  font-family: 'Yanone Kaffeesatz', sans-serif;
  font-weight: 700;
  padding: 10px;
  border: 3px solid #ff8000;
  margin-right: 1em;
}

#stublink {
  color: #F3E0BE;
  text-decoration: none;
}

.stub:hover .pagenav {
  display: block;
  position: absolute;
  top: 100%;
  left: -3px;
  width: calc(100% + 6px);
}

.pagenav {
  background-color: #577284;
  display: none;
  text-transform: uppercase;
  font-size: 0.8em;
  font-family: 'Yanone Kaffeesatz', sans-serif;
  font-weight: 700;
  border: 3px solid #ff8000;
  border-top: none;
  padding-bottom: 10px;
}

.pagenav a {
  display: block;
  color: #F3E0BE;
  padding: 6px 0px 0px 8px;
}

.pagenav a:hover {
  box-shadow: inset 5px 0 0 0 #ff8000
}

body {
  height: 200vh
}

;
@media only screen and (max-width: 670px) {
  .stub {
    right: 0;
    left: auto;
    top: 0;
    bottom: auto;
  }
  .stub:hover .pagenav {
   display: block;
position: absolute;
top: 100%;
left: -3px;
width: calc(100% + 6px);
  }
}
<body>
  <div class="stub" id="stub">
    <div class="pagenav">
      <a href="#last">
        <table>
          <tr>
            <td>02.19 03.20</td>
            <td>:</td>
            <td class="two"></td>
          </tr>
        </table>
      </a>
      <a href="#previous">
        <table>
          <tr>
            <td>02.18 02.19</td>
            <td>:</td>
            <td class="two"></td>
          </tr>
        </table>
      </a>
      <a href="#dec17">
        <table>
          <tr>
            <td>12.17 04.18</td>
            <td>:</td>
            <td class="two"></td>
          </tr>
        </table>
      </a>
      <a href="#nov17">
        <table>
          <tr>
            <td>11.17 01.18</td>
            <td>:</td>
            <td class="two"></td>
          </tr>
        </table>
      </a>
      <a href="#sep16">
        <table>
          <tr>
            <td>09.16 11.17</td>
            <td>:</td>
            <td class="two"></td>
          </tr>
        </table>
      </a>
      <a href="#sep15">
        <table>
          <tr>
            <td>09.15 08.16</td>
            <td>:</td>
            <td class="two"></td>
          </tr>
        </table>
      </a>
      <a href="#jan15">
        <table>
          <tr>
            <td>01.15 03.16</td>
            <td>:</td>
            <td class="two"></td>
          </tr>
        </table>
      </a>
      <a href="#jan14">
        <table>
          <tr>
            <td>01.14 08.15</td>
            <td>:</td>
            <td class="two"></td>
          </tr>
        </table>
      </a>
    </div><a id="stublink" href=#>Pagemenu</a>
  </div>
  <script></script>
</body>

【问题讨论】:

    标签: javascript html css


    【解决方案1】:

    如果我理解你的话,你想在每次用户超过你的.stub 或隐藏的.pagenav 时显示你的.pagenav。你可以用你所说的不透明度和改变高度来轻松做到这一点:)

    更新:按下 Tab 时显示菜单。

    const $pagenav = document.querySelector('.pagenav')
    
    document.onkeydown = e =>
      e.code == 'Tab' && $pagenav.classList.toggle('show')
    .stub {
      background-color: #577284;
      position: fixed;
      right: 10px;
      text-transform: uppercase;
      font-family: 'Yanone Kaffeesatz', sans-serif;
      font-weight: 700;
      padding: 10px;
      border: 3px solid #ff8000;
      width: 100px;
      text-align: center;
    }
    
    #stublink {
      color: #F3E0BE;
      text-decoration: none;
    }
    
    .stub .pagenav {
      width: 100%;
      height: 0;
      left: -3px;
      background-color: #577284;
      text-transform: uppercase;
      font-size: 0.8em;
      font-family: 'Yanone Kaffeesatz', sans-serif;
      font-weight: 700;
      filter: opacity(0);
    
    }
    
    .stub:hover .pagenav, .pagenav.show {
      position: absolute;
      top: 100%;
      filter: opacity(100);
      height: auto;
      border: 3px solid #ff8000;
      padding-bottom: 10px;
      border-top: none;
    }
    
    .pagenav a {
      display: block;
      color: #F3E0BE;
      padding: 6px 0px 0px 8px;
    }
    
    .pagenav a:hover {
      box-shadow: inset 5px 0 0 0 #ff8000
    }
    <div class="stub">
      <div class="pagenav">
        <a href="#last">
          <table>
            <tr>
              <td>02.19 03.20</td>
              <td>:</td>
              <td class="two"></td>
            </tr>
          </table>
        </a>
        <a href="#previous">
          <table>
            <tr>
              <td>02.18 02.19</td>
              <td>:</td>
              <td class="two"></td>
            </tr>
          </table>
        </a>
        <a href="#dec17">
          <table>
            <tr>
              <td>12.17 04.18</td>
              <td>:</td>
              <td class="two"></td>
            </tr>
          </table>
        </a>
        <a href="#nov17">
          <table>
            <tr>
              <td>11.17 01.18</td>
              <td>:</td>
              <td class="two"></td>
            </tr>
          </table>
        </a>
        <a href="#sep16">
          <table>
            <tr>
              <td>09.16 11.17</td>
              <td>:</td>
              <td class="two"></td>
            </tr>
          </table>
        </a>
        <a href="#sep15">
          <table>
            <tr>
              <td>09.15 08.16</td>
              <td>:</td>
              <td class="two"></td>
            </tr>
          </table>
        </a>
        <a href="#jan15">
          <table>
            <tr>
              <td>01.15 03.16</td>
              <td>:</td>
              <td class="two"></td>
            </tr>
          </table>
        </a>
        <a href="#jan14">
          <table>
            <tr>
              <td>01.14 08.15</td>
              <td>:</td>
              <td class="two"></td>
            </tr>
          </table>
        </a>
      </div><a id="stublink" href=#>Pagemenu</a>
    </div>

    希望这个帮助或至少为您指明正确的方向^^

    【讨论】:

    • 它比我尝试这样做时效果更好,但是 .stub 的高度仍然混乱。您可以看到它在悬停时的变化。并且 :focus 也不起作用。
    • 您可以随意调整高度; ) 但是您要实现的其他焦点效果是什么,也许我可以帮助您。
    • 当我尝试调整高度时,.stub 仅从底部缩短,即使左侧、顶部和底部设置为自动。重点是当我按下键盘上的“tab”时。 .pagenav 在这种情况下不会出现,就像使用显示而不是不透明度时一样。
    • 我更新了我的帖子。运行上面的代码 sn-p,单击结果区域(获取上下文),然后按 Tab。它应该可以工作,但是我建议您使用另一个键或组合,因为 Tab 广泛用于在元素之间移动。编码愉快!
    • 感谢您愿意提供帮助。我想使用 Tab 因为它被广泛用于在元素之间移动。这正是我想使用 :focus 的原因——因为我想让用户使用元素之间的导航来导航 .pagemenu。 :focus 通常用于此目的,但不适用于此元素。
    【解决方案2】:

    尝试在导航之前添加#stublink 并添加以下CSS,因为TAB 键不会聚焦.stub,而是#stublink-element:

    .stub:hover .pagenav,
        #stublink:focus + .pagenav{
          display: block;
          position: absolute;
          top: 100%;
          left: -3px;
          width: calc(100% + 6px);
        }
    

    var prevScrollpos = window.pageYOffset;
    window.onscroll = function() {
      var currentScrollPos = window.pageYOffset;
      if (prevScrollpos > currentScrollPos) {
        document.getElementById("stub").style.top = "0";
      } else {
        document.getElementById("stub").style.top = "150px";
      }
      prevScrollpos = currentScrollPos;
    }
    .stub {
      background-color: #577284;
      float: right;
      position: fixed;
      right: 0;
      text-transform: uppercase;
      font-family: 'Yanone Kaffeesatz', sans-serif;
      font-weight: 700;
      padding: 10px;
      border: 3px solid #ff8000;
      margin-right: 1em;
    }
    
    #stublink {
      color: #F3E0BE;
      text-decoration: none;
    }
    
    .stub:hover .pagenav,
    .stub:focus-within .pagenav,
    #stublink:focus + .pagenav{
      display: block;
      position: absolute;
      top: 100%;
      left: -3px;
      width: calc(100% + 6px);
    }
    
    .pagenav {
      background-color: #577284;
      display: none;
      text-transform: uppercase;
      font-size: 0.8em;
      font-family: 'Yanone Kaffeesatz', sans-serif;
      font-weight: 700;
      border: 3px solid #ff8000;
      border-top: none;
      padding-bottom: 10px;
    }
    
    .pagenav a {
      display: block;
      color: #F3E0BE;
      padding: 6px 0px 0px 8px;
    }
    
    .pagenav a:hover {
      box-shadow: inset 5px 0 0 0 #ff8000
    }
    
    body {
      height: 200vh
    }
    
    ;
    @media only screen and (max-width: 670px) {
      .stub {
        right: 0;
        left: auto;
        top: 0;
        bottom: auto;
      }
      .stub:hover .pagenav {
       display: block;
    position: absolute;
    top: 100%;
    left: -3px;
    width: calc(100% + 6px);
      }
    }
    <body>
      <div class="stub" id="stub">
        <a id="stublink" href=#>Pagemenu</a>
        <div class="pagenav">
          <a href="#last">
            <table>
              <tr>
                <td>02.19 03.20</td>
                <td>:</td>
                <td class="two"></td>
              </tr>
            </table>
          </a>
          <a href="#previous">
            <table>
              <tr>
                <td>02.18 02.19</td>
                <td>:</td>
                <td class="two"></td>
              </tr>
            </table>
          </a>
          <a href="#dec17">
            <table>
              <tr>
                <td>12.17 04.18</td>
                <td>:</td>
                <td class="two"></td>
              </tr>
            </table>
          </a>
          <a href="#nov17">
            <table>
              <tr>
                <td>11.17 01.18</td>
                <td>:</td>
                <td class="two"></td>
              </tr>
            </table>
          </a>
          <a href="#sep16">
            <table>
              <tr>
                <td>09.16 11.17</td>
                <td>:</td>
                <td class="two"></td>
              </tr>
            </table>
          </a>
          <a href="#sep15">
            <table>
              <tr>
                <td>09.15 08.16</td>
                <td>:</td>
                <td class="two"></td>
              </tr>
            </table>
          </a>
          <a href="#jan15">
            <table>
              <tr>
                <td>01.15 03.16</td>
                <td>:</td>
                <td class="two"></td>
              </tr>
            </table>
          </a>
          <a href="#jan14">
            <table>
              <tr>
                <td>01.14 08.15</td>
                <td>:</td>
                <td class="two"></td>
              </tr>
            </table>
          </a>
        </div>
      </div>
      <script></script>
    </body>

    【讨论】:

    • 很好的解决方案。但是为什么它在第二次按 Tab 后就消失了?是否不仅可以显示 .pagenav,还可以导航其链接?
    • 你必须在#stub元素上使用:focus-within
    • 有效!佩服你的手艺,谢谢。我只能在 4 小时内奖励赏金。我会在它可用时立即做。
    • 我会很感激 ;)
    【解决方案3】:

    您无法聚焦尚未显示的元素(显示:无)。 也许您可以通过一个显示的小辅助元素来处理这个问题?

    【讨论】:

    • 我有始终显示的 .stub (嗯,我也有 javascript 在向下滚动时隐藏它并在向上滚动时显示它,但它不影响问题)。
    猜你喜欢
    • 2016-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-30
    • 1970-01-01
    • 2013-03-23
    • 1970-01-01
    • 2018-10-05
    相关资源
    最近更新 更多