放大鏡效果

来源:https://www.cnblogs.com/ruo-shui-yi-fang/archive/2019/09/07/11478050.html
-Advertisement-
Play Games

使用電腦逛淘寶,京東等商城時,將滑鼠移入圖片中,圖片會放大,之前一直在想這種是怎麼實現的,前兩天剛寫出來,純js實現的,無任何工具庫。下麵先來看下思路吧! 剛學js的時候可能對於佈局不是很重要,但學到面向對象編程後,佈局就變得很重要了,有時候佈局會影響到整體效果;先來看下佈局吧! 佈局就搞定了,比較 ...


使用電腦逛淘寶,京東等商城時,將滑鼠移入圖片中,圖片會放大,之前一直在想這種是怎麼實現的,前兩天剛寫出來,純js實現的,無任何工具庫。下麵先來看下思路吧!

剛學js的時候可能對於佈局不是很重要,但學到面向對象編程後,佈局就變得很重要了,有時候佈局會影響到整體效果;先來看下佈局吧!

  1     <div class="photo">
  2         <div class="sbox">
  3             <img src="http://img0.imgtn.bdimg.com/it/u=4175582523,2707192513&fm=15&gp=0.jpg">
  4             <span></span>
  5         </div>
  6         <div class="bbox">
  7             <img src="http://img0.imgtn.bdimg.com/it/u=4175582523,2707192513&fm=15&gp=0.jpg">
  8         </div>
  9         <div class="nav">
 10             <span> &lt;</span>
 11             <img src="http://img0.imgtn.bdimg.com/it/u=4175582523,2707192513&fm=15&gp=0.jpg" class="selected">
 12             <img src="http://img4.imgtn.bdimg.com/it/u=181188734,374783636&fm=15&gp=0.jpg">
 13             <img src="http://img2.imgtn.bdimg.com/it/u=2136674516,3472494802&fm=15&gp=0.jpg">
 14             <img src="http://img0.imgtn.bdimg.com/it/u=3344949169,188332301&fm=15&gp=0.jpg">
 15             <span>></span>
 16         </div>
 17     </div>
 18 
 19 
 20     <style>
 21         .photo {
 22             width: 98%;
 23             height: 500px;
 24             margin: 20px auto;
 25             border: 1px solid black;
 26             position: relative;
 27         }
 28 
 29         .sbox {
 30             width: 600px;
 31             height: 300px;
 32             position: absolute;
 33             top: 20px;
 34             left: 20px;
 35         }
 36 
 37         .sbox img {
 38             width: 600px;
 39             height: 300px;
 40         }
 41 
 42         .sbox span {
 43             position: absolute;
 44             background-color: rgba(199, 199, 199, .5);
 45             top: 0;
 46             display: none;
 47             left: 0;
 48         }
 49 
 50         .bbox {
 51             width: 600px;
 52             height: 300px;
 53             overflow: hidden;
 54             position: absolute;
 55             top: 20px;
 56             left: 630px;
 57             display: none;
 58         }
 59 
 60         .bbox img {
 61             width: 1200px;
 62             height: 600px;
 63             position: absolute;
 64             top: 0;
 65             left: 0;
 66         }
 67 
 68         .nav {
 69             width: 300px;
 70             height: 32px;
 71             position: absolute;
 72             overflow: hidden;
 73             bottom: 20px;
 74             left: 20px;
 75 
 76         }
 77 
 78         .nav img {
 79             width: 60px;
 80             height: 30px;
 81             border: 1px solid #dddddd;
 82         }
 83 
 84         .nav img:first-of-type {
 85             margin-left: 20px;
 86         }
 87 
 88         .nav span {
 89             position: absolute;
 90             width: 16px;
 91             height: 32px;
 92             text-align: center;
 93             line-height: 30px;
 94             background-color: #cccccc;
 95             top: 0;
 96             cursor: pointer;
 97         }
 98 
 99         .nav span:last-child {
100             right: 0;
101         }
102 
103         .nav .selected {
104             border: 1px solid #e48c63;
105         }
106     </style>

佈局就搞定了,比較簡單的哈。下麵就是一個思路吧

  1. 選擇元素
  2. 滑鼠進入
    1. 顯示span和大圖
    2. 計算span的寬高
  3. 滑鼠移出
    1. 隱藏span和大圖
  4. 滑鼠移動
    1. span跟隨滑鼠移動
    2. span的邊界限定
    3. 計算比例
    4. 大圖跟隨小圖移動

