ฉันจะแสดงเพียงบางส่วนของรูปภาพใน HTML / CSS ได้อย่างไร


140

สมมติว่าฉันต้องการวิธีแสดงเพียงกึ่งกลาง 50x50px ของรูปภาพที่ 250x250px ใน HTML ฉันจะทำสิ่งนั้นได้อย่างไร นอกจากนี้ยังมีวิธีทำเช่นนี้สำหรับการอ้างอิง css: url () หรือไม่

ฉันรู้เรื่องคลิปใน CSS แต่ดูเหมือนว่าจะใช้ได้เฉพาะเมื่อใช้กับการจัดตำแหน่งที่แน่นอน


รายการนอกเหนือควรจะอยู่ในรายชื่อของทุกคนของเว็บไซต์เพื่อเยี่ยมชมกับ HTML / CSS / ปัญหา JS: นี่เป็นวิธีหนึ่งในการทำสไปรท์ , และนี่คืออีกโดยใช้ JS
graham.reeds

1
ใช้สไปรต์ - ดูที่นี่w3schools.com/css/css_image_sprites.asp

คำตอบ:


116

วิธีหนึ่งที่ทำได้คือตั้งค่าภาพที่คุณต้องการแสดงเป็นพื้นหลังในคอนเทนเนอร์ (td, div, span ฯลฯ ) จากนั้นปรับตำแหน่งพื้นหลังเพื่อให้ได้ sprite ที่คุณต้องการ


1
เพื่อชี้แจงให้ชัดเจนคุณจะต้องตั้งค่าความกว้างและความสูงของคอนเทนเนอร์ td, div, span หรืออะไรก็ตามที่ 50px เพื่อให้ใช้งานได้
Paul D. Waite

7
@Espo ดูเหมือนว่าจะเป็นวิธีการมาตรฐานที่เป็นธรรม แต่ถ้าคุณมีภาพสไปรต์ที่มีภาพขนาด 32x32 แต่ละภาพหลายภาพและคุณต้องการแสดงภาพเหล่านี้ 1 ภาพบน div, span ฯลฯ ที่ใหญ่กว่า 32x32 .. .setting ตำแหน่งพื้นหลังไม่ทำงานอีกต่อไป
Matthew Layton

2
@ series0ne คุณอาจจะรวมกับbackground-size
Stijn de Witt

163

ดังที่กล่าวไว้ในคำถามมีclipคุณสมบัติ css แม้ว่ามันจะต้องการให้องค์ประกอบที่ถูกตัดคือposition: absolute;(ซึ่งเป็นความอัปยศ):

.container {
  position: relative;
}
#clip {
  position: absolute;
  clip: rect(0, 100px, 200px, 0);
  /* clip: shape(top, right, bottom, left); NB 'rect' is the only available option */
}
<div class="container">
  <img src="http://lorempixel.com/200/200/nightlife/3" />
</div>
<div class="container">
  <img id="clip" src="http://lorempixel.com/200/200/nightlife/3" />
</div>

การสาธิต JS Fiddleสำหรับการทดลอง

เพื่อเสริมคำตอบดั้งเดิม - ค่อนข้างล่าช้า - ฉันกำลังแก้ไขเพื่อแสดงการใช้งานclip-pathซึ่งได้แทนที่clipคุณสมบัติที่เลิกใช้แล้วในขณะนี้

clip-pathที่พักอนุญาตให้ช่วงของตัวเลือก (มากขึ้นกว่าเดิมclip) ของ:

  • inset- สี่เหลี่ยม / รูปทรงลูกบาศก์ที่กำหนดไว้กับสี่ค่าเป็น (top right bottom left)'ระยะห่างจาก'
  • circlecircle(diameter at x-coordinate y-coordinate)-
  • ellipseellipse(x-axis-length y-axis-length at x-coordinate y-coordinate)-
  • polygon- กำหนดโดยชุดของx/yพิกัดที่สัมพันธ์กับที่มาขององค์ประกอบของมุมซ้ายบน ในฐานะที่เป็นเส้นทางถูกปิดโดยอัตโนมัติจำนวนขั้นต่ำที่เป็นจริงของคะแนนสำหรับรูปหลายเหลี่ยมควรจะสามใด ๆ น้อย (สอง) เป็นเส้นหรือ (หนึ่ง) polygon(x-coordinate1 y-coordinate1, x-coordinate2 y-coordinate2, x-coordinate3 y-coordinate3, [etc...])เป็นจุด:
  • url - นี่อาจเป็น URL ท้องถิ่น (โดยใช้ CSS id-selector) หรือ URL ของไฟล์ภายนอก (โดยใช้เส้นทางไฟล์) เพื่อระบุ SVG แม้ว่าฉันยังไม่ได้ทดลองด้วย (เช่น) ดังนั้นฉันจึง ไม่สามารถให้ข้อมูลเชิงลึกเกี่ยวกับประโยชน์หรือข้อแม้ของพวกเขา

