(HTML/Js) 循环元素可见性

(HTML/Js) Cycling element visibilities

var terminal = document.getElementById('terminal');
var vncScreen = document.getElementById('screen');
var video = document.getElementById('video');

var vncToggle = document.getElementById('vncToggle');
var termToggle = document.getElementById('terminalToggle');

termToggle.onclick = function toggleTerminal() {

  if (terminal.classList.contains('hide')) {
    terminal.classList.remove('hide'); 
    if (vncScreen.classList.contains('hide')) {} else {vncScreen.classList.add('hide')}
    if (video.classList.contains('hide')) {} else {video.classList.add('hide')}
  } else {
    terminal.classList.add('hide'); 
    if (video.classList.contains('hide')) {video.classList.remove('hide')} else {}
  }
}

vncToggle.onclick = function toggleVNC() {

  if (vncScreen.classList.contains('hide')) {
    vncScreen.classList.remove('hide'); 
    if (terminal.classList.contains('hide')) {} else {terminal.classList.add('hide')}
    if (video.classList.contains('hide')) {} else {video.classList.add('hide')}
  } else {
    vncScreen.classList.add('hide'); 
    if (video.classList.contains('hide')) {video.classList.remove('hide')} else {}
 }
}
.black-box {
  background: black;
  height: 500px;
  width: 500px;
  position: absolute;
}

.green-box {
  background: green;
  height: 500px;
  width: 500px;
  position: absolute;
}

.blue-box {
  background: blue;
  height: 500px;
  width: 500px;
  position: absolute;
}

.hide {
  display: none;
}
<button class="button" id="terminalToggle" title="Toggle Terminal">Toggle terminal</button>
<button class="button" id="vncToggle" title="Toggle Terminal">Toggle vnc</button>

<div id='video' class="black-box"></div>
<div id='screen' class="green-box hide"></div>
<div id='terminal' class="blue-box hide"></div>

基本上当你点击"Toggle terminal"它应该显示蓝色,然后如果你再次点击又回到黑色;当您单击 "Toggle vnc" 时,它应该显示为绿色,然后如果您再次单击则返回黑色。如果你点击 "Toggle vnc" 并且它已经是蓝色的,它应该变成绿色,反之亦然(但点击 "Toggle terminal")

我目前有以下 Js:

      var terminal = document.getElementById('terminal');          //video-like element
      var vncScreen = document.getElementById('screen');           //video-like element
      var video = document.getElementById('video');                //video-like element

      var vncToggle = document.getElementById('vncToggle');        //button
      var termToggle = document.getElementById('terminalToggle');  //button

      termToggle.onclick = function toggleTerminal() {
        terminal.classList.toggle('hide');
        vncScreen.classList.toggle('hide');
        video.classList.toggle('hide');
      }
      vncToggle.onclick = function toggleVNC() {
        vncScreen.classList.toggle('hide');
        terminal.classList.toggle('hide');
        video.classList.toggle('hide');
      }

css

.hide {
  display: none;
}

当我只有两个不同的 HTML 元素时,这种 class 切换方法有效。现在有 3 个,我不确定它是否会按预期工作。

video 最初是可见的,即 hide 不在其 classList

terminal 最初是隐藏的,即 hide 在其 classList

vncScreen 最初是隐藏的,即 hide 在其 classList

调用toggleTerminal()时:

如果调用toggleVNC()(在toggleTerminal()之后):

请注意,如果其中一个函数调用仅由它们自己切换,此方法将如何工作(前提是我删除了 toggleTerminal() 中的 vncScreen.classList.toggle('hide'); 和 [=31= 中的 terminal.classList.toggle('hide'); ]).

问题是我需要考虑 termTogglevncToggle 的任何按钮按下顺序。本质上我的目标是 "cycle" 这些元素使得:

1) "selected" 元素的切换(即 termToggle 对应于 terminal 元素的可见性 && vncToggle 对应于 vncScreen 元素的可见性)隐藏剩余的两个元素(分别为video && vncScreen || terminal && video

2) "selected" 元素的切换顺序不影响 1)

3) "selected" 元素的第二次切换将隐藏自身和另一个不是 video

的元素

关于如何最好地完成此任务有什么想法吗?

有一次我想做一些逻辑来评估 hide 是否包含在适当的 classList 中,然后手动添加或删除 hide class 因此,但这对我来说有点草率(idk,也许不是?)。

查看有问题的代码片段以了解功能,Js 冗余张贴在这里:

var terminal = document.getElementById('terminal');
var vncScreen = document.getElementById('screen');
var video = document.getElementById('video');

var vncToggle = document.getElementById('vncToggle');
var termToggle = document.getElementById('terminalToggle');

termToggle.onclick = function toggleTerminal() {

  if (terminal.classList.contains('hide')) {
    terminal.classList.remove('hide'); 
    if (vncScreen.classList.contains('hide')) {} else {vncScreen.classList.add('hide')}
    if (video.classList.contains('hide')) {} else {video.classList.add('hide')}
  } else {
    terminal.classList.add('hide'); 
    if (video.classList.contains('hide')) {video.classList.remove('hide')} else {}
  }
}

vncToggle.onclick = function toggleVNC() {

  if (vncScreen.classList.contains('hide')) {
    vncScreen.classList.remove('hide'); 
    if (terminal.classList.contains('hide')) {} else {terminal.classList.add('hide')}
    if (video.classList.contains('hide')) {} else {video.classList.add('hide')}
  } else {
    vncScreen.classList.add('hide'); 
    if (video.classList.contains('hide')) {video.classList.remove('hide')} else {}
    }
}