OpenMV嵌入式视觉实战:电设与智能车竞赛的视觉方案设计与优化

开发者福利!热门AI工具限时免费用 购周边即赠Coding Plan Lite,Claude Code、Cursor等20+工具畅享,效率翻倍! 阅读详情

1. 项目概述:为什么OpenMV是电设与智能车竞赛的“瑞士军刀”?

如果你正在准备电子设计大赛或者全国大学生智能汽车竞赛,并且还在为视觉方案的选择而头疼,那么这篇文章就是为你准备的。我参加过多次这类竞赛,从最初的单片机驱动摄像头,到后来尝试各种复杂的视觉方案,最终发现OpenMV几乎是为这类嵌入式视觉应用量身定做的。它不是一个简单的摄像头模块,而是一个集成了图像传感器、处理器、MicroPython解释器和丰富视觉算法库的完整开发平台。对于需要在资源有限的嵌入式系统上快速实现目标识别、颜色追踪、二维码读取等功能的场景,OpenMV极大地降低了开发门槛,让你能把精力从底层驱动和算法移植,集中到上层应用逻辑和赛道策略的优化上。无论是电设中需要自动追踪的“智能小车”,还是智能车竞赛中负责识别赛道元素、路肩、环岛、车库的视觉模块,OpenMV都能提供一个稳定、高效的解决方案。接下来,我将结合自己的实战经验,从核心设计思路到具体代码实现,再到避坑指南,为你完整拆解如何用好这把“瑞士军刀”。

2. 核心设计思路与方案选型考量

2.1 嵌入式视觉方案的“不可能三角”:性能、易用性与成本

在电设和智能车这类竞赛中,视觉方案的选择本质上是在平衡一个“不可能三角”: 实时性能、开发易用性和硬件成本 。传统的方案,比如用STM32直接驱动OV系列摄像头,性能上限受限于主控的算力和内存,开发周期长,需要自己编写或移植图像处理算法。而使用树莓派等Linux平台,虽然算力强大、生态丰富,但功耗、体积和系统复杂性又成了新问题,对于追求极致速度和稳定性的竞速小车来说,可能显得“杀鸡用牛刀”。

OpenMV恰好找到了一个精妙的平衡点。它内置的STM32H7或类似性能的ARM Cortex-M7处理器,专为运行MicroPython和其优化的视觉库而设计。这意味着你无需关心底层寄存器配置、DMA传输或图像格式转换,直接用几行Python代码就能调用 find_blobs (找色块)、 find_qrcodes (找二维码)等高级函数。这种“开箱即用”的特性,将开发周期从以“周”为单位压缩到以“天”甚至“小时”为单位。对于竞赛这种时间紧迫的场景,快速迭代和验证想法的能力至关重要。

2.2 OpenMV与主控的通信架构:为何UART是主流选择?

确定了视觉核心后,下一个关键决策是如何让OpenMV与负责运动控制的主控(通常是STM32)高效通信。常见的通信方式有UART串口、I2C、SPI,甚至直接通过数字IO模拟并行传输。

经过多次实测, UART异步串口通信是绝大多数情况下的最优解 。原因有三:首先, 稳定性极高 。UART协议简单,硬件实现成熟,在电机、舵机等强电磁干扰的赛车上,其抗干扰能力通常优于I2C和SPI。其次, 资源占用少 。只需要两根线(TX、RX),不占用宝贵的SPI或I2C总线资源,这些总线可能还要连接陀螺仪、编码器等关键传感器。最后, 开发调试方便 。你可以轻松地通过USB转TTL模块,将OpenMV的串口数据打印到电脑串口助手,实时观察发送的数据包,这对于协议调试和算法参数整定来说是无价之宝。

当然,如果对数据吞吐量有极端要求(例如需要传输完整的小分辨率图像),可以考虑SPI。但智能车视觉通常只需要传输处理后的结果,比如目标中心的(x, y)坐标、宽度、高度、标签等,数据量很小(几十个字节每秒),UART的115200甚至更高的波特率完全绰绰有余。因此,一个稳定、可靠的UART通信协议设计,是整个视觉系统稳定运行的基石。

