基于angularjs实现图片放大镜效果


Posted in Javascript onAugust 31, 2016

前言

一开始打算用原生的angularjs写,但是发现用原生angularjs,无论如何都不能获取里面图片的宽度和高度,因为angularjs内置的jquery方法里没有winth()  、height()方法。

最好我还是引入了jquery,在同一scope上绑定了宽度高度。下面上源码,顺便我会把里面的一些注意的点说一下。

效果图

基于angularjs实现图片放大镜效果

首先说明下

1、首先使用了两个同级指令,并在两个同级指令间进行通信,同级指令间通信,非常简单,就是不要让同级的指令生成独立的scope,并且在同一个作用域下就完成了。如果指令scope没有特殊声明,那么就是父scope。指令生成的模板没有特殊意义,除非在特定的scope下编译,默认情况下,指令并不会创建新的子scope,更多的是使用父scope,也就是说,如果指令存在一个controller下,它会使用controller下的scope

2、然后就是用$q来延迟异步获取数据,这个也可以看一下$q的用法。

源码示例

<!DOCTYPE html>
<html lang="en" ng-app="magnifierAPP">
<head>
  <meta charset="UTF-8">
  <title></title>
  <script src="lib/angular.min.js" type="text/javascript"></script>
  <script src="lib/angular-animate.js" type="text/javascript"></script>
  <script src="lib/jquery-2.1.4.min.js" type="text/javascript"></script>
</head>
<style>
  *{
    padding: 0px;
    margin: 0px;
  }
  .content{
    width: 800px;
    height: 400px;
    position: relative;
    border: 1px solid red;
  }
  .left{
    width: 310px;
    height: 380px;
  }
  .top{
    width: 310px;
    height: 310px;
    border: 1px solid blue;
    cursor: pointer;
  }
  .top img{
    width: 310px;
    height: 310px;
  }
  .bottom{
    position: relative;
    width: 310px;
    height: 60px;
    border: 1px solid black;
  }
  .bottom img{
    display: inline-block;
    width: 60px;
    height: 60px;
    float: left;
    margin: 0 30px;
    cursor: pointer;
  }
  .right{
    border: 1px solid ;
    width: 300px;
    height: 300px;
    position: absolute;
    left: 400px;
    top: 20px;
    overflow: hidden;
  }
  .right img{
    position: absolute;
    width: 700px;
    height: 600px;
  }
  .show{
    display: block;
  }
  .hidden{
    display: none;
  }
</style>
<body>
<div ng-controller="magnifierController">
  <div class="content">
    <div class="left" ng-init="isActive=0">
      <div>{{x}}+{{y}}</div>
      <div magnifier-top></div>
      <div class="bottom" >
        <img src="img/blue_1.jpg" alt="1" ng-mouseover="isActive=0"/>
        <img src="img/yellow_1.jpg" alt="1" ng-mouseover="isActive=1"/>
      </div>
    </div>
    <div magnifier-right>
      <div>{{x}}+{{y}}</div>
    </div>
  </div>
  <script type="text/ng-template" id="magnifier-top.html">
    <div class="top" ng-mousemove="getPosition($event.offsetX,$event.offsetY)" ng-mouseover="isshow=true" ng-mouseleave="isshow=false">
      <img src="img/blue_2.jpg" alt="0" ng-class="{true:'show',false:'hidden'}[isActive==0]"/>
      <img src="img/yellow_2.jpg" alt="1" ng-class="{true:'show',false:'hidden'}[isActive==1]"/>
    </div>
  </script>

  <script type="text/ng-template" id="magnifier-right.html" >
    <div class="right" >
      <img src="{{img1.src}}" alt="1" ng-class="{true:'show',false:'hidden'}[isActive==0]" id="img1"/>
      <img src="{{img2.src}}" alt="1" ng-class="{true:'show',false:'hidden'}[isActive==1]"/>
    </div>
  </script>
</div>
</body>
<script>
  var app=angular.module('magnifierAPP',[]);
  app.controller('magnifierController',['$scope', function ($scope) {

  }]);
  app.directive('magnifierRight',['readJson',function (readJson) {
    return {
      restrict: 'EA',
      replace:true,
      templateUrl:'magnifier-right.html',

      link: function (scope,element,attr) {
        var promise=readJson.getJson();
        promise.then(function (data) {
          scope.img1=data[0];
          scope.img2=data[1];
        });
        //右侧容器内照片宽度、高度
        scope.rightWidth=$(element).find("img").eq(scope.isActive).width();
        scope.rightHeight=$(element).find("img").eq(scope.isActive).height();
        //右侧容器宽度、高度
        scope.rightBoxWidth=$(element).width();
        scope.rightBoxHeight=$(element).height();
        //移动比例
        var radX=(scope.rightWidth-scope.rightBoxWidth)/scope.topWidth;
        var radY=(scope.rightHeight-scope.rightBoxHeight)/scope.topHeight;

        console.log(radX);
        console.log(radY);
        setInterval(function (){
          scope.$apply(function (){
            element.find("img").eq(scope.isActive).css({
              "left":-scope.x*radX+"px",
              "top":-scope.y*radY+"px"
            });
          })
        },30)
      }
    }
  }]);
  app.directive('magnifierTop',[function () {
    return{
      restrict:'EA',
      replace:true,
      templateUrl:'magnifier-top.html',
      link: function (scope,element,attr) {
        scope.topWidth=$(element).find("img").eq(scope.isActive).width();
        scope.topHeight=$(element).find("img").eq(scope.isActive).height();
        scope.getPosition= function (x,y) {
          scope.x=x;
          scope.y=y;
        }
      }
    }
  }]);
  app.factory('readJson',['$http','$q', function ($http,$q) {
    return{
      getJson: function (){
        var deferred=$q.defer();
        $http({
          method:'GET',
          url:'magnifier.json'
        }).success(function (data, status, header, config) {
          deferred.resolve(data);
        }).error(function (data, status, header, config) {
          deferred.reject(data);
        });
        return deferred.promise;
      }
    }
  }]);
