Add image aspect ratio to prevent page jumps

This commit is contained in:
Christoph Hagen 2025-01-14 20:19:30 +01:00
parent c1a3d22002
commit 4b448f3415
4 changed files with 22 additions and 5 deletions

View File

@ -52,10 +52,13 @@ struct ImageSet: HtmlProducer {
let prefix1x = "/\(image.outputImageFolder)/\(maxWidth)x\(maxHeight)" let prefix1x = "/\(image.outputImageFolder)/\(maxWidth)x\(maxHeight)"
let prefix2x = "/\(image.outputImageFolder)/\(maxWidth*2)x\(maxHeight*2)" let prefix2x = "/\(image.outputImageFolder)/\(maxWidth*2)x\(maxHeight*2)"
let imageSize = (image.getImageDimensions()?.scaledToFit(in: .init(width: maxWidth, height: maxHeight)))
.map { " width='\(Int($0.width))' height='\(Int($0.height))'" }
result += "<picture>" result += "<picture>"
result += "<source type='image/avif' srcset='\(prefix1x).avif 1x, \(prefix2x).avif 2x'/>" result += "<source type='image/avif' srcset='\(prefix1x).avif 1x, \(prefix2x).avif 2x'/>"
result += "<source type='image/webp' srcset='\(prefix1x).webp 1x, \(prefix1x).webp 2x'/>" result += "<source type='image/webp' srcset='\(prefix1x).webp 1x, \(prefix1x).webp 2x'/>"
result += "<img srcset='\(prefix2x)\(fileExtension) 2x' src='\(prefix1x)\(fileExtension)' loading='lazy'\(imageAltText)\(extraAttributes)/>" result += "<img srcset='\(prefix2x)\(fileExtension) 2x' src='\(prefix1x)\(fileExtension)'\(imageSize ?? "") loading='lazy'\(imageAltText)\(extraAttributes)/>"
result += "</picture>" result += "</picture>"
} }
} }

View File

@ -21,7 +21,6 @@ import SFSafeSymbols
- Graphs, Map, GPX for hikes - Graphs, Map, GPX for hikes
**Generation** **Generation**
- ImageSet: Specify image aspect ratio (width, height) to prevent page jumps
- Consistency: Check output folder for unused files - Consistency: Check output folder for unused files
- Empty properties: Show warnings for empty link previews, etc. - Empty properties: Show warnings for empty link previews, etc.

View File

@ -152,11 +152,22 @@ final class FileResource: Item, LocalizedItem {
} }
func determineImageDimensions() { func determineImageDimensions() {
let size = getImageDimensions() let size = getCurrentImageDimensions()
self.update(imageDimensions: size) self.update(imageDimensions: size)
} }
private func getImageDimensions() -> CGSize? { func getImageDimensions() -> CGSize? {
if let imageDimensions {
return imageDimensions
}
guard let size = getCurrentImageDimensions() else {
return nil
}
self.update(imageDimensions: size)
return size
}
private func getCurrentImageDimensions() -> CGSize? {
guard type.isImage else { guard type.isImage else {
return nil return nil
} }

View File

@ -31,7 +31,8 @@ struct ImageGallery: HtmlProducer {
let needsPagination = images.count > 1 let needsPagination = images.count > 1
for image in images { for image in images {
result += "<div class='swiper-slide'>" let sizeText = image.image.getImageDimensions().map { " style='aspect-ratio: \(Int($0.width)) / \(Int($0.height))'"}
result += "<div class='swiper-slide'\(sizeText ?? "")>"
result += image.content result += image.content
if needsPagination { if needsPagination {
result += "<div class='swiper-lazy-preloader swiper-lazy-preloader-white'></div>" result += "<div class='swiper-lazy-preloader swiper-lazy-preloader-white'></div>"
@ -57,6 +58,9 @@ struct ImageGallery: HtmlProducer {
return """ return """
var swiper_\(id) = new Swiper("#\(id)", { var swiper_\(id) = new Swiper("#\(id)", {
loop: true, loop: true,
lazy: {
loadPrevNext: false,
},
slidesPerView: 1, slidesPerView: 1,
spaceBetween: 30, spaceBetween: 30,
centeredSlides: true, centeredSlides: true,