Image переписан так, чтобы обойти баг Chrome, но не возиться с переопределением стилей noscript
This commit is contained in:
@@ -1,19 +1,18 @@
|
|||||||
<noscript>
|
|
||||||
<img
|
<img
|
||||||
{loading}
|
|
||||||
{...others}
|
|
||||||
/>
|
|
||||||
</noscript>
|
|
||||||
|
|
||||||
{#if dynamic}
|
|
||||||
<img
|
|
||||||
{loading}
|
|
||||||
{...others}
|
|
||||||
bind:this={node}
|
bind:this={node}
|
||||||
class="dynamic"
|
class:loaded
|
||||||
class:visible
|
class="noscript-visible"
|
||||||
|
{loading}
|
||||||
|
{...others}
|
||||||
/>
|
/>
|
||||||
{/if}
|
|
||||||
|
<noscript>
|
||||||
|
<style>
|
||||||
|
.noscript-visible {
|
||||||
|
opacity: 1 !important;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</noscript>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
let {
|
let {
|
||||||
@@ -22,12 +21,7 @@
|
|||||||
} = $props()
|
} = $props()
|
||||||
|
|
||||||
let node = $state()
|
let node = $state()
|
||||||
let visible = $state(false)
|
let loaded = $state(false)
|
||||||
let dynamic = $state(false)
|
|
||||||
|
|
||||||
$effect(() => {
|
|
||||||
dynamic = true
|
|
||||||
})
|
|
||||||
|
|
||||||
$effect(() => {
|
$effect(() => {
|
||||||
if (!node) {
|
if (!node) {
|
||||||
@@ -35,39 +29,26 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (node.complete) {
|
if (node.complete) {
|
||||||
visible = true
|
loaded = true
|
||||||
} else {
|
} else {
|
||||||
node.addEventListener('load', () => visible = true, { once: true })
|
node.addEventListener('load', () => loaded = true, { once: true })
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="scss">
|
<style lang="scss">
|
||||||
/*
|
|
||||||
Ideally, <noscript> could use display: contents so it wouldn't create a block container.
|
|
||||||
However, due to a Chrome bug, we must set it to display: block to ensure proper layout.
|
|
||||||
This ensures that fallback images inside <noscript> scale correctly to the container width.
|
|
||||||
https://issues.chromium.org/issues/41179501
|
|
||||||
*/
|
|
||||||
noscript,
|
|
||||||
img {
|
img {
|
||||||
display: block;
|
display: block;
|
||||||
max-width: 100%;
|
max-width: 100%;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
height: auto;
|
height: auto;
|
||||||
}
|
|
||||||
|
|
||||||
img {
|
|
||||||
object-fit: cover;
|
object-fit: cover;
|
||||||
object-position: top center;
|
object-position: top center;
|
||||||
|
|
||||||
&.dynamic {
|
|
||||||
transition: opacity 0.4s ease;
|
transition: opacity 0.4s ease;
|
||||||
opacity: 0;
|
opacity: 0;
|
||||||
|
|
||||||
&.visible {
|
&.loaded {
|
||||||
opacity: 1;
|
opacity: 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
</style>
|
</style>
|
||||||
Reference in New Issue
Block a user