如何有条件地显示一个元素,保持其占用空间?

Posted

技术标签:

【中文标题】如何有条件地显示一个元素,保持其占用空间?【英文标题】:How to conditionally show an element, keeping its occupied space? 【发布时间】:2018-10-03 21:03:57 【问题描述】:

Vue.js 有两个条件关键字:v-if and v-show,它允许基于条件的元素可见或不可见。区别是

不同之处在于v-show 的元素总是 渲染并保留在 DOM 中; v-show 只切换显示 CSS 元素的属性。

我认为它会对不可见元素占用的空间产生影响,但在任何这些情况下,当条件为 false 时,元素占用的空间是无的。

这意味着,例如,在三个元素的跨度中,占据屏幕宽度的 100%,不可见的位置被下一个占据,就像在这个 CSS Grid 示例中一样:

new Vue(
  el: "#app",
  data: 
    visible: true
  ,
  mounted() 
    setInterval(() => this.visible = !this.visible, 1000)
  
)
#app 
  display: grid;
  grid-template-columns: auto auto auto;


#app div 
  border-style: solid;
  border-width: 1;
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.16/vue.js"></script>
<div id="app">
  <div>one</div>
  <div v-if="visible">two</div>
  <div>three</div>
</div>

是否有一种简单的方法可以隐藏元素的内容(使其不可见),但保留其空间? (在上面的例子中,中心元素出现和消失 - 但其他两个没有移动)

【问题讨论】:

你可能需要在内部元素上设置一个固定的宽度,或者使用 display: flex 和 justify 之间的内容。 【参考方案1】:

见MDN - CSS visibility,

visibility CSS 属性可以在不影响文档布局的情况下显示或隐藏元素(即,无论元素是否可见,都会为元素创建空间)

所以,使用Vue's dynamic style 将您的表达式绑定到 CSS 可见性。

new Vue(
  el: "#app",
  data: 
    visible: true
  ,
  mounted() 
    setInterval(() => this.visible = !this.visible, 1000)
  
)
#app 
  display: grid;
  grid-template-columns: auto auto auto;


#app div 
  border-style: solid;
  border-width: 1;
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.16/vue.js"></script>
<div id="app">
  <div>one</div>
  <div :style="visibility: visible ? 'visible' : 'hidden'">two</div>
  <div>three</div>
  visible
</div>

【讨论】:

【参考方案2】:

看看这个:https://forum.vuejs.org/t/vue-style-visibility-hidden-on-v-show-how/58293

您可以使用自定义指令来实现它:

Vue.directive('visible', function(el, binding) 
    el.style.visibility = !!binding.value ? 'visible' : 'hidden';
);

然后使用

<div v-visible="your_condition" ... >

【讨论】:

【参考方案3】:

使用 opacity = 0 或 1 绑定样式。

new Vue(
  el: "#app",
  data: 
    visible: true
  ,
  mounted() 
    setInterval(() => this.visible = !this.visible, 1000)
  
)
.layout 
  display: grid;
  grid-template-columns: auto auto auto;


.your-column 
  border-style: solid;
  border-width: 1;
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.16/vue.js"></script>
<div id="app">
  <div class="layout">
    <div class="your-column">one</div>
    <div class="your-column" :style="'opacity':visible?1:0">two</div>
    <div class="your-column">three</div>
  </div>
</div>

【讨论】:

【参考方案4】:

new Vue(
  el: "#app",
  data: 
    visible: true
  ,
  mounted() 
    setInterval(() => this.visible = !this.visible, 1000)
  
)
#app 
  display: grid;
  grid-template-columns: 1fr 1fr 1fr;


#app div 
  border-style: solid;
  border-width: 1;


#app div:last-child
  grid-column:3;
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.16/vue.js"></script>
<div id="app">
  <div>one</div>
  <div v-if="visible">two</div>
  <div>three</div>
</div>

【讨论】:

以上是关于如何有条件地显示一个元素,保持其占用空间?的主要内容,如果未能解决你的问题,请参考以下文章

队列练习之Example006-设计队列要求入队时增加队列空间,出队后出队元素所占用空间可重复使用,以保持队列空间只增不减,并且要求入队操作和出队操作的时间复杂度都为O

显示 None 正在占用空间

Flutter - 如何让方形小部件连续占用其最大可能空间?

占用太多空间的 Swiftui 小部件列表

显示无占用空间

Python如何查看变量占用空间大小