angularjs ng-style:背景图像不起作用


76

我正在尝试通过使用angular将背景图像应用于div ng-style(我之前尝试过使用具有相同行为的自定义指令),但是它似乎没有用。

<nav
    class="navigation-grid-container"
    data-ng-class="{ bigger: isNavActive == true }"
    data-ng-controller="NavigationCtrl"
    data-ng-mouseenter="isNavActive = true; $parent.isNavActive = true"
    data-ng-mouseleave="isNavActive = false; $parent.isNavActive = false"
    data-ng-show="$parent.navInvisible == false"
    data-ng-animate="'fade'"
    ng-cloak>

    <ul class="navigation-container unstyled clearfix">
        <li
            class="navigation-item-container"
            data-ng-repeat="(key, item) in navigation"
            data-ng-class="{ small: $parent.isNavActive, big: isActive == true }"
            data-ng-mouseenter="isActive = true; isInactive= false"
            data-ng-mouseleave="isActive = false; isInactive= true">

            <div data-ng-switch on="item.id">

                <div class="navigation-item-default" data-ng-switch-when="scandinavia">
                    <a class="navigation-item-overlay" data-ng-href="{{item.id}}">
                        <div class="navigation-item-teaser">
                            <span class="navigation-item-teaser-text" data-ng-class="{ small: isScandinavia }">{{item.teaser}}</span>
                        </div>
                    </a>
                    <span class="navigation-item-background" data-ng-style="{ 'background-image': 'public/img/products/{{item.id}}/detail/wide/{{item.images.detail.wide[0]}}' }"></span>
                </div>

                <div class="navigation-item-last" data-ng-switch-when="static">
                    <div class="navigation-item-overlay">
                        <div class="navigation-item-teaser">
                            <span class="navigation-item-teaser-text">
                                <img data-ng-src="{{item.teaser}}">
                            </span>
                        </div>
                    </div>
                    <span class="navigation-item-background">
                        <img class="logo" data-ng-src="{{item.images.logo}}">
                    </span>
                </div>

                <div class="navigation-item-default" data-ng-switch-default>
                    <a class="navigation-item-overlay" data-ng-href="{{item.id}}">
                        <div class="navigation-item-teaser">
                            <span class="navigation-item-teaser-text">{{item.teaser}}</span>
                        </div>
                    </a>
                    <span class="navigation-item-background" data-ng-style="{ 'background-image': 'public/img/products/{{item.id}}/detail/wide/{{item.images.detail.wide[0]}}' }"></span>
                </div>

            </div>
        </li>
    </ul>
</nav>

不过,如果我尝试使用背景色,则效果似乎很好。我也尝试了远程源和本地源http://lorempixel.com/g/400/200/sports/,但都没有用。

Answers:


113

正确的语法background-image是:

background-image: url("path_to_image");

ng-style的正确语法是:

ng-style="{'background-image':'url(https://www.google.com/images/srpr/logo4w.png)'}">

顺便说一句,我怎么渲染类似:{{products.products[currenRoute].desc}}; 在HTML中?
罗兰

我想这currentRoute是路线的产品ID?如果是这种情况,则$ routeParams服务(如果将其注入到控制器中)将保存对id($scope.productId = $routeParams.id)的引用,因为您的路由定义为'/ products /:id'。但是您可能要为此提出一个新问题。
Stewie 2013年

那样的东西,但是我已经可以访问了currenRoute。这是一个字符串,所以我有一个产品列表:snippi.com/s/rznpfvo ; 我currentRoute是一个字符串,它与产品列表中的ID之一匹配。而且由于我做不到,{{products.products.currenRoute.desc}}所以我不得不寻找另一种方式……
罗兰

例如,在controller:中使用underscore.js$scope.product = _($scope.products).findWhere({id: $scope.currentRoute})然后在view中使用<span>{{product.title}}</span>。但是,我们不要将评论用作聊天。发表新问题。
Stewie 2013年

186

可以通过两种方式解析动态值。

用双花括号插值:

ng-style="{'background-image':'url({{myBackgroundUrl}})'}"

字符串串联:

ng-style="{'background-image': 'url(' + myBackgroundUrl + ')'}"

ES6模板文字:

ng-style="{'background-image': `url(${myBackgroundUrl})`}"

13
这实际上是最好的答案(或至少是我的问题...)
standup75

5
您也可以使用花括号写一个表达式:data-ng-style="{'background-image':'url(img/products/{{product.img}})'}"
mykola.rykov 2014年

请注意,如果您使用的语法不正确(例如内的转义单引号url()),浏览器可能会拒绝该值而不进行设置。

您的选择对我不起作用。但第二个选项DID起作用。谢谢
Joe Naber

首先不工作。第二项工作。最好的答案谢谢
Adesh Kumar

15

如果您有数据,则正在等待服务器返回(item.id)并具有以下结构:

ng-style="{'background-image':'url(https://www.myImageplusitsid/{{item.id}})'}"

确保添加类似 ng-if="item.id"

否则,您将有两个请求或一个错误。


10

对于那些正在努力使其与IE11一起工作的人

的HTML

<div ng-style="getBackgroundStyle(imagepath)"></div>

JS

$scope.getBackgroundStyle = function(imagepath){
    return {
        'background-image':'url(' + imagepath + ')'
    }
}

2
您刚刚救了我一命,谢谢。。我花了数小时试图弄清楚为什么ng样式未在IE 11中显示。我仍然不明白为什么,但是这样做有效!
w3bMak3r 2015年

也是唯一在铬中起作用的东西(ubuntu),所有其他示例或“官方方式”似乎都被忽略了。样式已更改,但无效。
davidkonrad

1

这对我有用,不需要花括号。

ng-style="{'background-image':'url(../../../app/img/notification/'+notification.icon+'.png)'}"

notification.icon是作用域变量。


1

如果我们有一个动态值需要放在css background或background-image属性中,则指定起来可能会有些棘手。

假设我们的控制器中有一个getImage()函数。该函数返回一个类似于以下格式的字符串:url(icons / pen.png)。如果这样做,则与以前完全相同的方式指定ngStyle声明:

ng-style="{ 'background-image': getImage() }"

确保在背景图像键名称周围加上引号。请记住,必须将其格式化为有效的Javascript对象密钥。


引用的来源是什么?
Manas

0

仅仅为了记录,您还可以在控制器中定义对象,如下所示:

this.styleDiv = {color: '', backgroundColor:'', backgroundImage : '' };

然后您可以定义一个函数来直接更改对象的属性:

this.changeBackgroundImage = function (){
        this.styleDiv.backgroundImage = 'url('+this.backgroundImage+')';
    }

通过这种方式,您可以动态修改样式。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.