这个做法最终的效果是横向宽度100%,高度最高为300px,当图片的宽度大于高度时,图片会垂直居中,如果图片的宽度小于高度时,横向100%,超过300px的部分将会被隐藏,效果如下:

做法是使用栅格布局,每行显示4个,页面代码如下:

<div class="row">
  <div class="col-md-3" *ngFor="let l of lists; let i = index">
    <div class="card">
      <div class="card-block">
        <div class="form-group cover" [style.background-color]="ranColor(i)">
            <img [src]="l.url" imgresize>
        </div>
        <div class="form-group">
          <label class="form-control-label">名字</label>
          <select class="form-control">
            <option>Jason Stanson</option>
            <option>黄立行</option>
            <option>高圆圆</option>
            <option>刘亦菲</option>
          </select>
        </div>
      </div>
    </div>
  </div>
</div>

ts代码:

//这个是背景颜色的代码,网上找的,颜色很柔和,看上去很舒服
colorList: any = ['#E3A05C','#b2be7e','#726f80','#390d31','#5a3d42','#14446a','#113f3d','#3c4f39','#5f5c33','#b3d66e','#fff5f6','#b2c8bb','#458994'];
//这个是在循环的过程中添加背景色
ranColor(index?: number) {
  return this.colorList[index];
}

CSS代码如下,内容很少:

img {
  width: 100%;
}

.cover {
  height: 300px;
  overflow: hidden;
}

重要的地方是使用angular2 的directive如何让图片居中,思路是使用属性绑定,获得图片的高度和宽度,进行计算,得到一个margin-top的值,将这个值赋值给图片对象,这里绑定了margin-top属性,监听了窗口的load和window.resize事件:

import {Directive,ElementRef,HostBinding,HostListener} from "@angular/core";

@Directive({
  selector: '[imgresize]'
})

export class ImgResizeDirective {

  _dom: any;
  _margin_top: any;

  constructor(private elem: ElementRef) {
    this._dom = this.elem;
  }

  @HostBinding('style.marginTop.px') get width() {
    return this._margin_top ? this._margin_top : 0;
  }

  @HostListener('load')
  load() {
      let h = this._dom.nativeElement.offsetHeight;
      let w = this._dom.nativeElement.offsetWidth;
    if (300 > h) {
      this._margin_top = (300 - h)/2;
    }
    if (300 < h) {
      this._margin_top = 0;
    }
  }

  @HostListener('window:resize')
  resizeWindow() {
    let h = this._dom.nativeElement.offsetHeight;
    let w = this._dom.nativeElement.offsetWidth;
    if (300 > h) {
      this._margin_top = (300 - h)/2;
    }
    if (300 < h) {
      this._margin_top = 0;
    }
  }
}

angular2 directive 让图片垂直居中的更多相关文章

  1. 微信小程序canvas实现水平、垂直居中效果

    这篇文章主要介绍了小程序中canvas实现水平、垂直居中效果,本文图文实例代码相结合给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下

  2. 基于Html5 canvas实现裁剪图片和马赛克功能及又拍云上传图片 功能

    这篇文章主要介绍了基于Html5 canvas实现裁剪图片和马赛克功能及又拍云上传图片 功能,需要的朋友可以参考下

  3. HTML5 图片悬停放大的实现代码示例

    这篇文章主要介绍了HTML5 图片悬停放大的实现代码示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  4. ios – 如何垂直居中UICollectionView内容

    我试图动态地居中UICollectionView的内容,但是现有的解决方案都没有考虑到每行可能有多个单元格的事实.我在这里尝试了这个centercustomtitleinUINavigationBar?以及两种解决方案:UICollectionViewverticallyCentred,无济于事.我很惊讶iOS默认情况下无法做到这一点,甚至更多的是无法获得当前显示的行数(这也解决了我的问题).此外

  5. ios – 使用NSLayoutConstraint垂直居中两个视图

    解决方法通过这样做,我能够做到这一点:棘手的部分是恒定值.该值是所有视图高度的一半,包括它们的分隔符.这意味着,如果imageview的高度为360,按钮的高度为70,分隔符为60,则该常量将为/2=245.确实应该有一种更聪明的方式,但是现在我觉得这没关系.

  6. iOS 8 autolayout,VFL和margin等于或大于

    这是一个错误还是我做错了?

  7. ios – Multiline UILabel?

    我需要插入UILabel多行文本.我做以下事情:arrEx由两个项组成,因此它应该是两个字符串.但是UITableViewCell只包含第一个字符串.在IB中,我将UILabelcell.exsInfoLabel的行数设置为0.解决方法试试这个:

  8. ios – 垂直居中UITextField的attributionPlaceholder

    我目前无法在UITextField中垂直对齐一个attributionPlaceholder,我不知道为什么.这就是我在做的事情:以下是发生的事情:很明显,这是因为UITextFieldLabel的高度比UItextField本身小10px,但我似乎无法改变它.这只发生在使用attributionPlaceholder时;默认的占位符属性工作得很好.有任何想法吗?解决方法使用NSParagraph

  9. Swift Core Graphics教程之Gradients 与 Context

    你使用过UIBezierPath的就是在UIKit层中对CoreGraphics层中CGPath的封装。你可以看到CoreGraphics的对象和方法都是CG开头的,非常容易辨认。视图将包含一个Graph和CounterViews,确定他们是视图控制器的主视图的子视图,并且Graph在CounterViews之上。打开ViewController.swift,为Container和GraphViews添加outloets:@IBOutletweakvarcontainerView:UIView!最后,为了

  10. swift 创建cocoapod

    Butwhenyou’redevelopingyourownCocoaPod,youwillinsteadspecifyalocalpath,likethis:Therearetwobenefitstothisapproach:Itusesthelocalfilesonyourmachineforthepod,insteadoffetchingthemfromaremoterepository.n

