图片点击放大是非常常见的一项功能,一般网站上显示的都是缩略图,当点击缩略图之后,会在一个弹框中显示放大的图片,下面我们实战操作一遍
<script src="https://cdn.jsdelivr.net/npm/jquery@3.4.1/dist/jquery.min.js"></script>
css样式
#outerdiv {
width: 100%;
height: 100%;
position: fixed;
top: 0;
left: 0;
background: rgba(0, 0, 0, 0.3);
display: none;
z-index: 200;
}
html 代码
<div id="outerdiv">
<div id="innerdiv" style="position:absolute;">
<img alt id="bigimg" style="box-shadow: 0 0 10px rgba(0,0,0,0.38)" src=""/>
</div>
</div>
js逻辑实现
<script>
function imgShow(outerdiv, innerdiv, bigimg, _this) {
let src = _this.attr("src");
$(bigimg).attr("src", src);
$("<img/>").attr("src", src).on('load', function () {
let windowW = $(window).width();
let windowH = $(window).height();
let realWidth = this.width;
let realHeight = this.height;
let imgWidth, imgHeight;
let scale = 0.96;
if (realHeight > windowH * scale) {
imgHeight = windowH * scale;
imgWidth = imgHeight / realHeight * realWidth;
if (imgWidth > windowW * scale) {
imgWidth = windowW * scale;
}
} else if (realWidth > windowW * scale) {
imgWidth = windowW * scale;
imgHeight = imgWidth / realWidth * realHeight;
} else {
if ((realWidth * 1.2) < windowW && (realHeight * 1.2) < windowH) {
imgWidth = realWidth * 1.2;
imgHeight = realHeight * 1.2;
} else {
imgWidth = realWidth;
imgHeight = realHeight;
}
}
$(bigimg).css("width", imgWidth);
let w = (windowW - imgWidth) / 2;
let h = (windowH - imgHeight) / 2;
if (IsPC()) {
$(innerdiv).css({
"top": h,
"left": w
});
} else {
$(innerdiv).css({
"top": "50%",
"left": "50%"
});
$(innerdiv).css({
"transform": "translateX(-50%) translateY(-50%)"
});
}
$(outerdiv).fadeIn(500);
});
$(outerdiv).click(function () {
$(this).fadeOut(300);
});
}
function IsPC() {
var userAgentInfo = navigator.userAgent;
var Agents = [
"Android", "iPhone",
"SymbianOS", "Windows Phone",
"iPad", "iPod"
];
var flag = true;
for (var v = 0; v < Agents.length; v++) {
if (userAgentInfo.indexOf(Agents[v]) > 0) {
flag = false;
break;
}
}
return flag;
};
$(".article-container img").click(function () {
console.log("图片放大");
let _this = $(this);
imgShow("#outerdiv", "#innerdiv", "#bigimg", _this);
});
</script>
<blockquote>
<p>图片点击放大是非常常见的一项功能,一般网站上显示的都是缩略图,当点击缩略图之后,会在一个弹框中显示放大的图片,下面我们实战操作一遍</p>
</blockquote>
<pre><div class="hljs"><code class="lang-js"> <script src=<span class="hljs-string">"https://cdn.jsdelivr.net/npm/jquery@3.4.1/dist/jquery.min.js"</span>></script>
</code></div></pre>
<p>css样式</p>
<pre><div class="hljs"><code class="lang-css"><span class="hljs-selector-id">#outerdiv</span> {
<span class="hljs-attribute">width</span>: <span class="hljs-number">100%</span>;
<span class="hljs-attribute">height</span>: <span class="hljs-number">100%</span>;
<span class="hljs-attribute">position</span>: fixed;
<span class="hljs-attribute">top</span>: <span class="hljs-number">0</span>;
<span class="hljs-attribute">left</span>: <span class="hljs-number">0</span>;
<span class="hljs-attribute">background</span>: <span class="hljs-built_in">rgba</span>(<span class="hljs-number">0</span>, <span class="hljs-number">0</span>, <span class="hljs-number">0</span>, <span class="hljs-number">0.3</span>);
<span class="hljs-attribute">display</span>: none;
<span class="hljs-attribute">z-index</span>: <span class="hljs-number">200</span>;
}
</code></div></pre>
<p>html 代码</p>
<pre><div class="hljs"><code class="lang-html"><span class="hljs-tag"><<span class="hljs-name">div</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"outerdiv"</span>></span>
<span class="hljs-tag"><<span class="hljs-name">div</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"innerdiv"</span> <span class="hljs-attr">style</span>=<span class="hljs-string">"position:absolute;"</span>></span>
<span class="hljs-tag"><<span class="hljs-name">img</span> <span class="hljs-attr">alt</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"bigimg"</span> <span class="hljs-attr">style</span>=<span class="hljs-string">"box-shadow: 0 0 10px rgba(0,0,0,0.38)"</span> <span class="hljs-attr">src</span>=<span class="hljs-string">""</span>/></span>
<span class="hljs-tag"></<span class="hljs-name">div</span>></span>
<span class="hljs-tag"></<span class="hljs-name">div</span>></span>
</code></div></pre>
<p>js逻辑实现</p>
<pre><div class="hljs"><code class="lang-js"><script>
<span class="hljs-comment">//点击图片,显示弹窗(放大图片)</span>
<span class="hljs-keyword">function</span> <span class="hljs-title function_">imgShow</span>(<span class="hljs-params">outerdiv, innerdiv, bigimg, _this</span>) {
<span class="hljs-keyword">let</span> src = _this.<span class="hljs-title function_">attr</span>(<span class="hljs-string">"src"</span>); <span class="hljs-comment">//获取当前点击的img元素中的src属性</span>
$(bigimg).<span class="hljs-title function_">attr</span>(<span class="hljs-string">"src"</span>, src); <span class="hljs-comment">//设置#bigimg元素的src属性</span>
<span class="hljs-comment">/*获取当前点击图片的真实大小,并显示弹出层及大图*/</span>
$(<span class="hljs-string">"<img/>"</span>).<span class="hljs-title function_">attr</span>(<span class="hljs-string">"src"</span>, src).<span class="hljs-title function_">on</span>(<span class="hljs-string">'load'</span>, <span class="hljs-keyword">function</span> (<span class="hljs-params"></span>) {
<span class="hljs-keyword">let</span> windowW = $(<span class="hljs-variable language_">window</span>).<span class="hljs-title function_">width</span>(); <span class="hljs-comment">//获取当前窗口宽度</span>
<span class="hljs-keyword">let</span> windowH = $(<span class="hljs-variable language_">window</span>).<span class="hljs-title function_">height</span>(); <span class="hljs-comment">//获取当前窗口高度</span>
<span class="hljs-keyword">let</span> realWidth = <span class="hljs-variable language_">this</span>.<span class="hljs-property">width</span>; <span class="hljs-comment">//获取图片真实宽度</span>
<span class="hljs-keyword">let</span> realHeight = <span class="hljs-variable language_">this</span>.<span class="hljs-property">height</span>; <span class="hljs-comment">//获取图片真实高度</span>
<span class="hljs-keyword">let</span> imgWidth, imgHeight;
<span class="hljs-keyword">let</span> scale = <span class="hljs-number">0.96</span>; <span class="hljs-comment">//缩放尺寸,当图片真实宽度和高度大于窗口宽度和高度时进行缩放</span>
<span class="hljs-keyword">if</span> (realHeight > windowH * scale) { <span class="hljs-comment">//判断图片高度</span>
imgHeight = windowH * scale; <span class="hljs-comment">//如大于窗口高度,图片高度进行缩放</span>
imgWidth = imgHeight / realHeight * realWidth; <span class="hljs-comment">//等比例缩放宽度</span>
<span class="hljs-keyword">if</span> (imgWidth > windowW * scale) { <span class="hljs-comment">//如宽度扔大于窗口宽度</span>
imgWidth = windowW * scale; <span class="hljs-comment">//再对宽度进行缩放</span>
}
} <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> (realWidth > windowW * scale) { <span class="hljs-comment">//如图片高度合适,判断图片宽度</span>
imgWidth = windowW * scale; <span class="hljs-comment">//如大于窗口宽度,图片宽度进行缩放</span>
imgHeight = imgWidth / realWidth * realHeight; <span class="hljs-comment">//等比例缩放高度</span>
} <span class="hljs-keyword">else</span> { <span class="hljs-comment">//如果图片真实高度和宽度都符合要求,高宽不变</span>
<span class="hljs-keyword">if</span> ((realWidth * <span class="hljs-number">1.2</span>) < windowW && (realHeight * <span class="hljs-number">1.2</span>) < windowH) {
imgWidth = realWidth * <span class="hljs-number">1.2</span>;
imgHeight = realHeight * <span class="hljs-number">1.2</span>;
} <span class="hljs-keyword">else</span> {
imgWidth = realWidth;
imgHeight = realHeight;
}
}
$(bigimg).<span class="hljs-title function_">css</span>(<span class="hljs-string">"width"</span>, imgWidth); <span class="hljs-comment">//以最终的宽度对图片缩放</span>
<span class="hljs-keyword">let</span> w = (windowW - imgWidth) / <span class="hljs-number">2</span>; <span class="hljs-comment">//计算图片与窗口左边距</span>
<span class="hljs-keyword">let</span> h = (windowH - imgHeight) / <span class="hljs-number">2</span>; <span class="hljs-comment">//计算图片与窗口上边距</span>
<span class="hljs-keyword">if</span> (<span class="hljs-title class_">Is</span>PC()) {
$(innerdiv).<span class="hljs-title function_">css</span>({
<span class="hljs-string">"top"</span>: h,
<span class="hljs-string">"left"</span>: w
}); <span class="hljs-comment">//设置#innerdiv的top和left属性</span>
} <span class="hljs-keyword">else</span> {
$(innerdiv).<span class="hljs-title function_">css</span>({
<span class="hljs-string">"top"</span>: <span class="hljs-string">"50%"</span>,
<span class="hljs-string">"left"</span>: <span class="hljs-string">"50%"</span>
}); <span class="hljs-comment">//设置#innerdiv的top和left属性</span>
$(innerdiv).<span class="hljs-title function_">css</span>({
<span class="hljs-string">"transform"</span>: <span class="hljs-string">"translateX(-50%) translateY(-50%)"</span>
});
}
$(outerdiv).<span class="hljs-title function_">fadeIn</span>(<span class="hljs-number">500</span>); <span class="hljs-comment">//淡入显示#outerdiv及img</span>
});
$(outerdiv).<span class="hljs-title function_">click</span>(<span class="hljs-keyword">function</span> (<span class="hljs-params"></span>) { <span class="hljs-comment">//再次点击淡出消失弹出层</span>
$(<span class="hljs-variable language_">this</span>).<span class="hljs-title function_">fadeOut</span>(<span class="hljs-number">300</span>);
});
}
<span class="hljs-keyword">function</span> <span class="hljs-title function_">IsPC</span>(<span class="hljs-params"></span>) {
<span class="hljs-keyword">var</span> userAgentInfo = navigator.<span class="hljs-property">userAgent</span>;
<span class="hljs-keyword">var</span> <span class="hljs-title class_">Agents</span> = [
<span class="hljs-string">"Android"</span>, <span class="hljs-string">"iPhone"</span>,
<span class="hljs-string">"SymbianOS"</span>, <span class="hljs-string">"Windows Phone"</span>,
<span class="hljs-string">"iPad"</span>, <span class="hljs-string">"iPod"</span>
];
<span class="hljs-keyword">var</span> flag = <span class="hljs-literal">true</span>;
<span class="hljs-keyword">for</span> (<span class="hljs-keyword">var</span> v = <span class="hljs-number">0</span>; v < <span class="hljs-title class_">Agents</span>.<span class="hljs-property">length</span>; v++) {
<span class="hljs-keyword">if</span> (userAgentInfo.<span class="hljs-title function_">indexOf</span>(<span class="hljs-title class_">Agents</span>[v]) > <span class="hljs-number">0</span>) {
flag = <span class="hljs-literal">false</span>;
<span class="hljs-keyword">break</span>;
}
}
<span class="hljs-keyword">return</span> flag;
};
$(<span class="hljs-string">".article-container img"</span>).<span class="hljs-title function_">click</span>(<span class="hljs-keyword">function</span> (<span class="hljs-params"></span>) { <span class="hljs-comment">//单击图片放大</span>
<span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(<span class="hljs-string">"图片放大"</span>);
<span class="hljs-keyword">let</span> _this = $(<span class="hljs-variable language_">this</span>); <span class="hljs-comment">//将当前的pimg元素作为_this传入函数</span>
<span class="hljs-title function_">imgShow</span>(<span class="hljs-string">"#outerdiv"</span>, <span class="hljs-string">"#innerdiv"</span>, <span class="hljs-string">"#bigimg"</span>, _this);
});
</script>
</code></div></pre>
留言