2.3 固件与IDE选择:官方IDE与OpenMV-IDE的优劣

工欲善其事,必先利其器。OpenMV官方提供了专用的集成开发环境(OpenMV IDE),它集成了代码编辑器、串口终端、帧缓冲区查看器和固件烧录工具。对于初学者和快速开发,这是最佳选择。它的帧缓冲区查看器可以实时显示摄像头看到的画面,并用图形覆盖显示算法识别到的结果(如色块框、线条),调试效率极高。

然而,在长期项目或团队协作中,你可能会遇到一些不便:代码编辑功能相对较弱、对版本管理(Git)支持不友好、无法进行复杂的多文件项目管理。这时,可以考虑使用更强大的通用代码编辑器(如VSCode)配合OpenMV插件,或者使用支持MicroPython的插件。但需要注意的是,实时图像预览等核心调试功能可能无法完美替代。我的建议是: 在算法开发、参数调试阶段,坚持使用官方IDE;在代码逻辑稳定后,可以迁移到更顺手的编辑器进行维护和版本控制

关于固件,务必从OpenMV官网下载与你的硬件型号(如OpenMV4 H7, OpenMV Cam M7)完全匹配的最新稳定版固件。新版固件通常会修复bug、优化算法性能或增加新功能。

3. 核心功能实现与代码级拆解

3.1 赛道元素识别:从图像预处理到特征提取

智能车竞赛的赛道元素识别是OpenMV的核心应用。其流程可以标准化为:图像获取 -> 预处理 -> 特征提取 -> 决策输出。

第一步:图像获取与ROI设定 永远不要尝试处理整个图像(Full Resolution)。这会消耗大量不必要的计算时间。第一步永远是设定 感兴越区域(ROI) 。例如,对于前瞻的摄像头,我们只关心图像下方靠近地平线的部分,因为赛道元素(起跑线、十字、环岛入口)都出现在那里。

import sensor, image, time
sensor.reset()
sensor.set_pixformat(sensor.RGB565) # 彩色图像
sensor.set_framesize(sensor.QVGA)   # 320x240
sensor.skip_frames(time = 2000)     # 等待感光元件稳定

# 定义ROI: (x, y, width, height), 例如只取图像下半部分
roi = (0, 120, 320, 120)

通过合理设置ROI,可以将处理速度提升数倍。

第二步:图像预处理 预处理的目标是强化我们关心的特征,抑制干扰。最常用的方法是 颜色空间转换与阈值分割

  • 灰度化+二值化 :适用于黑白赛道。先将图像转为灰度图,然后通过一个阈值将其二值化,白色代表赛道,黑色代表背景。
    img = sensor.snapshot()
    img = img.to_grayscale() # 转为灰度图
    # 假设赛道为白色(高亮度)
    binary_img = img.binary([(200, 255)]) # 阈值可根据环境光调整
    
  • LAB颜色空间阈值 :对于彩色赛道(比如蓝底白线),灰度化会丢失颜色信息。LAB颜色空间能将亮度(L)和颜色(A、B)分开,对光照变化更鲁棒。我们可以针对特定的颜色(如蓝色)设定A、B通道的阈值。
    # 寻找蓝色色块
    blue_threshold = (30, 60, -20, 10, -30, 10) # (L_min, L_max, A_min, A_max, B_min, B_max)
    blobs = img.find_blobs([blue_threshold], area_threshold=100, merge=True)
    
    这里的阈值需要通过IDE中的“阈值编辑器”工具,在比赛现场的实际光照条件下进行校准,这是成败的关键。

