放大镜2.0版本

本文介绍了一个HTML页面,使用CSS和JavaScript实现了一个带有三种尺寸图片的响应式布局,用户可以通过鼠标操作在小中大图间切换,并实现放大镜效果。核心技术包括flexbox布局、背景图替换和事件监听。
摘要由CSDN通过智能技术生成
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        .container,
        ul {
            font-size: 0;
        }

        .container {
            width: 900px;
            display: flex;
            flex-wrap: wrap;
        }

        .mid {
            width: 430px;
            height: 430px;
            border: 1px solid;
            position: relative;
        }

        .large {
            width: 430px;
            height: 430px;
            border: 1px solid;
            margin-left: 20px;
        }

        ul {
            list-style: none;
            display: flex;
            margin: 20px 0;
            padding: 0;
        }

        li {
            border: 1px solid;
            margin-right: 10px;
        }

        i {
            display: block;
            width: 231px;
            height: 231px;
            background-color: rgba(0, 255, 0, .3);
            position: absolute;
        }

        .none {
            display: none;
        }
    </style>
</head>

<body>
    <div class="container">
        <div class="mid">
            <i class="none"></i>
        </div>
        <div class="large none"></div>
    </div>
    <ul>
    </ul>

    <script>
        const small_arr = ["../img/放大/下载 (6).jfif", "../img/放大/下载 (7).jfif", "../img/放大/下载 (10).jfif"];
        const middle_arr = ["../img/放大/下载 (4).jfif", "../img/放大/下载 (8).jfif", "../img/放大/下载 (11).jfif"];
        const large_arr = ["../img/放大/下载 (5).jfif", "../img/放大/下载 (9).jfif", "../img/放大/下载 (12).jfif"];

        const mid = document.querySelector(".mid"); // 中图
        const large = document.querySelector(".large"); // 大图
        const ul = document.querySelector("ul");    // ul
        const square = document.querySelector("i"); // 矩形

        // 渲染样式
        function render() {
            ul.innerHTML = small_arr.map((item, index) => `<li><img src='${item}' data-index='${index}'></li>`).join('');
            
            
            mid.style.backgroundImage = `url(${middle_arr[0]})`;
            
            large.style.backgroundImage = `url(${large_arr[0]})`;
        }
        render();

        // 移入小图改图片
        ul.onmouseover = function (event) {
            if (event.target.nodeName == 'IMG') {
                //获取自定义属性的下标
                let index = event.target.dataset.index;
                //对应下标更换中大图的图片路径(背景图)
                mid.style.backgroundImage = `url(${middle_arr[index]})`;
                large.style.backgroundImage = `url(${large_arr[index]})`;
            }
        }

        mid.onmousemove = function (event) {
            // 鼠标文档
            let [mouseClientX, mouseClientY] = [event.clientX, event.clientY];
            let x = mouseClientX - mid.offsetLeft - square.offsetWidth / 2;
            let y = mouseClientY - mid.offsetTop - square.offsetHeight / 2;

            if (x < 0) {
                x = 0;
            }
            if (x > mid.offsetWidth - square.offsetWidth) {
                x = mid.offsetWidth - square.offsetWidth;
            }
            if (y < 0) {
                y = 0;
            }
            if (y > mid.offsetHeight - square.offsetHeight) {
                y = mid.offsetHeight - square.offsetHeight;
            }
            square.style.cssText = `
                left: ${x}px;
                top: ${y}px;
            `;
            large.style.cssText += `
               background-position: ${-x * 1.86}px ${-y * 1.86}px;  
            `;
        }
        //移入放大镜显示
        mid.onmouseenter = function () {
            square.classList.remove('none');
            large.classList.remove('none');
            // square.className = '';
        }
        //移出放大镜隐藏
        mid.onmouseleave = function () {
            square.classList.add('none');
            large.classList.add('none');
        }



    </script>
</body>

