Medium-like zoom on your pictures in pure JavaScript ππΌ
$ npm install --save medium-zoom
Or download the minified version.
No dependencies.
- π Image selection β apply the zoom to a selection of images
- π± Mouse, keyboard and gesture friendly β click anywhere, press a key or scroll away to dismiss the zoom
- π Event handling β triggers events when the zoom enters a new state
- π§ Customization β set your own margin, background and scroll offset
- π Link support β opens the link of the image in a new tab when a meta key is held (β or Ctrl)
- πΌ Image opener β when no link, opens the image source in a new tab when a meta key is held (β or Ctrl)
- π± Responsive β scales on mobile and desktop
- π Performant and lightweight β should be able to reach 60 fps
<script src="node_modules/medium-zoom/dist/medium-zoom.min.js"></script>
Or:
const mediumZoom = require('medium-zoom')
mediumZoom(<selector>, <options>)
By default, the zoom is applied to all scaled images (with HTML or CSS properties). You can specify the zoomable images with a CSS selector and add options.
Additionally, you can pass an array-like or an array of images to the plugin.
// CSS selector
mediumZoom('#cover')
// array-like
mediumZoom(document.querySelectorAll('[data-action="zoom"]'))
// array
const imagesToZoom = [
document.querySelector('#cover'),
...document.querySelectorAll('[data-action="zoom"]')
]
mediumZoom(imagesToZoom)
Options can be passed via a JavaScript object through the mediumZoom
call.
Properties | Type | Default | Description |
---|---|---|---|
margin | integer | 0 |
Space outside the zoomed image |
background | string | "#fff" |
Color of the overlay |
scrollOffset | integer | 48 |
Number of pixels to scroll to dismiss the zoom |
metaClick | boolean | true |
Enables the action on meta click (opens the link / image source) |
mediumZoom('[data-action="zoom"]', {
margin: 24,
background: '#000',
scrollOffset: 0,
metaClick: false
})
Triggers the zoom.
const zoom = mediumZoom('#my-image')
zoom.show()
Emits an event show
on animation start and shown
when completed.
Dismisses the zoom.
const zoom = mediumZoom('#my-image')
zoom.hide()
Emits an event hide
on animation start and hidden
when completed.
Shows the zoom when hidden, hides the zoom when shown.
const zoom = mediumZoom('#my-image')
zoom.toggle()
Updates and returns the options.
const zoom = mediumZoom('#my-image')
zoom.update({
background: '#000'
})
Registers the specified listener on each target of the zoom.
const zoom = mediumZoom('[data-action="zoom"]')
zoom.addEventListeners('hidden', () => {
// do something...
})
Event | Description |
---|---|
show | Fired immediately when the show instance method is called |
shown | Fired when the zoom has finished being animated |
hide | Fired immediately when the hide instance method is called |
hidden | Fired when the zoom out has finished being animated |
const zoom = mediumZoom('#image-tracked')
zoom.addEventListeners('show', event => {
// do something...
})
Images in post content
```js mediumZoom('.post img') ```One image by `id`
```js mediumZoom('#cover') ```Images with `data` attribute
```js mediumZoom('[data-action="zoom"]') ```External images
```js mediumZoom('img[src^="http"]') ```Images from a database
```js fetch('https://myapi.com/posts/{id}', { method: 'GET' }) .then(response => { const imagesToZoom = response.images .map(imgSrc => document.querySelector(`img[src=${imgSrc}]`))mediumZoom(imagesToZoom) })
</details>
<details>
<summary>Margins, overlay, scroll offset and click</summary>
```js
mediumZoom({
margin: 16,
background: '#000',
scrollOffset: 0,
metaClick: false
})
Trigger the zoom dynamically
```js const button = document.querySelector('#btn-zoom') const zoom = mediumZoom('#image')button.addEventListener('click', () => zoom.show())
</details>
<details>
<summary>Zoom counter</summary>
```js
let counter = 0
const zoom = mediumZoom('#image-tracked')
zoom.addEventListeners('show', event => {
console.log(`"${event.target.alt}" has been zoomed ${++counter} times`)
})
View demo π, go to the demo folder or read the article.
- Install the dependencies:
npm install
- Watch changes:
npm run dev
Need more options? Send a pull request!
MIT © François Chalifour