第三步:特征提取与元素判断 从二值化图像或色块中提取特征,判断赛道元素。

  • 寻线(基础) :使用 get_regression 函数对二值化后的赛道白色区域进行线性回归,得到中线。
    line = img.get_regression([(255,255)], robust = True) # 对白色像素进行鲁棒回归
    if line: 
        img.draw_line(line.line(), color = 127)
        # line.theta() 是直线的角度,可用于计算偏差
    
  • 十字路口识别 :当寻到的线很短,或者图像中同时出现多条近似垂直的线时,可能是十字。一个实用的方法是检查寻到的线的长度和角度变化率。
  • 环岛识别 :环岛入口在图像中表现为赛道边缘出现一个大的、连续的弧线或圆形。可以结合 find_circles 函数和赛道边缘的突变来判断。更稳健的方法是识别环岛中心的标志(如果规则允许)或通过一段时间内中线点的运动轨迹来判断(例如中线点突然向左/右大幅偏移并保持)。

3.2 目标追踪与坐标转换:让小车“看懂”位置

识别到元素后,需要将图像中的像素坐标转换为小车实际运动可用的世界坐标或控制量。

像素坐标到偏差量的转换 假设我们通过寻线得到了赛道中线的底部点坐标 (cx, img.height()) (cx是底部中心x坐标)。图像的宽度是 img.width()

# 计算横向偏差
image_center = img.width() // 2
deviation = cx - image_center  # 偏差值,正数表示中线偏右,需要向左转

这个 deviation 可以直接作为PID控制器的输入,控制舵机的打角。

透视变换与逆透视映射(IPM) 对于需要更精确距离测量的场景(如判断距离车库还有多远),简单的像素偏差就不够了。这时可以考虑 逆透视映射 。原理是假设地面是平的,通过标定(拍摄一张已知尺寸的棋盘格图铺在地上),计算出一个从图像平面到地平面的变换矩阵(Homography Matrix)。这样,图像中的任何一个点都可以映射到地面上的实际坐标(单位:厘米)。 OpenMV本身不直接提供IPM函数,但可以利用其 find_apriltags (AprilTag标签)来实现类似功能。AprilTag本身提供了精确的6自由度位姿估计(距离和角度)。你可以在地面放置已知尺寸的AprilTag作为锚点,通过识别它来间接获得小车相对于Tag的位置和朝向,这是一种更高级但更精准的定位方式。

3.3 与STM32的通信协议设计:稳定大于一切

通信协议的设计原则是:简单、冗余、容错。这里给出一个经过实战检验的UART通信协议框架。

OpenMV端(发送端)代码示例:

import pyb
uart = pyb.UART(3, 115200, timeout_char=100) # 使用UART3,波特率115200

def send_data_to_stm32(element_type, x, y, w, h):
    # 协议帧格式:帧头(2字节) + 数据类型(1字节) + 数据(4*4字节) + 校验和(1字节) + 帧尾(2字节)
    # 帧头: 0xAA, 0xBB
    # 数据类型: 0x01:赛道线偏差, 0x02:环岛, 0x03:车库...
    # 数据: 4个float类型,根据类型不同含义不同。例如对于偏差,只使用第一个float。
    # 校验和: 类型字节与所有数据字节的和的最低字节
    # 帧尾: 0xCC, 0xDD

    HEADER = b'\xAA\xBB'
    FOOTER = b'\xCC\xDD'

    # 将数据打包为字节流 (使用 'f' 格式表示float,占4字节)
    data_bytes = struct.pack('f', x) + struct.pack('f', y) + struct.pack('f', w) + struct.pack('f', h)
    type_byte = bytes([element_type])

    # 计算校验和
    checksum = element_type
    for b in data_bytes:
        checksum += b
    checksum_byte = bytes([checksum & 0xFF]) # 取低8位

    # 组装帧
    frame = HEADER + type_byte + data_bytes + checksum_byte + FOOTER
    uart.write(frame)

在循环中,根据识别结果调用此函数发送数据。

STM32端(接收端)代码示例(HAL库):

// 定义状态机
typedef enum {
    STATE_HEADER1,
    STATE_HEADER2,
    STATE_TYPE,
    STATE_DATA,
    STATE_CHECKSUM,
    STATE_FOOTER1,
    STATE_FOOTER2
} UART_State;

