当前位置: 首页 > article >正文

CSS3的aria-hidden学习

前言

aria-hidden 属性可用于隐藏非交互内容,使其在无障碍 API 中不可见。即当aria-hidden="true" 添加到一个元素会将该元素及其所有子元素从无障碍树中移除,这可以通过隐藏来改善辅助技术用户的体验:

  1. 纯装饰性内容,如图标或图片
  2. 重复的内容,如重复的文本
  3. 屏幕外或折叠的内容,如菜单

tips: 不要在可以获得焦点的元素上使用 aria-hidden="true"。因元素的隐藏状态基于其是否被渲染通常由 CSS 控制。

[aria-hidden="true"] {
  display: none;
}

弹窗显隐demo

<template>
  <!-- 弹窗内容 -->
  <div id="myModal" class="modal" aria-hidden="true" style="display: none;">
    <div class="modal-content">
      <span class="close-button" @click="closeModal">&times;</span>
      <p>这是一个弹窗内容。</p>
    </div>
  </div>

  <!-- 触发弹窗的按钮 -->
  <button @click="openModal">打开弹窗</button>
</template>

<script setup>
const openModal = () => {
  var modal = document.getElementById('myModal');
  modal.style.display = 'flex'; // 显示弹窗
  modal.setAttribute('aria-hidden', 'false'); // 使弹窗对辅助技术可见
}
const closeModal = () => {
  var modal = document.getElementById('myModal');
  modal.style.display = 'none'; // 显示弹窗
  modal.setAttribute('aria-hidden', 'true'); // 使弹窗对辅助技术可见
}
</script>
<style lang="scss">
.modal {
  position: fixed;
  left: 0;
  top: 0;
  width: 100%;
  height: 100%;
  background-color: rgba(0, 0, 0, 0.5);
  display: flex;
  justify-content: center;
  align-items: center;
}

.modal-content {
  background-color: #fff;
  padding: 20px;
  border-radius: 5px;
  position: relative;
}

.close-button {
  position: absolute;
  top: 10px;
  right: 10px;
  cursor: pointer;
  font-size: 20px;
}
</style>

input获取焦点提示demo

<template>
  <div class="input-container">
    <input type="text" v-model="inputValue" :aria-describedby="tooltipId" @focus="showTooltip = true"
      @blur="showTooltip = false" />
    <transition name="fade">
      <div v-show="showTooltip" class="tooltip" :id="tooltipId" ref="tooltip" role="tooltip">
        这是当输入聚焦时出现的工具提示。
      </div>
    </transition>
  </div>
</template>


<script>
import { ref, computed } from 'vue';


export default {
  setup () {
    const inputValue = ref('');
    const showTooltip = ref(false);
    const tooltip = ref(null);
    const tooltipId = computed(() => showTooltip.value ? 'tooltip' : '');


    return {
      inputValue,
      showTooltip,
      tooltip,
      tooltipId
    };
  }
};
</script>


<style scoped>
.input-container {
  position: relative;
  display: inline-block;
}


.tooltip {
  position: absolute;
  bottom: 100%;
  left: 0;
  top: 25px;
  background-color: green;
  border: 1px solid green;
  color: #fff;
  padding: 10px;
  border-radius: 5px;
  height: 80px;
  z-index: 999;
  width: 200px;
}


.fade-enter-active,
.fade-leave-active {
  transition: opacity 0.1s ease-in-out;
}


.fade-enter-from,
.fade-leave-to {
  opacity: 0;
}
</style>

追更

<template>
  <input type="text" v-model="inputValue" @focus="showTooltip" @blur="hideTooltip" placeholder="单击或聚焦我" ref="inputRef">
  <transition name="fade">
    <div v-if="isTooltipVisible" class="tooltip" :style="tooltipStyle">这是一个工具提示!</div>
  </transition>
</template>

<script setup>
import { ref, onMounted, reactive } from 'vue';

const inputValue = ref('');
const isTooltipVisible = ref(false);
const inputRef = ref(null);

const tooltipStyle = reactive({
  left: '0px',
  top: '0px'
});

const showTooltip = () => {
  isTooltipVisible.value = true;
  positionTooltip();
};

const hideTooltip = () => {
  isTooltipVisible.value = false;
};

const positionTooltip = () => {
  if (inputRef.value) {
    const inputRect = inputRef.value.getBoundingClientRect();
    tooltipStyle.left = `${inputRect.left + window.scrollX}px`;
    tooltipStyle.top = `${inputRect.bottom + window.scrollY + 10}px`; // 10px的间距
  }
};

onMounted(() => {
  // 可以在这里做一些额外的初始化工作,比如监听窗口滚动事件来重新定位tooltip等
  // 但在这个简单示例中,我们不需要这样做
});
</script>

<style scoped>
.tooltip {
  position: absolute;
  background-color: #333;
  color: #fff;
  text-align: center;
  border-radius: 5px;
  padding: 5px;
  z-index: 1000;
  white-space: nowrap;
  /* 防止文本换行 */
}

.fade-enter-active,
.fade-leave-active {
  transition: opacity 0.3s;
}

.fade-enter,
.fade-leave-to

/* .fade-leave-active in <2.1.8 */
  {
  opacity: 0;
}
</style>

http://www.kler.cn/a/502035.html

相关文章:

  • B+树的原理及实现
  • Pycharm连接远程解释器
  • EFK采集k8s日志
  • 该虚拟机似乎正在使用中。 如果该虚拟机未在使用,请按“获取所有权(T)”按钮获取它的所有权。否则,请按“取消(C)”按钮以防损坏。
  • mysql的mvcc理解
  • 解决win11的vmvare和docker冲突
  • 每日一题(三):压缩字符串(行程长度编码)
  • vue城市道路交通流量预测可视化系统
  • 《变形金刚-游戏》V1.0官方学习版
  • Redis 为什么要引入 Pipeline机制?
  • C++中锁和互斥量的原理、区别和使用建议
  • 提升Docker运维效率:实用技巧与最佳实践
  • 【opencv】第8章 图像轮廓与图像分割修复
  • [Python学习日记-76] 网络编程中的 socket 开发 —— 介绍、工作流程、socket 模块用法和函数介绍
  • 云端 IPv4 VRRP+MSTP多备份组配置实验
  • oarcle执行报错提示:SQL 错误 [1839] [22008]: ORA-01839: 指定月份的日期无效问题解决
  • (免费送源码)计算机毕业设计原创定制:Java+ssm+MySQL 在线购票影城
  • 冲击全马330计划
  • Node.js 环境的管理服务工具
  • 一键获取Linux主机配置信息shell脚本,含网卡详情,网卡绑定等
  • 滑动窗口限流算法:基于Redis有序集合的实现与优化
  • Table-Augmented Generation(TAG):Text2SQL与RAG的升级与超越
  • springboot vue uniapp 仿小红书 1:1 还原 (含源码演示)
  • CVE-2025-22777 (CVSS 9.8):WordPress | GiveWP 插件的严重漏洞
  • 【机器学习】Kaggle实战Rossmann商店销售预测(项目背景、数据介绍/加载/合并、特征工程、构建模型、模型预测)
  • 无源器件-电容