我是Vue的新手,正在学习CSS3的复杂性
我正在构建一个组件,可以在这里找到:https://codesandbox.io/s/yjp674ppxj
简而言之,我有一个具有相对位置的convert(datetime, substring(myDatetimeString, charindex(' ', myDatetimeString), 1000))
元素,然后有一个具有绝对位置的ul
元素的列表,并且我动态地计算了div
属性。
理想情况下,我希望文本出现在整个列表之后。但是,通过执行此操作,top
元素现在的高度为ul
。如何保持身高并保持相同的效果?
下面是纯html5和css3 MWE:
0px
ul {
position: relative;
border: solid 1px coral;
}
li {
position: absolute;
top: calc(10px * var(--index));
border: solid 0.5px black;
}
答案 0 :(得分:1)
您可以考虑使用边距最高的广告来代替position:absolute
ul {
position: relative;
border: solid 1px coral;
padding-top:8px;
}
li {
margin-top: -8px;
border: solid 0.5px black;
transition:0.5s all;
}
li:hover {
margin-top:-12px;
margin-bottom:4px;
}
<ul>
<li>list item</li>
<li>list item</li>
<li>list item</li>
<li>list item</li>
<li>list item</li>
</ul>
<p>test that shoudl be after list</p>
更新
您还可以考虑在悬停时进行转换:
ul {
position: relative;
border: solid 1px coral;
padding-top:8px;
}
li {
margin-top: -8px;
border: solid 0.5px black;
transition:0.5s all;
}
li:hover {
transform:translateY(-5px);
}
<ul>
<li>list item</li>
<li>list item</li>
<li>list item</li>
<li>list item</li>
<li>list item</li>
</ul>
<p>test that shoudl be after list</p>
答案 1 :(得分:1)
如果您想保留json = serializers.serialize('json', object_list, fields=('field1', 'field2'))
,可以执行以下操作:
更新您的 ListPerspective.vue :
position: absolute
通过在末尾添加一个带槽的列表元素。还要添加一种计算样式,即:
<ul class="mx-auto">
<ListPerspectiveItem
v-for="(alert, index) in alerts"
:key="alert.id"
:index="index"
:alert="alert"
:totalElements="alerts.length"
:verticalShift="15"
@close="remove(index)"
/>
<div :style="notificationMsg"><slot></slot></div>
</ul>
您计算出在通知下方显示消息所需的组件顶部总距离。
很遗憾,这要求您在父级(ListPerspective)组件中定义 data() {
return { verticalShift: 15 }
},
computed: {
notificationMsg() {
return `position: absolute; top: ${(this.alerts.length + 1) * this.verticalShift}px; margin-top: 20px;`;
}
}
并将其作为道具传递给 ListPerspectiveItem 。如果您是我,我会使用这样的基本配置创建一个简单的store,而不是在您的 ListPerspectiveItem 中将verticalShift
硬编码为默认值,我将从商店中获取,在 ListPerspective 组件中执行相同的操作,即:
15
最后要做的是通过将消息添加到广告位来更新您的 App.vue :
data() {
// generally you should bind store state properties as computed properties,
// but since it's a default, constant variable you shouldn't have to watch for it's changes
return { verticalShift: this.$store.state.defaults.css.verticalShift }
}
verticalShift: {
type: Number, default: this.$store.state.defaults.css.verticalShift
}