UART_State rx_state = STATE_HEADER1;
uint8_t rx_buffer[20]; // 足够大的缓冲区
uint8_t data_index = 0;
uint8_t data_type;
float data[4];
uint8_t expected_data_len = 16; // 4个float

void UART_RxHandler(uint8_t rx_byte) {
    static uint8_t checksum_calc;

    switch(rx_state) {
        case STATE_HEADER1:
            if(rx_byte == 0xAA) {
                rx_state = STATE_HEADER2;
                checksum_calc = 0; // 开始计算校验和
            }
            break;
        case STATE_HEADER2:
            if(rx_byte == 0xBB) rx_state = STATE_TYPE;
            else rx_state = STATE_HEADER1; // 同步失败,复位
            break;
        case STATE_TYPE:
            data_type = rx_byte;
            checksum_calc += rx_byte;
            data_index = 0;
            rx_state = STATE_DATA;
            break;
        case STATE_DATA:
            ((uint8_t*)data)[data_index++] = rx_byte; // 填充数据数组
            checksum_calc += rx_byte;
            if(data_index >= expected_data_len) {
                rx_state = STATE_CHECKSUM;
            }
            break;
        case STATE_CHECKSUM:
            if(rx_byte == (checksum_calc & 0xFF)) {
                rx_state = STATE_FOOTER1;
            } else {
                // 校验失败,丢弃该帧
                rx_state = STATE_HEADER1;
            }
            break;
        case STATE_FOOTER1:
            if(rx_byte == 0xCC) rx_state = STATE_FOOTER2;
            else rx_state = STATE_HEADER1;
            break;
        case STATE_FOOTER2:
            if(rx_byte == 0xDD) {
                // 一帧完整数据接收成功!
                process_vision_data(data_type, data); // 处理数据
            }
            rx_state = STATE_HEADER1; // 无论成功与否,回到开始
            break;
    }
}

这个状态机解析器能有效应对数据流中的干扰和丢包,是保证通信稳定的核心。

4. 硬件连接、供电与物理安装的实战细节

4.1 电源:噪声是视觉系统的头号杀手

很多队伍在实验室调试一切正常,一上赛道就跑飞,多半是电源问题。OpenMV和摄像头模组对电源噪声非常敏感,而电机、舵机在启停时会产生巨大的电压尖峰和纹波。

绝对要避免 :直接从电机驱动板或主控板的线性稳压器(如AMS1117)取电给OpenMV供电。这些电源路径上的噪声会直接耦合进图像传感器,导致图像出现横条纹、抖动,甚至OpenMV死机重启。

正确做法

  1. 独立供电 :为OpenMV准备一块独立的、干净的电源。最推荐使用一块小容量的 锂电池(如2S,7.4V) 配合一个高质量的 DC-DC降压模块 (如LM2596S模块),将电压稳定在OpenMV所需的3.3V或5V。确保该电源回路与电机、舵机电源在物理上隔离。
  2. 电源滤波 :在OpenMV的电源入口处,并联一个 大电容(如100uF钽电容) 和一个 小电容(0.1uF陶瓷电容) 。大电容应对低频纹波,小电容滤除高频噪声。这是成本最低、效果最显著的抗干扰措施。
  3. 共地处理 :虽然电源要隔离,但OpenMV的GND必须与STM32主控的GND可靠连接在一起,这是UART通信的基础。使用较粗的导线或直接焊接在公共地平面上。

4.2 通信线路:远离干扰源

UART的TX、RX线应使用双绞线,并尽可能远离电机驱动线、电源线等强干扰源。如果条件允许,可以使用带屏蔽层的线缆。接线务必牢固,竞赛中接头松动导致视觉失灵是常见事故。

4.3 物理安装:刚性、减震与角度

