nuxt/vue2 如何设置堆叠 div 的宽度以匹配堆叠中的特定 div
nuxt/vue2 how to set width of stacked divs to match a specific div in the stack
找不到完全相同的问题,所以如果这是重复的,请重定向我。
我正在与 Nuxt 合作。我有一个图像组件,应该能够处理不同宽度的不同图像。图像将根据 mobile/desktop 视图发生变化,这意味着图像可以根据屏幕变为 wider/narrower。在它的下方和上方,我有一个标题和类似这样的描述:
<div> //flexbox with flex-direction column and justify center
<h2 >{{insightsImage.title}}</h3>
<img :src='ifMobile ? mobileImage.url : image.url' />
<p>some tekst could be very long</p>
</div>
我希望标题和
始终具有与图像相同的最大宽度,并且它位于页面的中央。因此,如果我有一个很长的描述,它会被切断并保持整齐地堆叠。
像这样:
我已经尝试过各种方法,并且有一个有效的解决方案,但我想知道是否有更好的,也许更 vue 的方式?
理想情况下,我只用 css 就可以做到这一点,但我还没有找到任何适用于可变图像宽度的解决方案。
我目前的解决方案是这样的:
<div>
<h2 :style='`max-width: ${imageSize}`'>{{insightsImage.title}}</h3>
<img :src='ifMobile ? mobileImage.url : image.url' />
<p :style='`max-width: ${imageSize}`'/>some tekst</p>
</div>
export default defineComponent({
computed: {
imageSize(): string {
if (!process.browser) return '' // need this because Image object does not exist on server side
const image = new Image();
image.src = this.image.url;
return `${image.width > 0 ? image.width : 800}px` // need this 0 check because sometimes for some reason it initially returns 0 as width (might be because of SSR), and most images will be minimal 800px wide
}
在我发现的所有解决方案中,这个感觉最不成熟,但仍不完美
研究过像这样使用 refs:
但官方文档建议不要(滥用)在计算属性中使用 refs,并且由于 ref 未更新,因此即使图像 src 发生变化,计算宽度也不会改变。
还有其他建议吗?
好的,如果有人需要这个,那么回答我自己的问题。仍然不是 100% 满意,因为我仍在使用内联样式(但也许我只是吹毛求疵)。我原来的解决方案并不总是有效,因为当路由到页面时,图像大小有时为 0(如评论中所述)。
经过一些尝试,我终于找到了使用 vue Mounted/Updated 和 image.onload 的组合来在调整屏幕大小时跟踪图像宽度。所以我得到了这个:
<div>
<h2 :style='`max-width: ${imageSize}`'>{{insightsImage.title}}</h3>
<img :src='ifMobile ? mobileImage.url : image.url' />
<p :style='`max-width: ${imageSize}`'/>some tekst</p>
</div>
export default defineComponent({
data() {
return {
imageSize: ''
}
},
updated() {
this.updateImageSize()
},
mounted() {
this.updateImageSize()
},
methods: {
updateImageSize() {
const vm = this
const image = new Image()
image.src = this.image.url
image.onload = function() {
vm.imageSize = `${image.width}px`
}
}
}
}
})
找不到完全相同的问题,所以如果这是重复的,请重定向我。 我正在与 Nuxt 合作。我有一个图像组件,应该能够处理不同宽度的不同图像。图像将根据 mobile/desktop 视图发生变化,这意味着图像可以根据屏幕变为 wider/narrower。在它的下方和上方,我有一个标题和类似这样的描述:
<div> //flexbox with flex-direction column and justify center
<h2 >{{insightsImage.title}}</h3>
<img :src='ifMobile ? mobileImage.url : image.url' />
<p>some tekst could be very long</p>
</div>
我希望标题和
始终具有与图像相同的最大宽度,并且它位于页面的中央。因此,如果我有一个很长的描述,它会被切断并保持整齐地堆叠。
像这样:
我已经尝试过各种方法,并且有一个有效的解决方案,但我想知道是否有更好的,也许更 vue 的方式?
理想情况下,我只用 css 就可以做到这一点,但我还没有找到任何适用于可变图像宽度的解决方案。
我目前的解决方案是这样的:
<div>
<h2 :style='`max-width: ${imageSize}`'>{{insightsImage.title}}</h3>
<img :src='ifMobile ? mobileImage.url : image.url' />
<p :style='`max-width: ${imageSize}`'/>some tekst</p>
</div>
export default defineComponent({
computed: {
imageSize(): string {
if (!process.browser) return '' // need this because Image object does not exist on server side
const image = new Image();
image.src = this.image.url;
return `${image.width > 0 ? image.width : 800}px` // need this 0 check because sometimes for some reason it initially returns 0 as width (might be because of SSR), and most images will be minimal 800px wide
}
在我发现的所有解决方案中,这个感觉最不成熟,但仍不完美
研究过像这样使用 refs:
但官方文档建议不要(滥用)在计算属性中使用 refs,并且由于 ref 未更新,因此即使图像 src 发生变化,计算宽度也不会改变。
还有其他建议吗?
好的,如果有人需要这个,那么回答我自己的问题。仍然不是 100% 满意,因为我仍在使用内联样式(但也许我只是吹毛求疵)。我原来的解决方案并不总是有效,因为当路由到页面时,图像大小有时为 0(如评论中所述)。 经过一些尝试,我终于找到了使用 vue Mounted/Updated 和 image.onload 的组合来在调整屏幕大小时跟踪图像宽度。所以我得到了这个:
<div>
<h2 :style='`max-width: ${imageSize}`'>{{insightsImage.title}}</h3>
<img :src='ifMobile ? mobileImage.url : image.url' />
<p :style='`max-width: ${imageSize}`'/>some tekst</p>
</div>
export default defineComponent({
data() {
return {
imageSize: ''
}
},
updated() {
this.updateImageSize()
},
mounted() {
this.updateImageSize()
},
methods: {
updateImageSize() {
const vm = this
const image = new Image()
image.src = this.image.url
image.onload = function() {
vm.imageSize = `${image.width}px`
}
}
}
}
})