</html>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
PyQt 是一个 Python 编程语言的 GUI 框架,可以用于创建应用程序的图形用户界面。PyQt提供了很多丰富的控件,包括放大镜控件。下面是一个简单的例子,演示如何使用 PyQt 实现一个放大镜: ```python from PyQt5.QtCore import Qt, QPoint, QRectF from PyQt5.QtGui import QImage, QPainter, QBrush, QColor, QPixmap from PyQt5.QtWidgets import QApplication, QMainWindow, QGraphicsScene, QGraphicsView, QGraphicsPixmapItem, QFrame, QHBoxLayout, QVBoxLayout, QWidget class ZoomGraphicsView(QGraphicsView): def __init__(self, parent=None): super(ZoomGraphicsView, self).__init__(parent) self.setRenderHint(QPainter.Antialiasing) self.setMouseTracking(True) self.zoomFactor = 2.0 self.zoomRect = QRectF() self.zoomPixMap = QPixmap() self.zoomPixmapItem = QGraphicsPixmapItem() self.zoomPixmapItem.setZValue(1) self.zoomPixmapItem.setOpacity(0.5) self.magnifyCursor = QCursor(QPixmap(":/images/magnify.png")) self.defaultCursor = Qt.ArrowCursor self.magnifying = False self.zooming = False self.setDragMode(QGraphicsView.ScrollHandDrag) def zoomIn(self): self.scale(self.zoomFactor, self.zoomFactor) def zoomOut(self): self.scale(1.0 / self.zoomFactor, 1.0 / self.zoomFactor) def wheelEvent(self, event): if event.angleDelta().y() > 0: self.zoomIn() else: self.zoomOut() def mousePressEvent(self, event): if event.button() == Qt.LeftButton: self.zooming = True self.zoomRect.setTopLeft(event.pos()) self.zoomRect.setBottomRight(event.pos()) self.zoomPixmapItem.setPixmap(QPixmap.grabWidget(self, QRectF(self.zoomRect)).scaled(self.zoomPixmapItem.boundingRect().size().toSize())) self.scene().addItem(self.zoomPixmapItem) self.setCursor(self.magnifyCursor) def mouseMoveEvent(self, event): if self.zooming: self.zoomRect.setBottomRight(event.pos()) self.zoomPixmapItem.setPixmap(QPixmap.grabWidget(self, QRectF(self.zoomRect)).scaled(self.zoomPixmapItem.boundingRect().size().toSize())) def mouseReleaseEvent(self, event): if event.button() == Qt.LeftButton: self.zooming = False self.scene().removeItem(self.zoomPixmapItem) self.zoomPixmapItem.setPixmap(QPixmap()) self.setCursor(self.defaultCursor) class MainWindow(QMainWindow): def __init__(self, parent=None): super(MainWindow, self).__init__(parent) self.scene = QGraphicsScene() self.view = ZoomGraphicsView(self.scene) self.view.setFrameStyle(QFrame.NoFrame) self.view.setDragMode(QGraphicsView.ScrollHandDrag) self.hbox = QHBoxLayout() self.hbox.addWidget(self.view) self.widget = QWidget() self.widget.setLayout(self.hbox) self.setCentralWidget(self.widget) self.setWindowTitle("Zoom Graphics View") self.setGeometry(100, 100, 600, 400) if __name__ == '__main__': app = QApplication([]) window = MainWindow() window.show() app.exec_() ``` 上面的代码中,ZoomGraphicsView 类继承自 QGraphicsView 类,实现了放大镜的功能。在 mousePressEvent、mouseMoveEvent 和 mouseReleaseEvent 方法中,通过创建 QGraphicsPixmapItem 对象的方式,实现了放大镜的效果。在鼠标点击时,会创建一个 QGraphicsPixmapItem 对象,并将其添加到 QGraphicsScene 中,然后根据鼠标移动的位置,调整 QGraphicsPixmapItem 对象的大小和位置,从而实现放大镜的效果。在鼠标释放时,会从 QGraphicsScene 中移除 QGraphicsPixmapItem 对象。 这只是一个简单的例子,如果需要更高级的放大镜效果,可以根据需求进行扩展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

等儿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值