Panzoom: μ›Ήν‚· 기반 λΈŒλΌμš°μ €μ—μ„œ ν™•λŒ€κ°€ 흐릿함

에 λ§Œλ“  2014λ…„ 03μ›” 27일  Β·  21μ½”λ©˜νŠΈ  Β·  좜처: timmywil/panzoom

λ‚˜λŠ” 제λͺ©μ΄ κ·Έ 자체λ₯Ό μ„€λͺ…ν•œλ‹€κ³  μƒκ°ν•œλ‹€. Firefox 및 IEμ—μ„œλŠ” λ¬Έμ œκ°€ λ°œμƒν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

λͺ¨λ°”μΌμ—μ„œλ„ μž‘λ™ν•˜λŠ” νŠΈλ¦­μ„ μ°Ύμ•˜μŠ΅λ‹ˆλ‹€(크둬 및 κΈ°λ³Έ Android λΈŒλΌμš°μ €).
λ‹€μŒ 쀄을 CSS에 λ„£μœΌμ‹­μ‹œμ˜€.

.팬쀌 {
-webkit-backface-visibility: 초기 !μ€‘μš”;
-webkit-transform-origin: 50% 50%;
}

λͺ¨λ“  21 λŒ“κΈ€

이것은 panzoom으둜 ν•΄κ²°ν•  수 μ—†μŠ΅λ‹ˆλ‹€. μ›Ήν‚· λ¬Έμ œμž…λ‹ˆλ‹€

μ΄μƒν•œ SVGPanμ—λŠ” 이 λ¬Έμ œκ°€ μ—†λŠ” 것 κ°™μŠ΅λ‹ˆλ‹€: http://www.cyberz.org/projects/SVGPan/tiger.svg

SVG의 κ·Έλ£Ή μš”μ†Œμ— λ³€ν™˜μ„ μ„€μ •ν•˜λŠ” 경우 두 번 ν™•μΈν•˜κ³  ν™•λŒ€/μΆ•μ†Œλ„ μˆ˜ν–‰ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

μ•ˆλ…• μ–˜λ“€μ•„
μ €λŠ” μ–΄μ œλΆ€ν„° panzoom을 μ‚¬μš©ν•΄ μ™”μœΌλ©° SVGκ°€ ν˜„μž¬ μž‘μ—…μ„ μ²˜λ¦¬ν•˜λŠ” 방법인지 μ—¬μ „νžˆ λ””μžμ΄λ„ˆμ™€ ν™•μΈν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. SVG μ΄λ―Έμ§€μ˜ λ‹€λ₯Έ 뢀뢄을 ν™•λŒ€ν•˜κΈ° μœ„ν•΄ panzoom을 μ‚¬μš©ν•˜κ³  μ‹Άμ§€λ§Œ Chromeμ—μ„œλŠ” μ—¬κΈ°μ—μ„œ λ…Όμ˜ν•˜λŠ” κ²ƒμ²˜λŸΌ νλ¦Ών•΄μ§‘λ‹ˆλ‹€. λ‚΄κ°€ 그것에 λŒ€ν•΄ 무엇이든 ν•  수 μžˆμŠ΅λ‹ˆκΉŒ? @timmywil "SVG의 κ·Έλ£Ή μš”μ†Œμ— λŒ€ν•œ λ³€ν™˜ μ„€μ •"이 도움이 λœλ‹€κ³  μΌμ§€λ§Œ μ–΄λ–»κ²Œ ν•΄μ•Ό ν•©λ‹ˆκΉŒ? 도움을 μ£Όμ‹œλ©΄ κ°μ‚¬ν•˜κ² μŠ΅λ‹ˆλ‹€.
λ‹€μŒμ€ λ‚΄κ°€ μ‚¬μš©ν•˜λŠ” μ½”λ“œμž…λ‹ˆλ‹€.

var $map = $('.customers-map');
if ($map.length > 0)
{
    var $panzoom = $map.find('.panzoom').panzoom();
    $panzoom.parent().on('mousewheel.focal', function (e)
    {
        e.preventDefault();
        var delta = e.delta || e.originalEvent.wheelDelta;
        var zoomOut = delta ? delta < 0 : e.originalEvent.deltaY > 0;
        $panzoom.panzoom('zoom', zoomOut, {
            increment: 0.1,
            animate: false,
            focal: e
        });
    });
}

λ‚΄ HTML은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

<div class="customers-map">
    <div class="panzoom">
        <img src="images/customers/customers-map.svg">
    </div>
</div>