大體思路就是這樣的,個人建議是根據思路直接自己寫,實在不會可以參照我的代碼哈!因為自己寫出來的和看了別人代碼再寫出來的感覺不太一樣的。好啦,下麵就是js部分的代碼!

 1 <script>
 2     // 創建函數
 3     function Big() {
 4         // 獲取元素
 5         this.span = document.querySelector(".sbox span");
 6         this.sbox = document.querySelector(".sbox");
 7         this.bbox = document.querySelector(".bbox");
 8         this.simg = document.querySelector(".sbox img");
 9         this.bimg = document.querySelector(".bbox img");
10         this.img = document.querySelectorAll(".nav img");
11         this.init();
12     }
13     Big.prototype.init = function () {
14         // this的指向問題
15         var that = this;
16         for (var i = 0; i < this.img.length; i++) {
17             this.img[i].index = i;
18         // 點擊導航圖
19             this.img[i].onclick = function () {
20                 for (var j = 0; j < that.img.length; j++) {
21                     // 清除預設樣式
22                     that.img[j].className = "";
23                 }
24                 // 給當前的圖片加樣式
25                 that.img[this.index].className = "selected";
26                 that.index = this.index;
27                 // 將當前圖放入主體框中
28                 that.changeImg();
29             }
30         }
31         // 滑鼠移入事件
32         this.sbox.onmouseover = function () {
33             // 顯示
34             that.span.style.display = "block";
35             that.bbox.style.display = "block";
36             // 計算span寬高
37             that.span.style.width = that.bbox.offsetWidth / that.bimg.offsetWidth * that.sbox.offsetWidth + "px";
38             that.span.style.height = that.bbox.offsetHeight / that.bimg.offsetHeight * that.sbox.offsetHeight + "px";
39         }
40         // 滑鼠移動
41         this.sbox.onmousemove = function () {
42             that.move();
43         }
44         // 滑鼠移出
45         this.sbox.onmouseout = function () {
46             // 隱藏
47             that.span.style.display = "none";
48             that.bbox.style.display = "none";
49         }
50     }
51     // 改變圖片
52     Big.prototype.changeImg = function () {
53         this.simg.src = this.img[this.index].src;
54         this.bimg.src = this.img[this.index].src;
55     }
56     // 移動
57     Big.prototype.move = function () {
58         this.span.style.left = event.clientX - this.sbox.offsetLeft - this.span.offsetWidth / 2 + "px";
59         this.span.style.top = event.clientY - this.sbox.offsetTop - this.span.offsetHeight / 2 + "px";
60         // 邊界限定
61         if (this.span.offsetLeft < 0) {
62             this.span.style.left = 0;
63         }
64         if (this.span.offsetTop < 0) {
65             this.span.style.top = 0;
66         }
67         if (this.span.offsetLeft > this.sbox.offsetWidth - this.span.offsetWidth) {
68             this.span.style.left = this.sbox.offsetWidth - this.span.offsetWidth + "px";
69         }
70         if (this.span.offsetTop > this.sbox.offsetHeight - this.span.offsetHeight) {
71             this.span.style.top = this.sbox.offsetHeight - this.span.offsetHeight + "px";
72         }
73         // 計算比例
74         var num=this.bbox.offsetWidth/this.bimg.offsetWidth;
75         console.log(num);
76         // 大圖移動
77         this.bimg.style.left=-(this.span.offsetLeft/num)+"px";
78         this.bimg.style.top=-(this.span.offsetTop/num)+"px";
79     }
80     new Big();
81 </script>

僅供參考,如有疑問,歡迎評論哈!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 現在很多網站都會使用瀑布流的一個效果,什麼是瀑布流呢,用在哪些地方呢? 大概就是這樣的一個效果,一般用於無法保證圖片大小的網站。 先看下佈局+css 實現的一個大概思路: 瀑布流:第一行正常浮動,從第二行開始,每個元素都定位到上一行的最小高度的元素下 1.獲取元素 2.佈局 3.區分第一行和後面的行 ...
  • 在javascript中常見的瀏覽器相容問題,以及解決方式。 在前端工作當中我們遵循這樣的原則:漸進增強和優雅降級 漸進增強(progressive enhancement): 針對低版本瀏覽器進行構建頁面,保證最基本的功能,然後再針對高級瀏覽器進行效果、交互等改進和追加功能達到更好的用戶體驗 優雅 ...
  • ES6
    1.什麼是ES6? ES的全稱是ECMAScript,ES6就是ES2016之後的一個泛稱,是由ECMA國際標準化組織制定的一項腳本語言的標準化規範。 2.ES6新增語法 1. let ES6中新增的用於聲明變數的關鍵字 特點: 1.let聲明的變數具有塊級作用域的特點,只在所處的塊級作用域有效 i ...
  • 1. 效果圖展示 2. 工程目錄結構 註意: webapp下的resources目錄放置easyui和js(jQuery文件是另外的) 3. 代碼 index.jsp springmvc.xml配置靜態資源 註意: 1. EasyUI和JQuery文件是放在webapp/resources目錄下的, ...
  • JS是以事件驅動為核心的一門語言。 事件的三要素:事件源、事件、事件驅動程式。 例如: 常見的事件如下: DOM:文檔對象模型。DOM 為文檔提供了結構化表示,並定義瞭如何通過腳本來訪問文檔結構。目的其實就是為了能讓js操作html元素而制定的一個規範。 DOM就是由節點組成的。 解析過程 HTML ...
  • 處理方法:數組改變用push ...
  • 一、let和const 1、let與var的區別 不存在變數提升 塊級作用域 不允許重覆聲明 2、const常量 const與let一樣,唯一區別在於聲明的常量不能被修改 二、解構賦值 es6按照一定模式,從數組和對象中提取值,對變數進行賦值,被稱為解構 1、數組的解構 + "模式匹配",只要等號兩 ...
  • 摘要: 求職還是需要認真準備的。 原文: "超實用技術面試手冊,從工作申請、面試考題再到優勢談判,GitHub獲30000星" 作者:量子位 技術人員求職面試,單刷leetcode上的大廠題庫可能還不夠。 簡歷怎麼寫才能吸引HR的眼光,可能會被技術老大問到哪些常見問題,拿到Offer之後怎樣才能讓自 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...