摄像头的安装方式直接影响算法效果。

  • 刚性 :支架必须牢固。小车高速过弯时,摄像头的任何微小晃动都会导致图像模糊和识别跳变。使用碳纤维杆、3D打印的加强结构,确保摄像头与车身刚性连接。
  • 减震 :在支架与车身连接处增加 减震海绵或橡胶垫 ,过滤掉来自轮胎的高频振动。这对于在粗糙赛道上保持图像稳定至关重要。
  • 角度与高度 :摄像头俯角需要仔细调整。俯角太大,视野太近,前瞻不足;俯角太小,视野太远,赛道线在图像中太细,容易丢失。通常需要反复试验,找到一个能在直道和弯道都稳定识别的折中点。高度也影响视野范围和透视变形。

5. 调试技巧与参数整定方法论

5.1 利用OpenMV IDE进行“可视化”调试

OpenMV IDE的“帧缓冲区”视图是你最强大的调试工具。不要只盯着看,要善用其功能:

  • 冻结图像 :在识别到特定元素时,在代码中插入 pyb.delay(5000) ,让图像暂停5秒,方便你仔细观察这一帧的识别结果。
  • 绘制辅助图形 :多用 img.draw_rectangle() , img.draw_circle() , img.draw_string() 等函数,把算法认为的ROI、识别到的色块边界、计算出的中线、特征点等都画在图像上。这样你就能一眼看出算法“眼里的世界”是什么样的,哪里识别错了。
  • 阈值编辑器 :这是颜色识别的神器。在真实的比赛光照环境下,打开阈值编辑器,用取色器选取目标颜色,观察LAB或RGB各个通道的直方图分布,手动调整阈值范围,直到目标被完美框选而背景被排除。

5.2 参数整定:从“玄学”到科学

算法中有很多阈值参数,如色块面积阈值 area_threshold 、二值化阈值、合并阈值 merge 等。调整它们不能靠猜。

  1. 单一变量原则 :一次只调整一个参数,观察其变化对结果的影响。
  2. 录制视频 :让小车在赛道上跑,用OpenMV IDE的“录制”功能录下一段视频。然后离线逐帧分析,看在哪一帧、什么情况下识别失败了。针对这一帧去调整参数。
  3. 数据日志 :在代码中将关键参数(如识别到的色块数量、中线偏差、计算出的元素类型)通过UART发送到电脑保存下来。与小车实际运行轨迹对比,可以定量分析视觉识别的准确性和延迟。

5.3 环境光适应性处理

比赛现场的光照可能与实验室截然不同。必须让你的视觉系统有一定适应能力。

  • 自动白平衡 :确保 sensor.set_auto_whitebal(True) 是开启的,让摄像头适应色温。
  • 自动增益/曝光 sensor.set_auto_gain(True) sensor.set_auto_exposure(True) 在大多数情况下是好的,但在光照快速变化或极端明暗对比下可能不稳定。对于竞速小车,有时 手动固定增益和曝光值 反而能获得更稳定的图像,前提是你需要在比赛现场的光照条件下找到一组最优的固定值。
  • 动态阈值 :对于固定阈值无法应对的光照变化,可以尝试动态阈值算法。例如,计算图像的平均亮度,然后根据平均亮度动态调整二值化的阈值。
    img = sensor.snapshot()
    stats = img.get_statistics()
    mean_luminance = stats.l_mean()
    # 根据平均亮度计算阈值,例如阈值 = mean_luminance * 0.8
    dynamic_threshold = int(mean_luminance * 0.8)
    binary_img = img.binary([(dynamic_threshold, 255)])
    

6. 常见问题排查与性能优化实录

6.1 问题排查速查表

