1/* 2ãã©ã©ãã¯ã¹åããè¦ç´ ã«ä¸è¨å±æ§ã追å ãã¦ãã ããã 3data-parallax-image="PCç¨ç»åURL" â»å¿ é ãããjsã»ã¬ã¯ã¿ã¨ãã¦è¦ç´ æ¤ç´¢ 空ãªãã¢ãã¤ã«ç¨ç»åãä½¿ç¨ 4data-parallax-mobile-image="ã¢ãã¤ã«ç¨ç»åURL" â»ãªãã·ã§ã³ 空ãªãPCç¨ç»åãä½¿ç¨ 5data-parallax-speed="0ï½2" â»ãªãã·ã§ã³ ãã©ã©ãã¯ã¹ã¹ã¯ãã¼ã«ä¿æ° 0ã§ãã©ã©ãã¯ã¹å¹æãªããæªæå®æã¯ããã©ã«ãè¨å®defaultSpeedã使ç¨ãã¾ãã 6data-parallax-blur="0ï½" â»ãªãã·ã§ã³ èæ¯ç»åå ¨ä½ã®ã¼ãããµã¤ãº 0ã§ã¼ãããªããæªè¨å®æã¯ããã©ã«ãè¨å®defaultBlurã使ç¨ãã¾ããå ¨ä½ã¼ããã使ç¨ããå ´åã¯cssã§position: absoluteãæå®ããã¦ããå¿ è¦ãããã¾ãã 7 8ãã©ã©ãã¯ã¹è¦ç´ ä¸ã®ãªã¼ãã¼ã¬ã¤è¦ç´ ã«ã¼ããèæ¯ãå ¥ããå ´åã¯ã¼ããè¦ç´ ã«ä¸è¨å±æ§ã追å ãã¦ãã ããã 9data-parallax-overlay-blur="1ï½" â»å¿ é ãã©ã©ãã¯ã¹è¦ç´ ã®åè¦ç´ ãããã¯ãã©ã©ãã¯ã¹è¦ç´ ã®position:relativeè¦ç´ ã®åè¦ç´ ã«ãªã¼ãã¼ã¬ã¤è¦ç´ ãåå¨ãããã®åè¦ç´ ã«æå®ããå¿ è¦ãããã¾ãããã®è¦ç´ ã®positionç³»cssã¯åºæ¬çã«ä¸è¦ã§ãã 10
11ãªã¼ãã¼ã¬ã¤ã¼ããã®ãµã³ãã«ï¼ 12<div class="parallax" style="position: relative; height: 600px;" data-parallax-image="01.jpg"> 13 <div class="parallax-overlay" style="position: absolute; bottom: 50px; left: 50px; right: 50px; top: 50px; z-index: 2;"> 14 <div class="parallax-overlay-contents">text...</div> 15 <div class="parallax-overlay-bg" data-parallax-overlay-blur="5"></div> 16 </div> 17</div> 18<div class="parallax" style="position: relative; height: 600px;"> 19 <div class="parallax-overlay" style="position: absolute; bottom: 50px; left: 50px; right: 50px; top: 50px; z-index: 2;"> 20 <div class="parallax-overlay-contents">text...</div> 21 <div class="parallax-overlay-bg" data-parallax-overlay-blur="5"></div> 22 </div> 23 <div class="parallax-image" data-parallax-image="01.jpg" style="position: absolute; bottom: 0; left: 0; right: 0; top: 0; z-index: 1;"></div> 24</div> 25*/ 26jQuery(function($){ 27 28 var $elems = $('[data-parallax-image]'); 29 if (!$elems.length) return; 30 31 // ã¢ãã¤ã«ç»åã«åãæ¿ãããã¬ã¤ã¯ãã¤ã³ã 32 var mobileBreakpoint = 650; 33 34 // ããã©ã«ãã®ãã©ã©ãã¯ã¹ã¹ã¯ãã¼ã«ä¿æ° 35 // data-parallax-speedã§ä¸æ¸ãããã¾ã 36 // ããã®ä¹æ°ã0ï½2ã®éã§å¤ãããã¨ã§è¦å·®èª¿æ´ãå¯è½ã0=é常表示ã1=background-attachment: fixed;ã¨åç表示ã1以ä¸ã§é常ã¨ã¯éæ¹åã¸ç§»åããæãã«ãªãã¾ãã2以ä¸ãè¨å®å¯è½ã§ããæ¡å¤§ãããããã®ã§æ³¨æãã¦ãã ããã 37 var defaultSpeed = 0.3; 38 39 // ããã©ã«ãã®å ¨ä½ã¼ãã 40 // data-parallax-blurã§ä¸æ¸ãããã¾ã 41 var defaultBlur = 0; 42 43 // 夿° 44 var $window = $(window); 45 var $body = $('body'); 46 var ua = window.navigator.userAgent.toLowerCase(); 47 var elemSettings = []; 48 var images = []; 49 var mobileImages = []; 50 var resizeTimer = null; 51 var winWidth = window.innerWidth || $body.width(); 52 var winHeight = window.innerHeight || $window.innerHeight(); 53 54 // IEå¤å¥ 55 var isIE = (ua.indexOf('msie') > -1 || ua.indexOf('trident') > -1); 56 57 // IEã»Edgeã®å ´åã¯svgã§ã¼ãã 58 // Edgeã¯filter: blur(Npx)ã ã¨ããéé対çãå¹ããªãããã 59 // 2019/08æç¹ ChromiumçEdgeã¯UAãEdgeã§ã¯ãªãEdgã®ãã対象å¤ã§åé¡ãªãã 60 var useSvgBlur = (isIE || ua.indexOf('edge') > -1); 61 62 // ã¹ããå¤å¥ 63 var isSmartPhone = (ua.indexOf('iphone') > -1 || ua.indexOf('ipod') > -1 || ua.indexOf('android') > -1 && ua.indexOf('mobile') > -1); 64 65 // ã¢ãã¤ã«å¤å¥ 66 var isMobile = (isSmartPhone || ua.indexOf('ipad') > -1 || ua.indexOf('android') > -1); 67 68 // ãã¬ã¤ã¯ãã¤ã³ãã«ããã¢ãã¤ã«å¤å¥ 69 var checkParallaxMobile = function() { 70 var mql = window.matchMedia('(max-width: ' + mobileBreakpoint + 'px)'); 71 return mql.matches; 72 }; 73 var isParallaxMobile = checkParallaxMobile(); 74 75 // SVGã¼ããç¨SVGçæ 76 var parallaxCreateSvg = function(src, blur) { 77 var svgid = Math.random().toString(36).substr(2, 9); 78 var $svg = $('<svg xmlns="http://www.w3.org/2000/svg" version="1.1" id="svg-' + svgid + '" class="parallax-blur" width="100%" height="100%" viewBox="0 0 100% 100%" preserveAspectRatio="none"><filter id="blur-' + svgid + '"><feGaussianBlur in="SourceGraphic" stdDeviation="' + blur + '"></feGaussianBlur></filter><image x="0" y="0" width="100%" height="100%" externalResourcesRequired="true" xlink:href="' + src + '" style="filter:url(#blur-' + svgid + ')" preserveAspectRatio="none"></image></svg>'); 79 return $svg; 80 }; 81 82 // ãã©ã©ãã¯ã¹ã¹ã¯ãã¼ã«å¦ç 83 var parallaxBgScroll = function() { 84 var winScrollTop = $window.scrollTop(); 85 86 $elems.each(function(i){ 87 // ãã©ã©ãã¯ã¹ãªããããã¯ãµã¤ãºè¨ç®ãçµãã£ã¦ããªãå ´åã¯çµäº 88 if (elemSettings[i].speed === 0 || elemSettings[i].imageOffsetY === undefined) return; 89 90 // å ¨ä½ã¼ãããã 91 if (elemSettings[i].blur) { 92 var $elem = $(this); 93 var $box = $elem.offsetParent(); 94 var boxOffsetTop = Math.ceil($box.offset().top); 95 var boxHeight = $box.innerHeight(); 96 97 // ãã®é åãç»é¢å ã«è¡¨ç¤ºããã¦ããå ´å 98 if ((winScrollTop + winHeight > boxOffsetTop - 10) && (boxOffsetTop + boxHeight > winScrollTop + 10)) { 99 var offsetY = Math.round(((winScrollTop - boxOffsetTop - boxHeight / 2 + winHeight / 2) * elemSettings[i].speed - elemSettings[i].imageOffsetY) * 2) / 2; 100 // translate3dã ã¨chromeã§è¡¨ç¤ºé åã«ã¼ãããããã 101 $elem.css('transform', 'translateY(' + offsetY + 'px)'); 102 103 // ãªã¼ãã¼ã¬ã¤ã¼ããããã®å ´å 104 if (elemSettings[i].$overlayBlurInner) { 105 elemSettings[i].$overlayBlurInner.css('transform', 'translateY(' + offsetY + 'px)'); 106 } 107 } 108 109 // å ¨ä½ã¼ãããªã 110 } else { 111 var $elem = $(this); 112 var boxOffsetTop = Math.ceil($elem.offset().top);
113 var boxHeight = $elem.innerHeight(); 114 115 // ãã®é åãç»é¢å ã«è¡¨ç¤ºããã¦ããå ´å 116 if ((winScrollTop + winHeight > boxOffsetTop - 10) && (boxOffsetTop + boxHeight > winScrollTop + 10)) { 117 var offsetY = Math.round(((winScrollTop - boxOffsetTop - boxHeight / 2) * elemSettings[i].speed - elemSettings[i].imageOffsetY) * 2) / 2; 118 $elem.css('backgroundPositionY', offsetY); 119 120 // ãªã¼ãã¼ã¬ã¤ã¼ããããã®å ´å 121 if (elemSettings[i].$overlayBlurInner) { 122 var overlayOffsetY = Math.round(((winScrollTop - boxOffsetTop - boxHeight / 2 + winHeight / 2) * elemSettings[i].speed - elemSettings[i].imageOffsetY) * 2) / 2; 123 // translate3dã ã¨chromeã§è¡¨ç¤ºé åã«ã¼ãããããã 124 elemSettings[i].$overlayBlurInner.css('transform', 'translateY(' + overlayOffsetY + 'px)'); 125 } 126 } 127 } 128 }); 129 }; 130 $window.on('load scroll', parallaxBgScroll); 131 132 // èæ¯ç»åãµã¤ãºè¨ç® 133 var parallaxCalcBgImageSize = function(i){ 134 var $elem = $elems.eq(i); 135 var img, $box, boxHeight, boxWidth, backgroundImageHeight, backgroundImageWidth; 136 137 if (isParallaxMobile && mobileImages[i].img.src) { 138 if (!mobileImages[i].img.complete) return; 139 img = mobileImages[i].img; 140 } else { 141 if (!images[i].img.complete) return; 142 img = images[i].img; 143 } 144 145 // ç»å夿´ 146 if (elemSettings[i].currentImageSrc !== img.src) { 147 $elem.css('backgroundImage', 'url(' + img.src + ')'); 148 elemSettings[i].currentImageSrc = img.src; 149 150 // SVGã¼ããããï¼å ¨ä½ã¼ããã»ãªã¼ãã¼ã¬ã¤ã¼ããå ¼ç¨ï¼ 151 if (useSvgBlur) { 152 for (var j = 0; j < elemSettings[i].svgs.length; j++) { 153 elemSettings[i].svgs[j].find('image').attr('xlink:href', img.src); 154 } 155 156 // filter:blurã®ãªã¼ãã¼ã¬ã¤ã¼ãããã 157 } else if (elemSettings[i].$overlayBlurInner) { 158 elemSettings[i].$overlayBlurInner.css('backgroundImage', 'url(' + img.src + ')'); 159 } 160 } 161 162 // å ¨ä½ã¼ãããã 163 if (elemSettings[i].blur) { 164 $box = $elem.offsetParent(); 165 boxHeight = $box.innerHeight(); 166 boxWidth = $box.innerWidth(); 167 168 // ãã©ã©ãã¯ã¹å¹æåè¾¼ã¿ã§å¿ è¦ãªç»åã®é«ã 169 var parallaxHeight = Math.ceil(winHeight * elemSettings[i].speed + boxHeight); 170 171 // ã¼ããã®ããã®ééé åè¾¼ã¿ã®ãµã¤ãº 172 var parallaxBlurHeight = parallaxHeight + elemSettings[i].blur * 2 * 2; 173 var parallaxBlurWidth = boxWidth + elemSettings[i].blur * 2 * 2; 174 175 var parallaxRatio, imgRatio; 176 parallaxRatio = parallaxBlurWidth / parallaxBlurWidth; 177 imgRatio = img.width / img.height; 178 179 // ç»åã®æ¹ãæ¨ªé· 180 if (parallaxRatio < imgRatio) { 181 backgroundImageWidth = Math.ceil(parallaxBlurHeight / img.height * img.width); 182 backgroundImageHeight = parallaxBlurHeight; 183 elemSettings[i].imageOffsetX = (backgroundImageWidth - parallaxBlurWidth) / 2 + elemSettings[i].blur * 2; 184 elemSettings[i].imageOffsetY = 0; 185 // ç»åã®æ¹ãç¸¦é· 186 } else { 187 backgroundImageHeight = Math.ceil(parallaxBlurWidth / img.width * img.height); 188 backgroundImageWidth = parallaxBlurWidth; 189 elemSettings[i].imageOffsetX = elemSettings[i].blur * 2; 190 elemSettings[i].imageOffsetY = 0; 191 } 192 193 $elem.css({ 194 height: backgroundImageHeight, 195 width: backgroundImageWidth, 196 bottom: 'auto', 197 left: elemSettings[i].imageOffsetX * -1, 198 right: 'auto', 199 top: (backgroundImageHeight - boxHeight) / -2 200 }); 201 202 // ã¹ã¯ãã¼ã«0æã«ç»é¢å ã«ããå ´åã¯å¤©å°ä½ç½®èª¿æ´ 203 var boxOffsetTop = Math.ceil($box.offset().top); 204 if (boxOffsetTop + boxHeight < winHeight) { 205 elemSettings[i].imageOffsetY += Math.ceil((winHeight / 2 - boxOffsetTop - boxHeight / 2) * elemSettings[i].speed); 206 } 207 208 // ã¼ãããªã 209 } else { 210 $box = $elem; 211 boxHeight = $box.innerHeight(); 212 boxWidth = $box.innerWidth(); 213 214 // ãã©ã©ãã¯ã¹å¹æåè¾¼ã¿ã§å¿ è¦ãªç»åã®é«ã 215 var parallaxHeight = Math.ceil(winHeight * elemSettings[i].speed + boxHeight); 216 217 var parallaxRatio, imgRatio; 218 parallaxRatio = boxWidth / parallaxHeight; 219 imgRatio = img.width / img.height; 220 221 // ç»åã®æ¹ãæ¨ªé· 222 if (parallaxRatio < imgRatio) { 223 backgroundImageHeight = parallaxHeight; 224 backgroundImageWidth = Math.ceil(parallaxHeight / img.height * img.width); 225 $elem.css('backgroundSize', backgroundImageWidth + 'px ' + parallaxHeight + 'px'); 226 elemSettings[i].imageOffsetY = 0; 227 // ç»åã®æ¹ãç¸¦é· 228 } else { 229 $elem.css('backgroundSize', 'cover');
230 backgroundImageHeight = Math.ceil(boxWidth / img.width * img.height); 231 backgroundImageWidth = boxWidth; 232 elemSettings[i].imageOffsetY = (backgroundImageHeight - parallaxHeight) / 2; 233 } 234 235 // ã¹ã¯ãã¼ã«0æã«ç»é¢å ã«ããå ´åã¯å¤©å°ä½ç½®èª¿æ´ 236 var boxOffsetTop = Math.ceil($elem.offset().top); 237 if (boxOffsetTop + boxHeight < winHeight) { 238 elemSettings[i].imageOffsetY += Math.ceil((winHeight / 2 - boxOffsetTop - boxHeight / 2) * elemSettings[i].speed); 239 } 240 } 241 242 // ãªã¼ãã¼ã¬ã¤ã¼ããããã®å ´å 243 if (elemSettings[i].$overlayBlur) { 244 var boxOffset = $box.offset(); 245 elemSettings[i].$overlayBlur.each(function(){ 246 var $this = $(this); 247 var offset = $this.offset(); 248 var $inner = $this.find('.parallax-overlay-blur-inner'); 249 250 $inner.css({ 251 height: backgroundImageHeight, 252 width: backgroundImageWidth, 253 position: 'absolute', 254 bottom: 'auto', 255 right: 'auto', 256 left: (backgroundImageWidth - boxWidth) / -2 + boxOffset.left - offset.left, 257 top: (backgroundImageHeight - boxHeight) / -2 + boxOffset.top - offset.top, 258 }); 259 }); 260 } 261 }; 262 263 // åæå 264 $elems.each(function(i){ 265 var $elem = $(this); 266 var src = $elem.attr('data-parallax-image'); 267 var srcMobile = $elem.attr('data-parallax-mobile-image'); 268 269 if (!src && srcMobile) { 270 src = srcMobile; 271 srcMobile = null; 272 } 273 274 var initialSrc = src; 275 276 // ãã©ã©ãã¯ã¹ã¹ã¯ãã¼ã«ä¿æ° 277 var speed = parseFloat($elem.attr('data-parallax-speed')); 278 if (isNaN(speed) || speed < 0 || speed > 1) { 279 speed = parseFloat(defaultSpeed) || 0; 280 } 281 282 // å ¨ä½ã¼ãã 283 var blur = parseFloat($elem.attr('data-parallax-blur')); 284 if (isNaN(blur) || blur < 0) { 285 blur = parseFloat(defaultBlur) || 0; 286 } 287 if (blur > 0) { 288 var pos = $elem.css('position'); 289 if (pos !== 'absolute' && pos !== 'fixed') { 290 blur = 0; 291 } 292 } 293 294 elemSettings[i] = { 295 speed: speed, 296 blur: blur 297 }; 298 299 // ç»åãªãã¸ã§ã¯ãåæå 300 images[i] = {}; 301 images[i].img = new Image(); 302 mobileImages[i] = {}; 303 mobileImages[i].img = new Image(); 304 305 // ã¹ããã®å ´åã¯1ç»åã®ã¿ 306 if (isSmartPhone && srcMobile) { 307 src = srcMobile; 308 initialSrc = srcMobile; 309 srcMobile = null; 310 } 311 312 // ãªã¼ãã¼ã¬ã¤ã¼ãã 313 var $closest, $overlayBlur; 314 var elemPosition = $elem.css('position'); 315 if (elemPosition === 'relative') { 316 $closest = $elem; 317 } else if (elemPosition === 'absolute' || elemPosition === 'fixed') { 318 $closest = $elem.offsetParent(); 319 } 320 if ($closest) { 321 $overlayBlur = $closest.find('[data-parallax-overlay-blur]').not('[data-parallax-overlay-blur=""], [data-parallax-overlay-blur="0"]'); 322 } 323 324 // ã¢ãã¤ã«ã®å ´åã§ã¢ãã¤ã«ç»åãããªãåæç»å夿´ 325 if (isParallaxMobile && srcMobile) { 326 initialSrc = srcMobile; 327 } 328 329 // ãªã¼ãã¼ã¬ã¤ã¼ããããã®å ´åãåè¦ç´ çæ 330 if ($overlayBlur.length) { 331 $overlayBlur.each(function(){ 332 var parallaxOverlayBlur= parseFloat(this.dataset.parallaxOverlayBlur); 333 if (isNaN(parallaxOverlayBlur) || parallaxOverlayBlur < 0) { 334 return; 335 } 336 337 var $inner = $('<div class="parallax-overlay-blur-inner"></div>'); 338 339 // SVGã§ã®ã¼ãã 340 if (useSvgBlur) { 341 var $svg = parallaxCreateSvg(initialSrc, parallaxOverlayBlur); 342 $inner.html($svg); 343 if (!elemSettings[i].svgs) { 344 elemSettings[i].svgs = []; 345 } 346 elemSettings[i].svgs.push = $svg; 347 348 // filter:blurã§ã®ã¼ãã 349 } else { 350 $inner.css({ 351 backgroundImage: 'url(' + initialSrc + ')', 352 backgroundPositionX: 'center', 353 backgroundPositionY: 'center', 354 backgroundRepeat: 'no-repeat', 355 backgroundSize: 'cover', 356 filter: 'blur(' + parallaxOverlayBlur + 'px)' 357 }); 358 } 359 360 $(this).css({ 361 overflow: 'hidden', 362 position: 'absolute', 363 bottom: 0, 364 right: 0, 365 left: 0, 366 top: 0, 367 zIndex: -1 368 }).html($inner); 369 }); 370 371 elemSettings[i].$overlayBlur = $overlayBlur; 372 elemSettings[i].$overlayBlurInner = $closest.find('.parallax-overlay-blur-inner'); 373 } 374 375 // å ¨ä½ã¼ãããã 376 if (elemSettings[i].blur) { 377 // SVGã§ã®ã¼ãã 378 if (useSvgBlur) { 379 var $svg = parallaxCreateSvg(initialSrc, elemSettings[i].blur); 380 $elem.html($svg); 381 if (!elemSettings[i].svgs) { 382 elemSettings[i].svgs = []; 383 } 384 elemSettings[i].svgs.push = $svg; 385 386 // filter:blurã§ã®ã¼ãã 387 } else { 388 $elem.css({ 389 backgroundImage: 'url(' + initialSrc + ')', 390 backgroundPositionX: 'center', 391 backgroundPositionY: 'center', 392 backgroundRepeat: 'no-repeat', 393 backgroundSize: 'cover', 394 filter: 'blur(' + elemSettings[i].blur + 'px)' 395 }); 396 } 397 398 // å ¨ä½ã¼ãããªã 399 } else { 400 $elem.css({ 401 backgroundImage: 'url(' + initialSrc + ')', 402 backgroundPositionX: 'center', 403 backgroundPositionY: 'center', 404 backgroundRepeat: 'no-repeat', 405 backgroundSize: 'cover' 406 }); 407 } 408 409 // ã¢ãã¤ã«ã®å ´åã§ã¢ãã¤ã«ç»åãã 410 if (isParallaxMobile && srcMobile) { 411 // ç»åãèªã¿è¾¼ãã§ãããµã¤ãºè¨ç® 412 var img = mobileImages[i].img; 413 img.onload = function() { 414 parallaxCalcBgImageSize(i); 415 }; 416 img.src = srcMobile; 417 if (img.complete) { 418 parallaxCalcBgImageSize(i); 419 } 420 421 elemSettings[i].currentImageSrc = srcMobile; 422 images[i].img.src = src; 423 424 // PCã®å ´å 425 } else if (src) { 426 // ç»åãèªã¿è¾¼ãã§ãããµã¤ãºè¨ç® 427 var img = images[i].img; 428 img.onload = function() { 429 parallaxCalcBgImageSize(i); 430 }; 431 img.src = src; 432 if (img.complete) { 433 parallaxCalcBgImageSize(i); 434 } 435 436 elemSettings[i].currentImageSrc = src; 437 438 if (srcMobile) { 439 mobileImages[i].img.src = srcMobile; 440 } 441 } 442 }); 443 444 parallaxBgScroll(); 445 446 // ãªãµã¤ãº 447 $window.on('resize', function(){ 448 clearTimeout(resizeTimer); 449 resizeTimer = setTimeout(function(){ 450 var w = window.innerWidth || $body.width(); 451 var h = window.innerHeight || $window.innerHeight(); 452 453 // ã¢ãã¤ã«ã§ã¹ã¯ãã¼ã«æã®ã¢ãã¬ã¹ãã¼è¡¨ç¤ºãã°ã«ã§resizeã¤ãã³ããå®è¡ãããããæ¨ªå¹ ã®ã¿ã§å¤å® 454 if (isMobile && winWidth !== w || (!isMobile && (winWidth !== w || winHeight !== h))) { 455 winWidth = w; 456 winHeight = h; 457 isParallaxMobile = checkParallaxMobile(); 458 459 $elems.each(function(i){ 460 parallaxCalcBgImageSize(i); 461 }); 462 parallaxBgScroll(); 463 } 464 }, isIE ? 100 : 16.6666); 465 }); 466 467 // iOSç³» ãã©ã¦ã¶æ»ã対ç 468 var isIOS = (ua.indexOf('iphone') > -1 || ua.indexOf('ipad') > -1 || ua.indexOf('ipod') > -1 ); 469 if (isIOS) { 470 window.addEventListener('pageshow', function(event) { 471 if (event.persisted) { 472 parallaxBgScroll(); 473 } 474 }); 475 } 476 477});
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.