You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决P5.js中输入框被Div元素遮挡的问题?

P5.js输入框被Div遮挡的解决方法

问题描述

刚接触P5.js,希望创建一个可隐藏的输入框,显示时位于带文本的Div中,但目前Div绘制在输入框(newSupportDistance)前方,调用.show()方法无法将输入框置于上层。

相关代码

JavaScript代码

let borderHeight = 800;
let borderWidth = 1500;
let fixedSupportArray = [];
let rollingSupportArray = [];
let verticalForces = [];
let moments = [];
let wallSupports = [false, false];
var simpleSupportDiv;
var wallSupportDiv;
var simpleSupportDivShown = false;
var wallSupportDivShown = false;

function setup() {
  createCanvas(borderWidth, borderHeight);

  // default values
  let beamLength = 5;

  // creating border lines
  strokeWeight(4);
  stroke(0);
  fill(220);
  rect(0,0,borderWidth,borderHeight);

  // creating title
  fill(0);
  textSize(32);
  strokeWeight(1);
  text("Static Beam Analysis",borderWidth/2-150,40);

  // creating input texts
  textSize(16);
  strokeWeight(0);
  text("Enter Beam Length",10,25);
  text("Select Support Type",10,75);
  text("Select Force Type",10,220);

  // creating input fields
  beamLengthInput = createInput('5');
  beamLengthInput.position(155,12);
  beamLengthInput.size(32,14);

  beamLengthUnitsInput = createSelect();
  beamLengthUnitsInput.position(202,12);
  beamLengthUnitsInput.size(35,20);
  beamLengthUnitsInput.option("km");
  beamLengthUnitsInput.option("m");
  beamLengthUnitsInput.option("cm");
  beamLengthUnitsInput.option("mm");
  beamLengthUnitsInput.selected("m");

  supportTypeInput = createSelect();
  supportTypeInput.position(170,60);
  supportTypeInput.size(140,20);
  supportTypeInput.option("None");
  supportTypeInput.option("Rolling Support");
  supportTypeInput.option("Fixed Support");
  supportTypeInput.option("Wall Support");
  supportTypeInput.selected("Rolling Support");

  newSupportDistance = createInput('0');
  newSupportDistance.position(50,130);
  newSupportDistance.size(40,12);

  //creating input Divs
  simpleSupportDiv = createDiv('<p>Enter support distance x from left side<p>');
  simpleSupportDiv.position(20,95);
  simpleSupportDiv.size(300,100);
  simpleSupportDiv.class('inputDiv');
  
  wallSupportDiv = createDiv("   Enter the side of the support");
  wallSupportDiv.position(20,95);
  wallSupportDiv.size(300,100);
  wallSupportDiv.class('inputDiv');

  // drawing beam
  fill('#27D1EB');
  strokeWeight(2);
  rect(400,350,borderWidth-800,100);
  line(400,570,400+borderWidth-800,570);
}

function draw() {
  // total length line
  strokeWeight(0);
  fill(0);
  textSize(16);
  text(beamLengthInput.value().concat(" ".concat(beamLengthUnitsInput.selected())),borderWidth/2-10,595);

  // changing displayed div for inputs
  if (supportTypeInput.value() == "Rolling Support" || supportTypeInput.value() == "Fixed Support") {
    if (simpleSupportDivShown == false) {
      simpleSupportDiv.show();
      wallSupportDiv.hide();
      simpleSupportDivShown = true;
      wallSupportDivShown = false;
    }
    newSupportDistance.show()
  }
  else if (supportTypeInput.value() == "Wall Support") {
    if (wallSupportDivShown == false) {
      simpleSupportDiv.hide();
      wallSupportDiv.show();
      wallSupportDivShown = true;
      simpleSupportDivShown = false;
    }   
  }
  else {
    simpleSupportDiv.hide();
    wallSupportDiv.hide();
    wallSupportDivShown = false;
    simpleSupportDivShown = false;
  }
}

HTML代码

<script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/1.9.0/p5.js"></script>

解决方法

问题根源是DOM元素的创建顺序决定层级:P5.js中后创建的元素默认z-index更高,会覆盖先创建的元素。你先创建了newSupportDistance输入框,之后才创建Div,导致Div盖住输入框。以下三种方案任选:

方案1:调整元素创建顺序

把输入框的创建代码移到Div之后,让输入框成为后创建的元素,自然处于上层:

// 先创建Div
simpleSupportDiv = createDiv('<p>Enter support distance x from left side<p>');
simpleSupportDiv.position(20,95);
simpleSupportDiv.size(300,100);
simpleSupportDiv.class('inputDiv');

wallSupportDiv = createDiv("   Enter the side of the support");
wallSupportDiv.position(20,95);
wallSupportDiv.size(300,100);
wallSupportDiv.class('inputDiv');

// 再创建输入框
newSupportDistance = createInput('0');
newSupportDistance.position(50,130);
newSupportDistance.size(40,12);

方案2:手动设置z-index层级

如果不想调整创建顺序,直接给输入框设置更高的z-index值,强制让它处于上层:

newSupportDistance = createInput('0');
newSupportDistance.position(50,130);
newSupportDistance.size(40,12);
// 设置z-index为10(大于Div默认的层级)
newSupportDistance.style('z-index', '10');

方案3:将输入框嵌套进Div(推荐)

把输入框作为Div的子元素,这样输入框会和Div绑定,既不会被遮挡,也能跟着Div一起显示/隐藏:

// 创建Div
simpleSupportDiv = createDiv('<p>Enter support distance x from left side<p>');
simpleSupportDiv.position(20,95);
simpleSupportDiv.size(300,100);
simpleSupportDiv.class('inputDiv');

// 创建输入框并设置父元素为Div
newSupportDistance = createInput('0');
newSupportDistance.parent(simpleSupportDiv); // 关键:指定父容器
newSupportDistance.position(30, 40); // 此处坐标为Div内部的相对位置

// 同理处理wallSupportDiv...

内容的提问来源于stack exchange,提问作者Joseph Manning

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 10:50:59