ν•΄κ²° 방법을 μ°Ύμ•˜μŠ΅λ‹ˆλ‹€. λ‚˜λŠ” λͺ¨λ“  panzoomzoomμ—μ„œ -webkit-perspective 1κ³Ό 0 사이λ₯Ό λ’€μ§‘μŠ΅λ‹ˆλ‹€.

λ‚˜λŠ” 이런 μΌμ„ν•˜κ³ μžˆλ‹€ :
var ν”Œλž˜κ·Έ = μ°Έ;
ν•¨μˆ˜ doThisOnEveryPanzoomzoom(){
$('#mypanzoom').css({
'-webkit-perspective': (ν”Œλž˜κ·Έ?1:0)
});
ν”Œλž˜κ·Έ = !ν”Œλž˜κ·Έ;
}

@tlimited ν₯미둜운 트릭. λ‚˜λŠ” 이것에 λŒ€ν•΄ 쑰사할 것이닀.

v1.12.4λŠ” 크둬 λ°μŠ€ν¬ν†± 및 λͺ¨λ°”μΌμ—μ„œ λ§ˆμ§€λ§‰μœΌλ‘œ μž‘λ™ν•˜λŠ” λ²„μ „μž…λ‹ˆλ‹€. μ΅œμ‹  버전은 iOS μ‚¬νŒŒλ¦¬ 및 iOS ν¬λ‘¬μ—μ„œλ§Œ μž‘λ™ν•©λ‹ˆλ‹€.

tlimited의 ν•΄κ²° 방법은 λ°μŠ€ν¬ν†± ν¬λ‘¬μ—μ„œλŠ” μž‘λ™ν•˜μ§€λ§Œ λͺ¨λ°”μΌμ—μ„œλŠ” μž‘λ™ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. λ°μŠ€ν¬νƒ‘ ν¬λ‘¬μ—μ„œ 이미지가 흐릿할 λ•Œ 크둬 μΈμŠ€νŽ™ν„°λ₯Ό μ‚¬μš©ν•˜κ³  νŽ˜μ΄μ§€μ˜ μš”μ†Œλ₯Ό κ°•μ‘° ν‘œμ‹œν•˜λ©΄ 이미지가 λ‹€μ‹œ μ„ λͺ…ν•΄μ§€λŠ” 것을 μ•Œμ•˜μŠ΅λ‹ˆλ‹€. λ¦¬νŽ˜μΈνŒ… 문제? (κ·Έ 원근법 변경은 λ‹€μ‹œ 그리기λ₯Ό μœ λ°œν•œλ‹€κ³  κ°€μ •ν•©λ‹ˆλ‹€)

λͺ¨λ°”μΌμ—μ„œλ„ μž‘λ™ν•˜λŠ” νŠΈλ¦­μ„ μ°Ύμ•˜μŠ΅λ‹ˆλ‹€(크둬 및 κΈ°λ³Έ Android λΈŒλΌμš°μ €).
λ‹€μŒ 쀄을 CSS에 λ„£μœΌμ‹­μ‹œμ˜€.

.팬쀌 {
-webkit-backface-visibility: 초기 !μ€‘μš”;
-webkit-transform-origin: 50% 50%;
}

νŽΈμ§‘ : 이것은 μž‘λ™ν•˜λŠ” 것 κ°™μŠ΅λ‹ˆλ‹€.
감사 ν•΄μš”

λ‚˜λŠ” gius80의 μˆ˜μ • 사항이 νš¨κ³Όκ°€ μžˆμ—ˆμ§€λ§Œ νƒœλΈ”λ¦Ώμ˜ μ„±λŠ₯이 μƒλ‹Ήνžˆ λŠλ €μ‘Œλ‹€λŠ” 것을 λ°œκ²¬ν–ˆμŠ΅λ‹ˆλ‹€.

λŒ€μ‹  μ‚¬μš©μžκ°€ μž‘μ—…μ„ 마친 ν›„ μ•½κ°„ ν™•λŒ€λ˜λŠ” panzoom onEnd μ½œλ°±μ„ μΆ”κ°€ν–ˆμŠ΅λ‹ˆλ‹€. 이둜 인해 팬쀌이 흐릿함 없이 λ‹€μ‹œ λ Œλ”λ§λ˜λŠ” 것 κ°™μŠ΅λ‹ˆλ‹€. 문제의 근원에 λ„λ‹¬ν•˜λŠ” 더 쒋은 방법이 μžˆλ‹€κ³  ν™•μ‹ ν•˜μ§€λ§Œ 이 μ†”λ£¨μ…˜μ€ 적어도 Chrome λ°μŠ€ν¬ν†± 및 Androidμ—μ„œ μž‘λ™ν•˜λŠ” 것 κ°™μŠ΅λ‹ˆλ‹€.

