修身养性,知行合一

  • 首页
  • 爱码
    • 系统
    • 数据库
    • JavaScript
    • CSharp
    • Python
  • 生活
    • 文化
    • 美食
  • 杂谈
  • 关于
修身养性,知行合一
码字,杂谈
  1. 首页
  2. 爱码
  3. 正文

给 div 添加选中状态

2025年2月5日 1377点热度 0人点赞 0条评论

一个 input 框,可以有选中状态:focus-within,比如这样:

file

有些时候,我们希望一个 div 等其他只读元素也可以有这样的效果,鼠标点一下,可以这样选中。但是默认情况下,这个是办不到的。

首先,理解 :focus-within

:focus-within 是一个 CSS 伪类,当元素或其子元素获得焦点时,会匹配该元素。

也就是说,让 div 获取到焦点就可以。

让 div 获得焦点

1、添加 tabindex 属性

这个非常简单,为 div 添加 tabindex 属性,使其能够获得焦点,然后通过 :focus 伪类模拟 :focus-within 的效果。

<template>
  <div
    class="input-container"
    tabindex="0" <!-- 使 div 可聚焦 -->
  >
    <span>只读内容</span>
  </div>
</template>

就这样就可以实现了。

优点:

  • 简单直接,无需额外逻辑。
  • 纯 CSS 实现。

缺点:

  • 只能模拟 div 本身的焦点状态,无法处理子元素的焦点状态。

2、使用子元素作为焦点目标

在 div 内部放置一个可聚焦的子元素(如 button 或 span),并通过 JavaScript 监听子元素的焦点事件,动态为 div 添加样式。

<template>
  <div
    class="input-container"
    :class="{ focused: isFocused }"
  >
    <span tabindex="0" @focus="handleFocus" @blur="handleBlur">只读内容</span>
  </div>
</template>

<script setup>
import { ref } from "vue";

const isFocused = ref(false);

const handleFocus = () => {
  isFocused.value = true;
};

const handleBlur = () => {
  isFocused.value = false;
};
</script>

优点:

  • 更灵活,可以处理子元素的焦点状态。
  • 适用于复杂场景。

缺点:

  • 需要额外的 JavaScript 逻辑。

3、使用 contenteditable 实现可编辑 div

还可以通过使用 contenteditable 属性实现。本质上这种方式就是将一个 div 变成一个可选中的文本框,它已经就可以被选中了。

<template>
  <div
    class="input-container"
    contenteditable="true" <!-- 添加这个属性 -->
  >
    只读内容
  </div>
</template>

优点:

  • 支持交互操作(如复制、粘贴)。
  • 纯 CSS 实现。

缺点:

  • 内容可编辑。
本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可
标签: 暂无
最后更新:2025年2月5日

jeremyjone

这个人很懒,什么都没留下

打赏 点赞
< 上一篇
下一篇 >

文章评论

取消回复

文章目录
  • 首先,理解 :focus-within
  • 让 div 获得焦点
    • 1、添加 tabindex 属性
    • 2、使用子元素作为焦点目标
    • 3、使用 contenteditable 实现可编辑 div
最新 热点 随机
最新 热点 随机
node-sass 的安装 解决端口被占的问题 vue3 组件 Props 的声明方式 给 div 添加选中状态 请求的取消 rgb 颜色小数兼容问题
node-sass 的安装
TypeScript 类型找不到 在 CentOS 上安装 PHP7 CSS多元素不换行 给MySQL用户添加远程权限 你好,世界! Proxy - JavaScript

(っ•̀ω•́)っ✎⁾⁾ 开心每一天

COPYRIGHT © 2021 jeremyjone.com. ALL RIGHTS RESERVED.

THEME KRATOS MADE BY VTROIS

京ICP备19012859号-1

京公网安备 11010802028585号