23 |
Overflowing text to show scroll behavior
24 |
Cras mattis consectetur purus sit amet fermentum. Cras justo odio, dapibus ac facilisis in,
25 | egestas eget quam. Morbi leo risus, porta ac consectetur ac, vestibulum at eros.
26 |
Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Vivamus sagittis lacus
27 | vel augue laoreet rutrum faucibus dolor auctor.
28 |
Aenean lacinia bibendum nulla sed consectetur. Praesent commodo cursus magna, vel scelerisque
29 | nisl consectetur et. Donec sed odio dui. Donec ullamcorper nulla non metus auctor fringilla.
30 |
31 |
Cras mattis consectetur purus sit amet fermentum. Cras justo odio, dapibus ac facilisis in,
32 | egestas eget quam. Morbi leo risus, porta ac consectetur ac, vestibulum at eros.
33 |
34 |
49 |
50 |
Overflowing text to show scroll behavior
51 |
Cras mattis consectetur purus sit amet fermentum. Cras justo odio, dapibus ac facilisis in,
52 | egestas eget quam. Morbi leo risus, porta ac consectetur ac, vestibulum at eros.
53 |
Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Vivamus sagittis lacus
54 | vel augue laoreet rutrum faucibus dolor auctor.
55 |
Aenean lacinia bibendum nulla sed consectetur. Praesent commodo cursus magna, vel scelerisque
56 | nisl consectetur et. Donec sed odio dui. Donec ullamcorper nulla non metus auctor fringilla.
57 |
58 |
Cras mattis consectetur purus sit amet fermentum. Cras justo odio, dapibus ac facilisis in,
59 | egestas eget quam. Morbi leo risus, porta ac consectetur ac, vestibulum at eros.
60 |
Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Vivamus sagittis lacus
61 | vel augue laoreet rutrum faucibus dolor auctor.
62 |
Aenean lacinia bibendum nulla sed consectetur. Praesent commodo cursus magna, vel scelerisque
63 | nisl consectetur et. Donec sed odio dui. Donec ullamcorper nulla non metus auctor fringilla.
64 |
65 |
Cras mattis consectetur purus sit amet fermentum. Cras justo odio, dapibus ac facilisis in,
66 | egestas eget quam. Morbi leo risus, porta ac consectetur ac, vestibulum at eros.
67 |
Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Vivamus sagittis lacus
68 | vel augue laoreet rutrum faucibus dolor auctor.
69 |
Aenean lacinia bibendum nulla sed consectetur. Praesent commodo cursus magna, vel scelerisque
70 | nisl consectetur et. Donec sed odio dui. Donec ullamcorper nulla non metus auctor fringilla.
71 |
72 |
Cras mattis consectetur purus sit amet fermentum. Cras justo odio, dapibus ac facilisis in,
73 | egestas eget quam. Morbi leo risus, porta ac consectetur ac, vestibulum at eros.
74 |
Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Vivamus sagittis lacus
75 | vel augue laoreet rutrum faucibus dolor auctor.
76 |
Aenean lacinia bibendum nulla sed consectetur. Praesent commodo cursus magna, vel scelerisque
77 | nisl consectetur et. Donec sed odio dui. Donec ullamcorper nulla non metus auctor fringilla.
78 |
79 |
Cras mattis consectetur purus sit amet fermentum. Cras justo odio, dapibus ac facilisis in,
80 | egestas eget quam. Morbi leo risus, porta ac consectetur ac, vestibulum at eros.
81 |
Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Vivamus sagittis lacus
82 | vel augue laoreet rutrum faucibus dolor auctor.
83 |
Aenean lacinia bibendum nulla sed consectetur. Praesent commodo cursus magna, vel scelerisque
84 | nisl consectetur et. Donec sed odio dui. Donec ullamcorper nulla non metus auctor fringilla.
85 |
86 |
Cras mattis consectetur purus sit amet fermentum. Cras justo odio, dapibus ac facilisis in,
87 | egestas eget quam. Morbi leo risus, porta ac consectetur ac, vestibulum at eros.
88 |
Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Vivamus sagittis lacus
89 | vel augue laoreet rutrum faucibus dolor auctor.
90 |
Aenean lacinia bibendum nulla sed consectetur. Praesent commodo cursus magna, vel scelerisque
91 | nisl consectetur et. Donec sed odio dui. Donec ullamcorper nulla non metus auctor fringilla.
92 |
93 |
Cras mattis consectetur purus sit amet fermentum. Cras justo odio, dapibus ac facilisis in,
94 | egestas eget quam. Morbi leo risus, porta ac consectetur ac, vestibulum at eros.
95 |
Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Vivamus sagittis lacus
96 | vel augue laoreet rutrum faucibus dolor auctor.
97 |
Aenean lacinia bibendum nulla sed consectetur. Praesent commodo cursus magna, vel scelerisque
98 | nisl consectetur et. Donec sed odio dui. Donec ullamcorper nulla non metus auctor fringilla.
99 |
100 |
Cras mattis consectetur purus sit amet fermentum. Cras justo odio, dapibus ac facilisis in,
101 | egestas eget quam. Morbi leo risus, porta ac consectetur ac, vestibulum at eros.
102 |
Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Vivamus sagittis lacus
103 | vel augue laoreet rutrum faucibus dolor auctor.
104 |
Aenean lacinia bibendum nulla sed consectetur. Praesent commodo cursus magna, vel scelerisque
105 | nisl consectetur et. Donec sed odio dui. Donec ullamcorper nulla non metus auctor fringilla.
106 |
107 |
Cras mattis consectetur purus sit amet fermentum. Cras justo odio, dapibus ac facilisis in,
108 | egestas eget quam. Morbi leo risus, porta ac consectetur ac, vestibulum at eros.
109 |
Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Vivamus sagittis lacus
110 | vel augue laoreet rutrum faucibus dolor auctor.
111 |
Aenean lacinia bibendum nulla sed consectetur. Praesent commodo cursus magna, vel scelerisque
112 | nisl consectetur et. Donec sed odio dui. Donec ullamcorper nulla non metus auctor fringilla.
113 |
114 |
115 |
116 |
117 |
118 |
119 |
120 |
126 |
127 |
128 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "jquery.magnify",
3 | "version": "1.6.3",
4 | "description": "A jQuery plugin to view images just like in Windows",
5 | "main": "dist/jquery.magnify.js",
6 | "files": [
7 | "dist",
8 | "src"
9 | ],
10 | "homepage": "https://github.com/nzbin/magnify#readme",
11 | "author": "nzbin",
12 | "license": "MIT",
13 | "directories": {
14 | "doc": "docs",
15 | "example": "examples"
16 | },
17 | "repository": {
18 | "type": "git",
19 | "url": "git+https://github.com/nzbin/magnify.git"
20 | },
21 | "keywords": [
22 | "magnify",
23 | "lightbox",
24 | "responsive",
25 | "jquery",
26 | "modal",
27 | "draggable",
28 | "resizable",
29 | "zoomable",
30 | "image-gallery",
31 | "photoviewer"
32 | ],
33 | "bugs": {
34 | "url": "https://github.com/nzbin/magnify/issues"
35 | },
36 | "scripts": {
37 | "sass": "node-sass --output-style expanded src/sass/magnify.scss dist/jquery.magnify.css",
38 | "sassmin": "node-sass --output-style compressed src/sass/magnify.scss dist/jquery.magnify.min.css",
39 | "autoprefixer": "postcss -u autoprefixer --no-map --autoprefixer.browsers \"last 1 versions\" -r dist/*.css",
40 | "build": "run-s build:css build:js",
41 | "build:css": "run-s sass",
42 | "build:js": "concat -o dist/jquery.magnify.js src/js/intro.js src/js/utilities.js src/js/core.js src/js/draggable.js src/js/movable.js src/js/resizable.js src/js/outro.js src/js/rotate.js",
43 | "compress": "run-s compress:css compress:js",
44 | "compress:css": "run-s sassmin",
45 | "compress:js": "uglifyjs dist/jquery.magnify.js -o dist/jquery.magnify.min.js -c -m --comments /^!/",
46 | "copy": "run-s copy:css copy:js",
47 | "copy:css": "cp dist/jquery.magnify.css docs/css",
48 | "copy:js": "cp dist/jquery.magnify.js docs/js",
49 | "release": "run-s clean build compress autoprefixer copy",
50 | "release:css": "run-s build:css compress:css",
51 | "release:js": "run-s build:js compress:js",
52 | "lint": "run-s lint:css lint:js",
53 | "lint:css": "stylelint --syntax scss \"src/**/*.scss\" --fix",
54 | "lint:js": "eslint src/js --fix",
55 | "clean": "rimraf dist",
56 | "watch": "onchange src -- run-p build:js build:css"
57 | },
58 | "devDependencies": {
59 | "autoprefixer": "^10.4.2",
60 | "concat": "^1.0.3",
61 | "eslint": "^8.6.0",
62 | "node-sass": "^7.0.1",
63 | "npm-run-all": "^4.1.5",
64 | "onchange": "^7.1.0",
65 | "postcss": "^8.4.5",
66 | "postcss-cli": "^9.1.0",
67 | "rimraf": "^3.0.2",
68 | "stylelint": "^13.13.1",
69 | "stylelint-config-recommended-scss": "^4.3.0",
70 | "stylelint-config-standard": "^21.0.0",
71 | "stylelint-scss": "^3.21.0",
72 | "uglify-js": "^3.14.5"
73 | }
74 | }
75 |
--------------------------------------------------------------------------------
/src/js/draggable.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Draggable
3 | * @param {Object} modal - The modal element
4 | * @param {Object} dragHandle - The handle element when dragging
5 | * @param {Object} dragCancel - The cancel element when dragging
6 | */
7 |
8 | var draggable = function (modal, dragHandle, dragCancel) {
9 | var self = this;
10 |
11 | var isDragging = false;
12 |
13 | var startX = 0, startY = 0, left = 0, top = 0;
14 |
15 | var dragStart = function (e) {
16 | e = e || window.event;
17 |
18 | // Must be removed
19 | // e.preventDefault();
20 |
21 | modal.focus();
22 |
23 | // Get clicked button
24 | var elemCancel = $(e.target).closest(dragCancel);
25 | // Stop modal moving when click buttons
26 | if (elemCancel.length) {
27 | return true;
28 | }
29 |
30 | if (self.options.multiInstances) {
31 | modal.css('z-index', ++PUBLIC_VARS['zIndex']);
32 | }
33 |
34 | isDragging = true;
35 |
36 | startX = e.type === 'touchstart' ? e.originalEvent.targetTouches[0].pageX : e.clientX;
37 | startY = e.type === 'touchstart' ? e.originalEvent.targetTouches[0].pageY : e.clientY;
38 |
39 | left = $(modal).offset().left;
40 | top = $(modal).offset().top;
41 |
42 | $D.on(TOUCH_MOVE_EVENT + EVENT_NS, dragMove).on(
43 | TOUCH_END_EVENT + EVENT_NS,
44 | dragEnd
45 | );
46 | };
47 |
48 | var dragMove = function (e) {
49 | e = e || window.event;
50 |
51 | e.preventDefault();
52 |
53 | if (isDragging && !PUBLIC_VARS['isMoving'] && !PUBLIC_VARS['isResizing'] && !self.isMaximized) {
54 | var endX = e.type === 'touchmove' ? e.originalEvent.targetTouches[0].pageX : e.clientX;
55 | var endY = e.type === 'touchmove' ? e.originalEvent.targetTouches[0].pageY : e.clientY;
56 | var relativeX = endX - startX;
57 | var relativeY = endY - startY;
58 |
59 | $(modal).css({
60 | left: relativeX + left + 'px',
61 | top: relativeY + top + 'px'
62 | });
63 | }
64 | };
65 |
66 | var dragEnd = function (e) {
67 | $D.off(TOUCH_MOVE_EVENT + EVENT_NS, dragMove).off(
68 | TOUCH_END_EVENT + EVENT_NS,
69 | dragEnd
70 | );
71 |
72 | isDragging = false;
73 | };
74 |
75 | $(dragHandle).on(TOUCH_START_EVENT + EVENT_NS, dragStart);
76 | };
77 |
78 | // Add to Magnify Prototype
79 | $.extend(Magnify.prototype, {
80 | draggable: draggable
81 | });
82 |
--------------------------------------------------------------------------------
/src/js/intro.js:
--------------------------------------------------------------------------------
1 | /*!
2 | * __ __ _ ____ _ _ ___ _______ __
3 | * | \/ | / \ / ___| \ | |_ _| ___\ \ / /
4 | * | |\/| | / _ \| | _| \| || || |_ \ V /
5 | * | | | |/ ___ \ |_| | |\ || || _| | |
6 | * |_| |_/_/ \_\____|_| \_|___|_| |_|
7 | *
8 | * jquery.magnify - v1.6.3
9 | * A jQuery plugin to view images just like in windows
10 | * https://github.com/nzbin/magnify#readme
11 | *
12 | * Copyright (c) 2017 nzbin
13 | * Released under the MIT License
14 | */
15 | ;
16 | (function(factory) {
17 | if (typeof define === 'function' && define.amd) {
18 | // AMD. Register as anonymous module.
19 | define(['jquery'], factory);
20 | } else if (typeof exports === 'object') {
21 | // Node / CommonJS
22 | factory(require('jquery'));
23 | } else {
24 | // Browser globals.
25 | factory(jQuery);
26 | }
27 | })(function($) {
28 |
29 | 'use strict';
30 |
--------------------------------------------------------------------------------
/src/js/movable.js:
--------------------------------------------------------------------------------
1 | /**
2 | * --------------------------------------------------------------------------
3 | * 1. No movable
4 | * 2. Vertical movable
5 | * 3. Horizontal movable
6 | * 4. Vertical & Horizontal movable
7 | * --------------------------------------------------------------------------
8 | *
9 | * Image movable
10 | * @param {Object} stage - The stage element
11 | * @param {Object} image - The image element
12 | */
13 |
14 | var movable = function (stage, image) {
15 | var self = this;
16 |
17 | var isDragging = false;
18 |
19 | var startX = 0,
20 | startY = 0,
21 | left = 0,
22 | top = 0,
23 | widthDiff = 0,
24 | heightDiff = 0,
25 | δ = 0;
26 |
27 | var dragStart = function (e) {
28 | e = e || window.event;
29 |
30 | e.preventDefault();
31 |
32 | var $image = isIE8() ? $(stage).find(image) : $(image);
33 |
34 | var imageWidth = $image.width(),
35 | imageHeight = $image.height(),
36 | stageWidth = $(stage).width(),
37 | stageHeight = $(stage).height();
38 |
39 | startX = e.type === 'touchstart' ? e.originalEvent.targetTouches[0].pageX : e.clientX;
40 | startY = e.type === 'touchstart' ? e.originalEvent.targetTouches[0].pageY : e.clientY;
41 |
42 | // δ is the difference between image width and height
43 | δ = !self.isRotated ? 0 : (imageWidth - imageHeight) / 2;
44 |
45 | // Width or height difference can be use to limit image right or top position
46 | widthDiff = !self.isRotated ? imageWidth - stageWidth : imageHeight - stageWidth;
47 | heightDiff = !self.isRotated ? imageHeight - stageHeight : imageWidth - stageHeight;
48 |
49 | // Modal can be dragging if image is smaller to stage
50 | isDragging = widthDiff > 0 || heightDiff > 0 ? true : false;
51 | PUBLIC_VARS['isMoving'] = widthDiff > 0 || heightDiff > 0 ? true : false;
52 |
53 | // Reclac the element position when mousedown
54 | // Fixed the issue of stage with a border
55 | left = $image.position().left - (isIE8() ? 0 : δ);
56 | top = $image.position().top + (isIE8() ? 0 : δ);
57 |
58 | // Add grabbing cursor
59 | if (stage.hasClass('is-grab')) {
60 | $('html, body, .magnify-modal, .magnify-stage, .magnify-button, .magnify-resizable-handle')
61 | .addClass('is-grabbing');
62 | }
63 |
64 | $D.on(TOUCH_MOVE_EVENT + EVENT_NS, dragMove).on(
65 | TOUCH_END_EVENT + EVENT_NS,
66 | dragEnd
67 | );
68 | };
69 |
70 | var dragMove = function (e) {
71 | e = e || window.event;
72 |
73 | e.preventDefault();
74 |
75 | var $image = isIE8() ? $(stage).find(image) : $(image);
76 |
77 | if (isDragging) {
78 | var endX = e.type === 'touchmove' ? e.originalEvent.targetTouches[0].pageX : e.clientX;
79 | var endY = e.type === 'touchmove' ? e.originalEvent.targetTouches[0].pageY : e.clientY;
80 | var relativeX = endX - startX;
81 | var relativeY = endY - startY;
82 | var newLeft = relativeX + left;
83 | var newTop = relativeY + top;
84 |
85 | // Vertical limit
86 | if (heightDiff > 0) {
87 | if (relativeY + top > δ) {
88 | newTop = δ;
89 | } else if (relativeY + top < -heightDiff + δ) {
90 | newTop = -heightDiff + δ;
91 | }
92 | } else {
93 | newTop = top;
94 | }
95 | // Horizontal limit
96 | if (widthDiff > 0) {
97 | if (relativeX + left > -δ) {
98 | newLeft = -δ;
99 | } else if (relativeX + left < -widthDiff - δ) {
100 | newLeft = -widthDiff - δ;
101 | }
102 | } else {
103 | newLeft = left;
104 | }
105 |
106 | $image.css({
107 | left: newLeft + 'px',
108 | top: newTop + 'px'
109 | });
110 |
111 | // Update image initial data
112 | $.extend(self.imageData, {
113 | left: newLeft,
114 | top: newTop
115 | });
116 | }
117 | };
118 |
119 | var dragEnd = function (e) {
120 | $D.off(TOUCH_MOVE_EVENT + EVENT_NS, dragMove).off(
121 | TOUCH_END_EVENT + EVENT_NS,
122 | dragEnd
123 | );
124 |
125 | isDragging = false;
126 | PUBLIC_VARS['isMoving'] = false;
127 |
128 | // Remove grabbing cursor
129 | $('html, body, .magnify-modal, .magnify-stage, .magnify-button, .magnify-resizable-handle')
130 | .removeClass('is-grabbing');
131 | };
132 |
133 | $(stage).on(TOUCH_START_EVENT + EVENT_NS, dragStart);
134 | };
135 |
136 | // Add to Magnify Prototype
137 | $.extend(Magnify.prototype, {
138 | movable: movable
139 | });
140 |
--------------------------------------------------------------------------------
/src/js/outro.js:
--------------------------------------------------------------------------------
1 | });
2 |
--------------------------------------------------------------------------------
/src/js/resizable.js:
--------------------------------------------------------------------------------
1 | /**
2 | * --------------------------------------------------------------------------
3 | * 1. Modal resizable
4 | * 2. Keep image in stage center
5 | * 3. Other image limitations
6 | * --------------------------------------------------------------------------
7 | *
8 | * Resizable
9 | * @param {Object} modal - The modal element
10 | * @param {Object} stage - The stage element
11 | * @param {Object} image - The image element
12 | * @param {Number} minWidth - The option of modalWidth
13 | * @param {Number} minHeight - The option of modalHeight
14 | */
15 |
16 | var resizable = function (modal, stage, image, minWidth, minHeight) {
17 | var self = this;
18 |
19 | var resizableHandleE = $('