随机推荐

  1. Angular2 innerHtml删除样式

    我正在使用innerHtml并在我的cms中设置html,响应似乎没问题,如果我这样打印:{{poi.content}}它给了我正确的内容:``但是当我使用[innerHtml]=“poi.content”时,它会给我这个html:当我使用[innerHtml]时,有谁知道为什么它会剥离我的样式Angular2清理动态添加的HTML,样式,……

  2. 为Angular根组件/模块指定@Input()参数

    我有3个根组件,由根AppModule引导.你如何为其中一个组件指定@input()参数?也不由AppModalComponent获取:它是未定义的.据我所知,你不能将@input()传递给bootstraped组件.但您可以使用其他方法来做到这一点–将值作为属性传递.index.html:app.component.ts:

  3. angular-ui-bootstrap – 如何为angular ui-bootstrap tabs指令指定href参数

    我正在使用角度ui-bootstrap库,但我不知道如何为每个选项卡指定自定义href.在角度ui-bootstrap文档中,指定了一个可选参数select(),但我不知道如何使用它来自定义每个选项卡的链接另一种重新定义问题的方法是如何使用带有角度ui-bootstrap选项卡的路由我希望现在还不算太晚,但我今天遇到了同样的问题.你可以通过以下方式实现:1)在控制器中定义选项卡href:2)声明一个函数来改变控制器中的散列:3)使用以下标记:我不确定这是否是最好的方法,我很乐意听取别人的意见.

  4. 离子框架 – 标签内部的ng-click不起作用

    >为什么标签标签内的按钮不起作用?>但是标签外的按钮(登陆)工作正常,为什么?>请帮我解决这个问题.我需要在点击时做出回复按钮workingdemo解决方案就是不要为物品使用标签.而只是使用divHTML

  5. Angular 2:将值传递给路由数据解析

    我正在尝试编写一个DataResolver服务,允许Angular2路由器在初始化组件之前预加载数据.解析器需要调用不同的API端点来获取适合于正在加载的路由的数据.我正在构建一个通用解析器,而不是为我的许多组件中的每个组件设置一个解析器.因此,我想在路由定义中传递指向正确端点的自定义输入.例如,考虑以下路线:app.routes.ts在第一个实例中,解析器需要调用/path/to/resourc

  6. angularjs – 解释ngModel管道,解析器,格式化程序,viewChangeListeners和$watchers的顺序

    换句话说:如果在模型更新之前触发了“ng-change”,我可以理解,但是我很难理解在更新模型之后以及在完成填充更改之前触发函数绑定属性.如果您读到这里:祝贺并感谢您的耐心等待!

  7. 角度5模板形式检测形式有效性状态的变化

    为了拥有一个可以监听其包含的表单的有效性状态的变化的组件并执行某些组件的方法,是reactiveforms的方法吗?

  8. Angular 2 CSV文件下载

    我在springboot应用程序中有我的后端,从那里我返回一个.csv文件WheniamhittingtheURLinbrowsercsvfileisgettingdownloaded.现在我试图从我的角度2应用程序中点击此URL,代码是这样的:零件:服务:我正在下载文件,但它像ActuallyitshouldbeBook.csv请指导我缺少的东西.有一种解决方法,但您需要创建一个页面上的元

  9. angularjs – Angular UI-Grid:过滤后如何获取总项数

    提前致谢:)你应该避免使用jQuery并与API进行交互.首先需要在网格创建事件中保存对API的引用.您应该已经知道总行数.您可以使用以下命令获取可见/已过滤行数:要么您可以使用以下命令获取所选行的数量:

  10. angularjs – 迁移gulp进程以包含typescript

    或者我应该使用tsc作为我的主要构建工具,让它解决依赖关系,创建映射文件并制作捆绑包?

返回
顶部