$el.panzoom({
    onEnd: function(){
        $el.panzoom( 'zoom', {increment: .01});
    }
});

이것은 catch-22μž…λ‹ˆλ‹€. μ›Ήν‚· λ¬Έμ œλŠ” 이 기사 μ—μ„œ 잘 μ„€λͺ…λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€. Panzoom은 ν•˜λ“œμ›¨μ–΄ 가속을 ν™œμš©ν•˜κΈ° μœ„ν•΄ -webkit-backface-visibility: hidden λ₯Ό μ‚¬μš©ν•˜μ—¬ μš”μ†Œλ₯Ό 자체 ν•©μ„± λ ˆμ΄μ–΄λ‘œ μŠΉκ²©ν•©λ‹ˆλ‹€. 이λ₯Ό 톡해 μ—¬λŸ¬ μž₯μΉ˜μ—μ„œ μ• λ‹ˆλ©”μ΄μ…˜ μ„±λŠ₯이 ν–₯μƒλ˜μ—ˆμŠ΅λ‹ˆλ‹€. 즉, 웹킷은 μ• λ‹ˆλ©”μ΄μ…˜μ˜ 일뢀가 λ°˜ν”½μ…€μ— λ–¨μ–΄μ§ˆ λ•Œ 흐리게 μ²˜λ¦¬ν•˜μ§€ μ•Šκ³  ν•˜λ“œμ›¨μ–΄ 가속 λ ˆμ΄μ–΄μ— μ• λ‹ˆλ©”μ΄μ…˜μ„ μ μš©ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. Panzoom은 이에 λŒ€ν•œ μ•ˆμ •μ μ΄κ³  보편적인 μˆ˜μ • 사항을 μ œκ³΅ν•  수 μ—†μŠ΅λ‹ˆλ‹€.

λ”°λΌμ„œ λ¬Έμ œλŠ” 웹킷이 문제λ₯Ό ν•΄κ²°ν•  λ•ŒκΉŒμ§€ μ›Ήν‚·μ—μ„œ λ•Œλ•Œλ‘œ νλ¦Ών•œ 더 λΉ λ₯Έ μ• λ‹ˆλ©”μ΄μ…˜μ„ μ›ν•©λ‹ˆκΉŒ, μ•„λ‹ˆλ©΄ ν•˜λ“œμ›¨μ–΄ 가속을 μ€‘λ‹¨ν•˜κ³  μ‹ΆμŠ΅λ‹ˆκΉŒ?

BTW, Panzoom이 λ³„λ„μ˜ λ ˆμ΄μ–΄λ₯Ό κ°•μ œν•˜μ§€ μ•Šλ”λΌλ„ μ–΄μ¨Œλ“  가끔 λ°œμƒν•©λ‹ˆλ‹€. Webkit은 νŠΉμ • 상황(예: 뢈투λͺ…도 μ• λ‹ˆλ©”μ΄μ…˜)μ—μ„œ λ³„λ„μ˜ λ ˆμ΄μ–΄λ₯Ό μžλ™μœΌλ‘œ μƒμ„±ν•©λ‹ˆλ‹€.

"μ• λ‹ˆλ©”μ΄μ…˜μ˜ 일뢀가 0.5픽셀에 λ–¨μ–΄μ§€λŠ” 경우"
Math.floor λ˜λŠ” Math.ceil을 μ‚¬μš©ν•˜μ—¬ ν™•λŒ€/μΆ•μ†Œ μˆ˜μ€€μ„ 전체 ν”½μ…€λ‘œ κ°•μ œν•  수 μžˆμŠ΅λ‹ˆκΉŒ?

ν™•λŒ€/μΆ•μ†Œ μˆ˜μ€€μ΄ μ•„λ‹™λ‹ˆλ‹€. κΈ°μ‚¬μ—μ„œ μš”μ†Œ μΉ˜μˆ˜λŠ” 2둜 λ‚˜λˆŒ 수 μžˆλŠ” κ²ƒμœΌλ‘œ μ‹œμž‘ν•΄μ•Ό ν•˜λŠ” κ²ƒμœΌλ‘œ 보이며, μ΄λŠ” Panzoom이 μ μš©ν•˜λŠ” 데 μ ν•©ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€(특히 λ°˜μ‘ν˜• νŽ˜μ΄μ§€μ—μ„œ).

νλ¦Ών•œ μˆ˜μ • 사항은 주석 lin 821 //'backface-visibility': 'hidden',

