2011-09-16 45 views
18

Tôi có một phần tử div, có chiều rộng 200px và chiều cao 200px. Tôi cần một hình ảnh nhỏ để xuất hiện ở góc trên cùng bên phải của div. Làm thế nào người ta sẽ thường làm điều đó sẽ là vớiSử dụng Css Sprites và vị trí nền

background: url(/images/imagepath.png) top right; 

Tuy nhiên vấn đề là, tôi đang tải hình ảnh từ định dạng Sprite và khi tôi sử dụng một cái gì đó giống như

background: url(/web/images/imagepath.png) -215px -759px top right; 

sprite doesnt dường như nhặt nó từ đúng vị trí. Một số phần khác của sprite được nạp. Có thể tải một hình ảnh từ sprite và sử dụng thuộc tính background-position. Cảm ơn trước ...

Trả lời

29

Bạn cần chỉ định tọa độ cho vị trí phần tử và vị trí nền theo hai cách khác nhau.

#yourimage { 
    background-image: url(/web/images/imagepath.png); 
    /* background coordinates */ 
    background-position: -215px -759px; 

    /* element coordinates */ 
    position:absolute; 
    left: 0; /* 0px from the left */ 
    top: 0; /* 0px from the top */ 
} 

Với background-position bạn chỉ định toạ độ nền. Đối với các tọa độ của phần tử, bạn cần đặt các thuộc tính leftright.

Hãy nhớ rằng để sử dụng sprites, phần tử của bạn phải có kích thước chính xác. Hình ảnh bạn đang sử dụng làm nền phải có đủ không gian để che chiều rộng và chiều cao của phần tử, không nhiều hơn, nếu không bạn sẽ thấy nhiều hơn một hình ảnh từ hình ảnh sprites của bạn.

Nếu bạn muốn hiển thị hình ảnh nhỏ hơn phần tử của mình, bạn cần phần tử nhỏ hơn bên trong phần tử lớn.

<div id="container"> 
    <div class="background"></div> 
    my content here 
</div> 

Sau đó, trong CSS của bạn

#container { 
    position:relative; 
    width: 200px; /* size of your big element */ 
    height: 200px; 
} 
#container .background { 
    background: url(/web/images/imagepath.png) -215px -759px; 
    width: 50px; /* width and height of the sprite image you want to display */ 
    height: 50px; 
    position: absolute; 
    top: 0; 
    left: 0; 
} 
0

Bạn chỉ định top right hoặc vị trí pixel chính xác, không phải cả hai.

Bên cạnh đó, bạn không thể tải một phần nhỏ của ảnh sprite để sử dụng làm nền cho phần tử lớn hơn. Bạn sẽ phải đặt một phần tử nhỏ bên trong nó, có kích thước của sprite.

+0

Vị trí điểm ảnh là chọn phần nào của sprite sẽ được chọn. Tuy nhiên, một phần của sprite sẽ chỉ xuất hiện ở góc trên cùng bên phải của div. Có cách nào mà điều này có thể được thực hiện bằng cách sử dụng sprites? –

+0

Bạn có thể tạo một div nhỏ, có kích thước của sprite và cho nó hình nền như bạn thường làm. Sau đó, đặt div đó bên trong 200px * 200px div của bạn và cung cấp cho div sprite 'position: absolute; trên cùng: 0; bên phải: 0; '. Cha mẹ phải có 'vị trí: tương đối' hoặc' vị trí: tuyệt đối' quá, hoặc vị trí sẽ không hoạt động đúng. – GolezTrol

+0

@MaximDsouza Sự cố của bạn đã được giải quyết chưa? – GolezTrol

13

Bạn có thể sử dụng :before pseudoclass như thế này:

.element:before { 
    content:""; 
    position:absolute; 
    right:0; 
    top:0; 
    width:20px; 
    height:20px; 
    background: url(/web/images/imagepath.png) -215px -759px; 
} 

nhưng điều này vẫn chưa được hỗ trợ.

Lời khuyên của tôi là làm cho yếu tố khác bên trong bọc và định vị nó hoàn toàn giống như trên :before nhưng ví dụ thực div

EDIT bạn

Một cách khéo léo của việc sử dụng sprites trong góc hộp là described here.

+1

Điều này có vẻ là cách tốt nhất để làm điều này ngày nay. Tương thích trong các trình duyệt hiện đại và IE8 +. – cfx

0

kiểm tra bằng cách sử dụng background-gốc thay vì background-position.

bạn chỉ có thể có một vị trí nền được chỉ định và ngay bây giờ bạn có hai vị trí (-215px -759px) và (trên cùng bên phải).

+1

Thật không may 'background-origin' thậm chí còn tồi tệ hơn so với': before' vì hỗ trợ từ IE9 và ': before' pseudoclass từ IE8. – avall

2

Nếu bạn có thể sử dụng một tiền xử lý như SCSS:

(cập nhật để thực sự trả lời câu hỏi hỏi; cũng thấy live example)

// ----------- only things you need to edit { --------------- 
$sprite-size: 16px; // standard sprite tile size 
$sprite-padding: 0px; // if you have padding between tiles 
// ----------- } only things you need to edit --------------- 

// basic sprite properties (extension-only class) 
%sprite { 
    width:$sprite-size; height:$sprite-size; // must restrict viewport, otherwise other sprites may "bleed through" 
    // could set shared standard tilesheet `background-image: url(...)` 
    // other standard styles, like `display:inline-block` or `position:absolute` 
} 

// helper for assigning positioning using friendlier numbers like "5" instead of doing the math 
@mixin sprite-offset($xoffset:0, $yoffset:0, $increment:$sprite-size, $padding: $sprite-padding) { 
    background-position: -($xoffset*($increment + $padding)) -($yoffset*($increment + $padding)); 
} 

Để "phao" một nền từ một sprite, như the answer by @jose-faeti cho biết bạn cần phải involve a placeholder element

<div class="float-bg"> 
    <div class="bg"></div> 
    <p>Lorem ipsum dolor si...</p> 
</div> 

với phong cách như:

.float-bg .bg { 
    @extend %sprite; // apply sizing properties 
    background-image: url(...); // actually set the background tiles 

    @include sprite-offset(4); 

    // specific configuration per accepted answer 
    position:absolute; 
    top: 0; 
    right: 0; 
} 

Trong câu trả lời ban đầu của tôi, để create a list of buttons, bạn có thể:

// list out the styles names for each button 
$buttons: 'help', 'font', 'layerup', 'layerdown', 'transform', 'export', 'save', 'clear', 'move-left', 'move-right', 'move-up', 'move-down', 'png', 'jpg', 'svg', 'funky'; 

.btns > * { @extend %sprite; background-image:... } // apply sizing properties, bg 

// autoassigns positioning 
@for $i from 1 through length($buttons) { 
    $btn: nth($buttons, $i); 
    .btn-#{$btn} { 
     // @extend .sprite; 
     @include sprite-offset($i - 1); 
    } 
} 

sau đó sẽ làm việc trên something like:

<ul class="btns"> 
    <li class="btn-help">...</li> 
    <li class="btn-font">...</li> 
    <li class="btn-save">...</li> 
    <li class="btn-export">...</li> 
    <li class="btn-etc">...</li> 
    <li class="btn-etc">...</li> 
</ul>