基于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 相关文章推荐
JavaScript自动设置IFrame高度的小例子
Jun 08 Javascript
jquery ajax实现下拉框三级无刷新联动,且保存保持选中值状态
Oct 29 Javascript
Jquery原生态实现表格header头随滚动条滚动而滚动
Mar 18 Javascript
jquery中的ajax方法怎样通过JSONP进行远程调用
May 04 Javascript
js实现按钮颜色渐变动画效果
Aug 20 Javascript
基于模板引擎Jade的应用(详解)
Dec 12 Javascript
基于D3.js实现时钟效果
Jul 17 Javascript
Vue 利用指令实现禁止反复发送请求的两种方法
Sep 15 Javascript
使用vue制作滑动标签
Sep 21 Javascript
layui加载数据显示loading加载完成loading消失的实例代码
Sep 23 Javascript
如何在Express4.x中愉快地使用async的方法
Nov 18 Javascript
JS获取一个字符串中指定字符串第n次出现的位置
Feb 10 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
用PHP制作静态网站的模板框架(一)
2006/10/09 PHP
用php获取远程图片并把它保存到本地的代码
2008/04/07 PHP
使用PHP实现下载CSS文件中的图片
2015/12/06 PHP
php array_merge_recursive 数组合并
2016/10/26 PHP
javaScript对象和属性的创建方法
2007/01/15 Javascript
Javascript 跨域访问解决方案
2009/02/14 Javascript
js checkbox(复选框) 使用集锦
2009/04/28 Javascript
js实现的日期操作类DateTime函数代码
2010/03/16 Javascript
jQuery 表格插件整理
2010/04/27 Javascript
js关闭模态窗口刷新父页面或跳转页面
2012/12/13 Javascript
textarea 控制输入字符字节数(示例代码)
2013/12/27 Javascript
JavaScript输入邮箱自动提示实例代码
2014/01/13 Javascript
jQuery实现的登录浮动框效果代码
2015/09/26 Javascript
node.js爬虫爬取拉勾网职位信息
2017/03/14 Javascript
React组件内事件传参实现tab切换的示例代码
2018/07/04 Javascript
JavaScript原型对象、构造函数和实例对象功能与用法详解
2018/08/04 Javascript
element-ui如何防止重复提交的方法步骤
2019/12/09 Javascript
React实现评论的添加和删除
2020/10/20 Javascript
python处理文本文件实现生成指定格式文件的方法
2014/07/31 Python
Python生成短uuid的方法实例详解
2018/05/29 Python
python模糊图片过滤的方法
2018/12/14 Python
自学python的建议和周期预算
2019/01/30 Python
Python常用扩展插件使用教程解析
2020/11/02 Python
如何向scrapy中的spider传递参数的几种方法
2020/11/18 Python
paramiko使用tail实时获取服务器的日志输出详解
2020/12/06 Python
德购商城:德国进口直邮商城
2017/06/13 全球购物
台湾流行服饰购物平台:OB严选
2018/01/21 全球购物
德国黑胶唱片、街头服装及运动鞋网上商店:HHV
2018/08/24 全球购物
英国门销售网站:Green Tree Doors
2020/01/07 全球购物
大学生毕业自我鉴定范文
2013/09/19 职场文书
个性大学生自我评价
2013/12/04 职场文书
《会走路的树》教后反思
2014/04/19 职场文书
2015学校年度工作总结
2015/05/11 职场文书
团队拓展训练感想
2015/08/07 职场文书
清明节随笔
2015/08/15 职场文书
班干部学习委员竞选稿
2015/11/20 职场文书