</script>
</html>

总结

以上就是这篇文章的全部内容,不知道大家都学会了吗?希望这篇文章对大家的学习或者工作能带来一定帮助,如果有问题欢迎大家留言交流。

Javascript 相关文章推荐
JQuery入门——事件切换之hover()方法应用介绍
Feb 05 Javascript
javascript检查表单数据是否改变的方法
Jul 30 Javascript
javascript 动态修改css样式方法汇总(四种方法)
Aug 27 Javascript
jQuery实现简单的点赞效果
May 29 Javascript
jQuery获取多种input值的简单实现方法
Jun 20 Javascript
JavaScript兼容性总结之获取非行间样式案例
Aug 07 Javascript
jQuery实现checkbox列表的全选、反选功能
Nov 24 Javascript
浅谈原生JS实现jQuery的animate()动画示例
Mar 08 Javascript
React Native之ListView实现九宫格效果的示例
Aug 02 Javascript
node.js多个异步过程中判断执行是否完成的解决方案
Dec 10 Javascript
详解vue-video-player使用心得(兼容m3u8)
Aug 23 Javascript
浅谈laytpl 模板空值显示null的解决方法及简单的js表达式
Sep 19 Javascript
用AngularJS的指令实现tabs切换效果
Aug 31 #Javascript
简洁实用的BootStrap jQuery手风琴插件
Aug 31 #Javascript
AngularJS实现一次监听多个值发生的变化
Aug 31 #Javascript
利用Angularjs和bootstrap实现购物车功能
Aug 31 #Javascript
JavaScript String(字符串)对象的简单实例(推荐)
Aug 31 #Javascript
基于JavaScript实现鼠标向下滑动加载div的代码
Aug 31 #Javascript
Node.js配合node-http-proxy解决本地开发ajax跨域问题
Aug 31 #Javascript
You might like
wiki-shan写的php在线加密的解密程序
2008/09/07 PHP
简单的php写入数据库类代码分享
2011/07/26 PHP
mysql数据库差异比较的PHP代码
2012/02/05 PHP
关于初学PHP时的知识积累总结
2013/06/07 PHP
PHP可变变量学习小结
2015/11/29 PHP
FleaPHP框架数据库查询条件($conditions)写法总结
2016/03/19 PHP
PHP GD库相关图像生成和处理函数小结
2016/09/30 PHP
PHP实现生成模糊图片的方法示例
2017/12/21 PHP
js活用事件触发对象动作
2008/08/10 Javascript
超简单的jquery的AJAX用法
2010/05/10 Javascript
基于JavaScript自定义构造函数的详解说明
2013/04/24 Javascript
js实现简易聊天对话框
2017/08/17 Javascript
基于mpvue小程序使用echarts画折线图的方法示例
2019/04/24 Javascript
Python实现去除代码前行号的方法
2015/03/10 Python
Django的session中对于用户验证的支持
2015/07/23 Python
Python 获得13位unix时间戳的方法
2017/10/20 Python
python 3调用百度OCR API实现剪贴板文字识别
2018/09/04 Python
对python 匹配字符串开头和结尾的方法详解
2018/10/27 Python
Python实现查找字符串数组最长公共前缀示例
2019/03/27 Python
Python3中列表list合并的四种方法
2019/04/19 Python
Python多进程方式抓取基金网站内容的方法分析
2019/06/03 Python
Python实现制度转换(货币,温度,长度)
2019/07/14 Python
Django实现列表页商品数据返回教程
2020/04/03 Python
django自带的权限管理Permission用法说明
2020/05/13 Python
Python实现进度条和时间预估的示例代码
2020/06/02 Python
Python如何对XML 解析
2020/06/28 Python
浅谈tensorflow 中的图片读取和裁剪方式
2020/06/30 Python
如何基于Python Matplotlib实现网格动画
2020/07/20 Python
Python实现JS解密并爬取某音漫客网站
2020/10/23 Python
tensorflow2.0教程之Keras快速入门
2021/02/20 Python
瑞贝卡·泰勒官方网站:Rebecca Taylor
2016/09/24 全球购物
业务代表的岗位职责
2013/11/16 职场文书
财务工作者先进事迹材料
2014/01/17 职场文书
计算机专业自荐信范文
2014/05/28 职场文书
干部个人考察材料
2014/12/24 职场文书
Redis 限流器
2022/05/15 Redis