如何撰写这样的布局?

时间:2012-08-24 12:42:45

标签: html css

这里的第一张图片是由网页设计师创建的草稿。

这里的第二张图片是我为此创建正确的HTML / CSS布局的结果。

问题是:如何使用适当的HTML5和CSS在评级药片周围创建这个透明字段。解决方案必须是跨浏览器和超级兼容(包括IE7和更高版本)。

评级药丸宽度不固定,取决于其内部的数字,因此透明区域必须反映这一点。

这是我目前的布局:

<div class="evo-module-c4b style="background-image: url('/i/oranges.jpg');">

    <div class="price">
        <span class="icon"></span>
        <span class="value">10,950</span>
    </div>

    <div class="die"></div>

    <div class="rating-wrapper">
        <div class="evo-rating">
            <span class="value">+100500</span>
        </div>
    </div>

    <div class="content">
        <h2>Lorem ipsum dolor</h2>
        <p class="author">Donec et</p>
        <p class="data">24.08.2012 10:53</p>
        <h3>Nunc pellentesque justo diam, sed dictum dolor.</h3>
    </div>

</div>

LESS:

div.evo-module-c4b {
    position: relative;
    width: @module-big-width;
    height: 250px;
    background-color: @color-gray-1;
    background-position: 0 0;
    background-repeat: no-repeat;
    overflow: hidden;

    div.price {
        position: absolute;
        top: 18px;
        right: 24px;
        span.icon {
            display: block;
            float: left;
            width: 16px;
            height: 16px;
            background-image: url('/i/evo/icons-imageset.png');
            background-position: -20px 0;
            background-repeat: no-repeat;
        }
        span.value {
            display: block;
            float: left;
            margin-left: 4px;
            font-size: 18px;
            font-weight: bold;
            color: @color-white;
        }
    }

    div.die {
        position: absolute;
        left: 0;
        bottom: 0;
        width: 100%;
        height: 108px;
        background-color: @color-gray-10;
        //background-image: url('/i/evo/modules/c4b/die.png');
        background-position: 0 0;
        background-repeat: no-repeat;
        z-index: 0;
    }

    div.rating-wrapper {
        position: absolute;
        width: 100%;
        top: 122px;
        text-align: center;
        div.evo-rating {
            display: inline-block;
        }
    }

    div.content {
        position: absolute;
        left: 0;
        top: 172px;
        width: 100%;
        z-index: 1;

        h2, h3, p {
            margin: 0;
            padding: 0;
            line-height: normal;
            text-align: center;
        }

        h2 {
            font-size: 18px;
            font-weight: bold;
        }

        p.author {
            font-size: 12px;
            font-weight: bold;
        }

        p.data {
            font-size: 10px;
            color: @color-gray-4;
        }

        h3 {
            font-size: 12px;
            color: @color-gray-4;
        }
    }
}

div.evo-rating {
    span.value {
        .evo-border-radius(@rating-height / 2 + 3px);
        display: block;
        height: @rating-height;
        font-size: 18px;
        font-weight: bold;
        line-height: @rating-height;
        color: @color-major;
        background-color: @color-white;
        border: 3px solid @color-major;
        padding: 0 5px;
    }
}

有什么建议吗? )

5 个答案:

答案 0 :(得分:2)

更改灰色背景以获取孔的alpha图像并将其添加到图片上。您可能需要不同的尺寸,因为宽度可能会发生变化。

答案 1 :(得分:2)

来自comment提供的moopet我已经构建了这个答案并制作了一个jsFiddle来说明他的想法

页面结构

我正在假设这是构建页面的HTML:

<div class="picture">

  <div class="pill-wrapper">
    <div class="pill">+1030</div>
  </div>

  <div class="content">
  </div>    

</div>​

我们将如何接近这个透明药丸边界?

根据moopet给出我们comments的想法,您可以绝对定位.pill-wrapper(并使用LESS变量找到正确的中心位置*)。为此.pill-wrapper提供填充和边框半径,然后您可以使用背景创建虚拟透明边框。只需设置背景以匹配显示的图片,并使用background-position来匹配评级药片在页面上的位置(再次,使用LESS变量可能会使这很简单)。

这如何转换为CSS?

请研究下面提供的CSS。请注意,仅显示必要的CSS。任何字体样式都应该由你自己应用。

.picture {
  position: absolute;

  width: 100%;
  height: 500px;

  background: url('http://goo.gl/Zi4hw');
}

.pill {
  box-sizing: border-box;

  width: auto;
  height: 36px;
  padding: 5px;

  background: #0066aa;
  border-radius: 18px;
  border: 2px solid #ffffff;
}

.pill-wrapper {
  position: absolute;
  top: 225px;
  left: 100px;

  height: 36px;
  padding: 10px;  

  background: url('http://goo.gl/Zi4hw') -100px -225px;
  border-radius: 36px;

}

.content {
  height: 250px;
  margin-top: 250px;
  background: rgba(255,255,255,0.9);
}

这种方法存在一定的问题。首先要注意的是,即使LESS会对所有内容进行预处理,但它并不是动态的或流动的,例如,在水平浏览器调整大小期间,额外的Javascript可能会令人遗憾地解决这个问题。其次,可能存在一些应该考虑的兼容性问题。

但是你可以在这里找到基础知识。

您可以在此处查看提议的解决方案:http://jsfiddle.net/bakkerjoeri/R99NT/3/

**:我没有经验编码,所以我为我假设的任何错误道歉。随意纠正我。*

答案 2 :(得分:1)

至于我 - 没有真正简单的解决方案。但我会尝试使用几个div将一个块与评级结合起来。想法是你可以准备一些灰色背景的图像,其中下半部分是灰色的,顶部是透明的。药丸本身的问题可以通过组合3(?)div来解决。一个用于左边的圆形边框 - 可以是带边框,灰色背景等的图像和透明部分,其中底层图像将可见。一个用于评级本身,一个用于右侧圆角。所有人都会以并排放置的方式建立背景图像,他们会制作药丸。而现在你只需将这一切都转移到你的顶层图像上。

答案 3 :(得分:1)

我认为不可能完全实现,尽管最接近的解决方案可能涉及:

创建与药丸相同但更大的元素。绝对定位新元素,使其位于药丸下方,但使其更大。给它提供与主要“橘子”图片相同的背景图像,但是调整其背景位置以使其正确排列。这显然取决于你的其他css的实现。

答案 4 :(得分:0)

如果用选择器“:after”和“:before”制作药丸,你可以在左边创建一个灰色div,在右边创建另一个,然后在药丸附近输入边界半径,但在另一侧。在药丸下你可以放一个大灰色。