问题现象 可能原因 排查步骤与解决方案
图像全黑或全白 1. 摄像头排线接触不良。
2. 电源电压不足或不稳。
3. 固件与摄像头型号不匹配。
1. 重新插拔摄像头排线。
2. 用万用表测量OpenMV供电引脚电压,确保在3.3V/5V且稳定。
3. 重新烧录正确固件。
OpenMV频繁重启 1. 电源功率不足,带载能力差。
2. 电源噪声过大。
3. 代码陷入死循环或内存泄漏。
1. 更换为独立电源和稳压模块。
2. 加强电源滤波(加电容)。
3. 检查代码逻辑,避免在循环内无限分配内存(如不停创建新对象)。
UART通信数据错乱 1. 波特率不匹配。
2. 共地不良。
3. 线路干扰。
4. 双方解析协议不一致。
1. 确认OpenMV与STM32波特率设置完全相同。
2. 检查并确保GND可靠连接。
3. 使用双绞线,远离干扰源。
4. 用串口助手分别监控双方收发数据,逐字节比对。
识别帧率过低 1. 图像分辨率设置过高。
2. ROI区域过大。
3. 算法过于复杂(如同时运行多个 find_blobs )。
4. 使用了未优化的Python循环。
1. 降低 set_framesize (如从VGA降到QVGA)。
2. 缩小ROI。
3. 优化算法,合并识别步骤。
4. 尽量使用OpenMV内置的、用C实现的函数,避免手写Python像素级循环。
特定光照下识别失败 1. 颜色阈值固定,不适应环境光。
2. 反光或阴影干扰。
1. 使用动态阈值或LAB颜色空间。
2. 调整摄像头安装角度避开反光。考虑加偏振镜。
3. 在现场光下重新校准阈值。
识别延迟大 1. 帧率低(见上一条)。
2. 通信数据包过大或发送过于频繁。
3. 算法处理耗时过长。
1. 提升帧率。
2. 精简通信协议,只发送必要数据,降低发送频率(如每2帧发一次)。
3. 算法优化,使用 clock() 函数测量各步骤耗时,定位瓶颈。

6.2 性能优化实战技巧

  1. 分辨率与帧率的权衡 sensor.set_framesize() 是性能的最大杠杆。QVGA (320x240) 是智能车视觉的甜点分辨率,在大多数H7平台上能跑到30fps以上。如果还嫌慢,可以尝试QQVGA (160x120)。不要盲目追求高分辨率。
  2. 内存是稀缺资源 :MicroPython环境内存有限。避免在全局区定义大数组,避免在循环内不断创建新的image对象。如果需要处理多帧图像,考虑复用对象。
  3. 算法顺序优化 :先做成本低、过滤性强的操作。例如,先设定小ROI,再进行颜色转换和二值化,最后执行 find_blobs 。如果先用 find_blobs 在全图搜索,会浪费大量计算在无关区域。
  4. 利用“快”函数 img.find_blobs img.find_qrcodes 快得多。如果不需要,就不要调用耗时的函数。 img.get_pixel 在循环中极慢,应尽量避免。
  5. 关闭不用的传感器 :如果只用到一个摄像头,确保其他可能的传感器(如板载加速度计)被禁用或置于低功耗模式。

7. 从实验室到赛场的终极准备清单

比赛前夜的调试往往决定胜负。以下清单是我从多次比赛中总结的,务必逐项核对:

  • [ ] 电源系统 :OpenMV是否由独立电池供电?电源入口处是否已焊接滤波电容?电压是否稳定在额定值?
  • [ ] 通信测试 :在电机全速空转、舵机快速摆动的情况下,通过串口助手观察UART数据是否依然稳定、无错帧?
  • [ ] 光照适应性 :是否已在比赛场馆(或模拟场馆光照条件)下,重新校准了所有颜色阈值、曝光参数?是否测试了从阴暗处到强光下的过渡?
  • [ ] 机械稳定性 :用力摇晃车身,摄像头是否牢固无晃动?减震措施是否有效?
  • [ ] 代码版本 :OpenMV和STM32内烧录的代码是否为最终确认版?是否有备份?
  • [ ] 故障恢复 :代码中是否加入了看门狗(Watchdog)或超时重启机制?当识别长时间失效时,是否有默认的安全策略(如缓慢减速、沿边行驶)?
  • [ ] 参数可调性 :是否将关键阈值参数(如色块阈值、面积阈值)设计为可通过串口命令在线修改?这样在赛场边最后几分钟还可以微调。
  • [ ] 视觉冗余 :是否考虑了视觉完全失效的情况?例如,是否可以结合编码器或陀螺仪数据,在一段时间内未收到有效视觉数据时,切换至惯性导航模式?