div.container {
  display: inline-block;
}
#rectangular {
  -webkit-clip-path: inset(30px 10px 30px 10px);
  clip-path: inset(30px 10px 30px 10px);
}
#circle {
  -webkit-clip-path: circle(75px at 50% 50%);
  clip-path: circle(75px at 50% 50%)
}
#ellipse {
  -webkit-clip-path: ellipse(75px 50px at 50% 50%);
  clip-path: ellipse(75px 50px at 50% 50%);
}
#polygon {
  -webkit-clip-path: polygon(50% 0, 100% 38%, 81% 100%, 19% 100%, 0 38%);
  clip-path: polygon(50% 0, 100% 38%, 81% 100%, 19% 100%, 0 38%);
}
<div class="container">
  <img id="control" src="http://lorempixel.com/150/150/people/1" />
</div>
<div class="container">
  <img id="rectangular" src="http://lorempixel.com/150/150/people/1" />
</div>
<div class="container">
  <img id="circle" src="http://lorempixel.com/150/150/people/1" />
</div>
<div class="container">
  <img id="ellipse" src="http://lorempixel.com/150/150/people/1" />
</div>
<div class="container">
  <img id="polygon" src="http://lorempixel.com/150/150/people/1" />
</div>

การสาธิต JS Fiddleสำหรับการทดลอง

อ้างอิง:


14
ค้นหาที่น่าอัศจรรย์ขอบคุณมาก :) เพียงแค่ FYI มันไม่ จำกัด อย่างที่ใคร ๆ ก็คิด หากคุณมี div คอนเทนเนอร์รูปภาพ (id = "img_container") รอบ ๆ แท็ก img ให้สร้างตำแหน่ง img_container และทำให้ img สมบูรณ์คุณสามารถคลิปภาพในแบบนั้นได้
FurtiveFelon

"position: absolute; (ซึ่งน่าละอาย)"
Sanket Sahu

ไม่ใช่ว่าฉันรู้แล้ว
เดวิดบอกว่าคืนสถานะโมนิก้า

6
clipจะเลิก บทความที่ใหม่กว่าclip-pathไม่ต้องการการวางตำแหน่ง
eagor

3
ในขณะที่คลิปถูกคัดค้านเบราว์เซอร์สมัยใหม่จำนวนมากยังไม่รองรับ clip-path developer.mozilla.org/en-US/docs/Web/CSS/clip-path
barrypicker

37

อีกทางเลือกหนึ่งคือสิ่งต่อไปนี้แม้ว่าจะไม่ใช่ภาพที่สะอาดที่สุด แต่ก็ถือว่าภาพเป็นองค์ประกอบเดียวในภาชนะเช่นในกรณีนี้:

<header class="siteHeader">
  <img src="img" class="siteLogo" />
</header>

จากนั้นคุณสามารถใช้คอนเทนเนอร์เป็นหน้ากากที่มีขนาดที่ต้องการและล้อมรอบรูปภาพด้วยระยะขอบลบเพื่อย้ายไปไว้ในตำแหน่งที่ถูกต้อง:

.siteHeader{
    width: 50px;
    height: 50px;
    overflow: hidden;
}

.siteHeader .siteLogo{
    margin: -100px;
}

การสาธิตสามารถเห็นได้ในJSFiddleนี้

ดูเหมือนว่าจะใช้งานได้ใน IE> 9 เท่านั้นและอาจเป็นเบราว์เซอร์รุ่นอื่น ๆ ที่สำคัญทั้งหมด


2
แม้ว่ามันจะเป็นบิตแฮ็ค แต่ก็มีข้อดีอีกด้านที่ใช้งานได้ในทุกเบราว์เซอร์ (คลิปถูกคัดค้านและคลิปพา ธ ไม่ทำงานใน IE) และจะทำงานเมื่อคุณพยายามพิมพ์หน้าเว็บ (ภาพพื้นหลังจะถูกข้ามไปโดยค่าเริ่มต้น )
Rauni Lillemets

นี่เป็นวิธีการเบราว์เซอร์ที่แท้จริงอย่างแท้จริงเท่านั้น วิธีอื่น ๆ ทั้งหมดมีปัญหา "คลิป" ถูกคิดค่าเสื่อมราคาและตำแหน่งพื้นหลังไม่สามารถอ่านได้อย่างถูกต้องในเบราว์เซอร์ทั้งหมด
Kareem
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.