gius80 λ‹Ήμ‹ μ˜ 트릭이 μž‘λ™ν•©λ‹ˆλ‹€, 정말 κ°μ‚¬ν•©λ‹ˆλ‹€.

.panzoom {
     -webkit-backface-visibility: initial !important;
     -webkit-transform-origin: 50% 50%;
 }

μΆ•μ†Œλœ μ΄λ―Έμ§€μ˜ 초기 λ Œλ”λ§μ΄ 팬쀌이 ν™œμ„±ν™”λ  λ•Œ κ·Ήλ„λ‘œ ν”½μ…€ν™”λ˜λŠ” κ΄€λ ¨ 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ λ…Έλ ₯ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. 이것은 Firefoxμ—μ„œλŠ” λ°œμƒν•˜μ§€ μ•Šμ§€λ§Œ Chrome 및 IEμ—μ„œλŠ” λ°œμƒν•©λ‹ˆλ‹€. @gius80 의 μ œμ•ˆμ„ μ μš©ν•˜λ©΄ Chromeμ—μ„œ μ˜¬λ°”λ₯΄κ²Œ λ Œλ”λ§λ©λ‹ˆλ‹€. μ—¬μ „νžˆ IEλ₯Ό ν…ŒμŠ€νŠΈν•˜κ³  적어도 IE9μ—μ„œλŠ” μ‹€νŒ¨ν•©λ‹ˆλ‹€. ν•œ 걸음 더 λ‹€κ°€κ°€κ²Œ ν•΄μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€!

@jdonahue82 Safariμ—μ„œλ„ μž‘λ™ν•©λ‹ˆκΉŒ? λ‚˜λ₯Ό μœ„ν•΄ Safariμ—μ„œ μž‘λ™ν•˜λŠ” μ†”λ£¨μ…˜μ΄ μ—†μŠ΅λ‹ˆλ‹€.

@marcelboettcher λ™μ˜ν•©λ‹ˆλ‹€. Safariμ—μ„œ μž‘λ™ν•˜λŠ” μ†”λ£¨μ…˜μ΄ μ—†μŠ΅λ‹ˆλ‹€.

μ‚¬μš©μž μ •μ˜ ν™•λŒ€/μΆ•μ†Œ(jquery.panzoom μ•„λ‹˜) κ΅¬ν˜„μ— λŒ€ν•œ λ‚΄ κ²½ν—˜μ— λ”°λ₯΄λ©΄:

CSS μœ„μΉ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ λ‹€λ₯Έ μš”μ†Œ μœ„μ— CSS λ³€ν™˜μ„ μ‚¬μš©ν•˜λŠ” μ—¬λŸ¬ μš”μ†Œκ°€ 있으면 λͺ¨λ°”일 Safari 및 Chrome이 νλ¦Ών•΄μ§‘λ‹ˆλ‹€.

ν•˜λ“œμ›¨μ–΄ 가속을 μ‚¬μš©ν•˜λŠ” μ—¬λŸ¬ κ³„μΈ΅μ˜ 일반적인 문제인 것 κ°™μŠ΅λ‹ˆλ‹€.

μ•„λ§ˆλ„ 이것은 문제λ₯Ό ν•΄κ²°ν•˜λŠ” 데 도움이 될 κ²ƒμž…λ‹ˆλ‹€.

λ‹€λ₯Έ ν•΄κ²° 방법을 μ°Ύμ•˜μŠ΅λ‹ˆλ‹€!

Panzoomμ—μ„œ 이 μ½”λ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ κ°•μ œλ‘œ λ‹€μ‹œ 그릴 수 μžˆμŠ΅λ‹ˆλ‹€.

이것은 λ’·λ©΄ κ°€μ‹œμ„±κ³Ό λ™μΌν•©λ‹ˆλ‹€. μ΄ˆκΈ°μ΄μ§€λ§Œ 맀우 λŠλ¦½λ‹ˆλ‹€. λ”°λΌμ„œ ν•¨μˆ˜λ₯Ό 100ms둜 λ””λ°”μš΄μŠ€ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 이λ₯Ό μœ„ν•΄ lodashλ₯Ό μ‚¬μš©ν–ˆμ§€λ§Œ μˆ˜λ™μœΌλ‘œ λ””λ°”μš΄μŠ€ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

μ½”λ“œλŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

$('#panzoom-el').on('panzoomzoom', _.debounce( function () {
    this.style.display='none';
    this.offsetHeight;
    this.style.display='';
}, 100));

도움이 λ˜μ—ˆκΈ°λ₯Ό λ°”λžλ‹ˆλ‹€ :)

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