最后,也是最重要的一点: 相信你的系统,但也要接受它的局限性 。嵌入式视觉在高速动态环境下不可能100%可靠。一个好的竞赛策略,是让视觉系统在状态好时提供精准导航,在状态不佳时(如强光干扰、元素被遮挡)能安全降级,依靠其他传感器或保守策略完成比赛。把OpenMV当作一个强大但需要精心呵护的伙伴,理解它,驯服它,它就能在赛场上为你带来巨大的优势。

HTML元素的隐藏四种方法 HTML元素的隐藏四种方法 一、方法一:display设置为none 元素不显示,也不占据任何位置,不占据任何空间(和不存在一样) <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content 阅读详情

相关推荐

关于HTML隐藏方式,干货满满

opacity: 0 | ✔️ | ✔️ | 无 | ✔️ || visibility: hidden | ✔️ | ❌ | 无 | ✔️ || display: none | ❌ | ❌ | 可能 | ❌ |- **彻底移除元素** → 用`display: none`- **语义化隐藏** → 用`hidden`属性。

xxx060214的博客 2857

三种隐藏 HTML 元素的方式

在网页应用中,显示/隐藏某个元素或组件是一件经常要做的事情,尤其是在目前比较流行的单页应用中。 总体而言,有 3 种方式来实现 CSS 的 display: none; CSS 的 visibility: hidden; HTML5 的 hidden 属性(boolean) 它们之间有相同点和不同点。相同点很简单,都能使添加了这个属性的元素及其子元素『不被看见』。这篇文章着重来比较一下它们之间的差异。 display: none; 添加了这个属性的元素: 不占据页面空间(不影响布局),因为这个

qq_45272642的博客 8661

html怎么隐藏一个元素,html怎么隐藏div元素

html隐藏div元素的方法:1、在div标签中使用hidden属性,添加“hidden="hidden"”语句即可。2、在div标签中使用style属性,添加“display: none;”样式即可。本教程操作环境:windows7系统、CSS3&&HTML5版、Dell G3电脑。方法1:使用hidden属性html hidden 属性规定对元素进行隐藏。如果使用该属性,则会隐...

weixin_33121345的博客 4820

html5 css 隐藏,通过CSS来隐藏元素的几种方法总结

隐藏和显示一个元素是响应式网页设计不可或缺的一个功能。我们通过CSS有多种方法可以隐藏一个元素,这里我们就对这些方法进行一个总结。通过display属性来隐藏元素在HTML页面上所有的元素的形状都是规则的矩形,元素的这种行为是通过CSS的盒模型来解释的。如果我们通过display属性来隐藏一个元素,那么就意味着这个元素不会被在页面中生成。在这个元素中的任何内容,或者它的子元素也会同时被隐藏。另外如...

weixin_32306683的博客 596

html 隐藏一个元素的方法

CSS display的值是none。 type="hidden"的表单元素。 宽度和高度都显式设置为0。 一个祖先元素是隐藏的,该元素是不会在页面上显示 CSS visibility的值是hidden CSS opacity的指是0 ...

qq_41370724的博客 2043

关于htmlcss中隐藏一个元素的几种方法

1,将元素的display属性设为none <div style="display:none">看不见我</div> 2,<input>标签元素的type属性设为hidden <input type="hidden" name="看不见我"> 3,将元素的width和heigth都设为0 <di...

weixin_30251587的博客 143

css元素hover時控制另一个元素的显示隐藏

css元素hover時控制另一个元素的显示隐藏

u011511086的专栏 6万+

jquery html隐藏标签,js(jQuery)控制html元素隐藏

有时候我们会根据不同情况,隐藏某些html标签,利用来JS控制页面控件显示和隐藏有两种方法,两种方法分别利用HTML的style中的两个属性,两种方法的不同之处在于控件隐藏后是否还在页面上占空位。下面是用js来实现:方法一:document.getElementById("EleId").style.visibility="hidden";document.getElementById("EleI...

weixin_28454475的博客 898

html标签不占位置,css隐藏不占位置的方法是什么?

用 CSS 隐藏页面元素有许多种方法。你可以将 opacity 设为 0、将 visibility 设为 hidden、将 display 设为 none 或者将 position 设为 absolute 然后将位置设到不可见区域。css隐藏元素的每个方法之前是存在着细微的不同,这些不同决定了在一个特定的场合下使用哪一个方法。下面我们来看一下css隐藏不占位置的方法。css使用Display属性隐...

weixin_32801929的博客 1838

三、JavaScript之隐藏HTML元素

一、代码如下 二、点击前效果 三、点击后效果 <!DOCTYPE html> <html> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <body> <h2>JavaScript 能够做什么</...

weixin_30346033的博客 194

jquery使用hide方法隐藏指定id的元素

转载:https://www.jb51.net/article/63064.htm 下面的代码通过jQuery的hide方法隐藏了id=test的元素 <!DOCTYPE html> <html> <head> <script src="js/jquery.min.js"> </script> <script&gt...

qq_34266804的博客 3401

html表单复选框隐藏,Zend Form:Checkbox元素显示为隐藏字段?

我想在表单中添加一个简单的复选框:$element = new Zend_Form_Element_Checkbox('dont');$element->setDescription('Check this box if you don\'t want to do this action.');$form->addElement($element);但是,这就是html的样子:Don...

weixin_39550940的博客 260

html 自动隐藏属性,hidden

hidden版本:HTML5全局属性hidden是一个布尔属性,表示一个元素尚未或者不再相关。例如,它可以被用来隐藏一个页面元素直到登录完毕。如果一个元素设置了这个属性,它就不会被显示。hidden属性不能用于隐藏那些可以在其它板块中合理显示的内容。例如,用hidden属性去隐藏一个选项卡对话框种的面板是不正确的,因为选项卡界面只不过是溢出显示的一种——一个可以等量于一个只显示所有form表单控件...

weixin_29574211的博客 1166

Html获取父 同级 子元素,以及文本超出隐藏

Html里面通过JQ获取父元素、同级元素、子元素parent()获取父级元素 next()获取同级元素 children()获取子元素 children(‘span’)获取子元素里面的span元素 children(‘.myb’)获取子元素里面class为myb的元素文本超出隐藏.postcontent { width: 100%; overflow: hidden;

haeasringnar的博客 4542

设置块级元素的隐藏和显示

设置块级元素的隐藏和显示 Html id <input id="type" type="password" class="input-text" autocomplete="off" 点击隐藏/显示 JavaScript function hiden() { if(document.getElementById('sel_1

qq_27615455的博客 1937

如何使用 JavaScript 显示/隐藏或切换 DIV 元素

在 jQuery 中,您可以使用 .toggle() 方法来切换元素,任何元素。但是,如果您正在寻找纯 JavaScript 解决方案,那么这里就是。我在这里分享一个简单的代码,它展示了使用 JavaScript 切换或显示/隐藏 DIV 元素是多么容易。 相关:使用 jQuery 基于下拉选择切换 DIV 元素 <div> 元素通常用作容器,它还会包含许多其他元素,例如 form。您可能希望在满足某些条件时显示或隐藏 <div> 元素。 这是一个常见的场景。我希望在按钮.

allway2的博客 3322

【jquery】jquery怎么实现点击一个按钮控制一个div的显示和隐藏

示例html: <div class="abc" style="display:none"></div> <input type="button" class="but" /> jquery: <script> $(document).ready(function(e) { $(".but").clic...

weixin_30502157的博客 461

关于tr隐藏的问题

<br />如果通过tr的id来隐藏页面是不好用的,一般都是在外面加上一个div<br /> <br />看代码<br /> <br /><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">   <br /><html xmlns="http://www.w3.org/1999/xhtml">   <br /><head

serryzhao的专栏 1876
上一篇: 从奇安信春招逻辑题看网络安全岗位的思维门槛
下一篇: 免激活码搭建Python开发环境:PyCharm社区版+Python配置指南
weixin_34212762
博客等级 码龄11年 5980粉丝 837原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值