ภาพเคลื่อนไหว CSS3: การแสดงผล + ความทึบ


106

ฉันมีปัญหากับภาพเคลื่อนไหว CSS3

.child {
    opacity: 0;
    display: none;

    -webkit-transition: opacity 0.5s ease-in-out;
    -moz-transition: opacity 0.5s ease-in-out;
    transition: opacity 0.5s ease-in-out;
}

.parent:hover .child {
    opacity: 0.9;
    display: block;
}

รหัสนี้ใช้ได้เฉพาะเมื่อฉันลบการเปลี่ยนแปลงของdisplay.

ฉันต้องการเปลี่ยนการแสดงผลหลังจากเลื่อนเมาส์ไปแล้ว แต่ควรเปลี่ยนความทึบโดยใช้การเปลี่ยน


2
หาก CSS ไม่ทำงานตามที่คนอื่นแนะนำนี่คือโค้ด Javascript ที่เรียบง่ายมากสำหรับการซีดจาง
Abhranil Das

คำตอบ:


122

จากคำตอบของ Michaels นี่คือรหัส CSS จริงที่จะใช้

.parent:hover .child
{
    display: block;

    -webkit-animation: fadeInFromNone 0.5s ease-out;
    -moz-animation: fadeInFromNone 0.5s ease-out;
    -o-animation: fadeInFromNone 0.5s ease-out;
    animation: fadeInFromNone 0.5s ease-out;
}

@-webkit-keyframes fadeInFromNone {
    0% {
        display: none;
        opacity: 0;
    }

    1% {
        display: block;
        opacity: 0;
    }

    100% {
        display: block;
        opacity: 1;
    }
}

@-moz-keyframes fadeInFromNone {
    0% {
        display: none;
        opacity: 0;
    }

    1% {
        display: block;
        opacity: 0;
    }

    100% {
        display: block;
        opacity: 1;
    }
}

@-o-keyframes fadeInFromNone {
    0% {
        display: none;
        opacity: 0;
    }

    1% {
        display: block;
        opacity: 0;
    }

    100% {
        display: block;
        opacity: 1;
    }
}

@keyframes fadeInFromNone {
    0% {
        display: none;
        opacity: 0;
    }

    1% {
        display: block;
        opacity: 0;
    }

    100% {
        display: block;
        opacity: 1;
    }
}

1
รองรับทุกเบราว์เซอร์ .. ?
david_adler

CSS3 ไม่รองรับในทุกเบราว์เซอร์ หากคุณต้องการขยายเพียงแค่เพิ่มคำนำหน้าที่ถูกต้อง
คริส

17
แล้วเมื่อวางเมาส์เหนือจะใช้งาน fadeOutToNone ได้อย่างไร?
กรีน

4
เนื่องจากคุณสามารถใช้เศษส่วนเป็นเปอร์เซ็นต์ได้จึงควรใช้บางอย่างเช่น 0.001% แทนที่จะเป็น 1% เนื่องจากจะช่วยลดความล่าช้าในการ "เริ่ม" ให้เหลือน้อยที่สุดซึ่งสามารถเห็นได้ชัดด้วยระยะเวลาการเคลื่อนไหวที่ยาวขึ้น
Zach Saucier

1
คำสั่ง -o-keyframes ไม่มีประโยชน์จริง ๆ เพราะ Opera เวอร์ชันแรกที่รองรับภาพเคลื่อนไหวนั้นใช้ webkit อยู่แล้ว
Rico Ocepek

45

ถ้าเป็นไปได้ - ใช้ visibilityแทนdisplay

ตัวอย่างเช่น:

.child {
    visibility: hidden;
    opacity: 0;
    transition: opacity 0.3s, visibility 0.3s;
}

.parent:hover .child {
    visibility: visible;
    opacity: 1;
    transition: opacity 0.3s, visibility 0.3s;
}

24
ปัญหาเกี่ยวกับคุณสมบัติการมองเห็นคือสิ่งนี้ไม่ได้ซ่อนองค์ประกอบ แต่ทำให้มองไม่เห็นเท่านั้น ดังนั้นมันจะยังคงใช้พื้นที่
Samuel

6
ไม่เพียง แต่มองไม่เห็นเท่านั้น แต่ยังโปร่งใสต่อเหตุการณ์ (การคลิก ฯลฯ ) การไม่เปลี่ยนการแสดงผลหมายถึงการไม่เปลี่ยนเอกสารใหม่ซึ่งเป็นสิ่งที่ดี องค์ประกอบส่วนใหญ่ที่ควรจางเข้า / ออกผ่านความทึบควรจะมีตำแหน่งคงที่หรือแน่นอนอยู่แล้ว
Rasmus Kaj

43

คุณสามารถทำได้ด้วยภาพเคลื่อนไหว CSS:

0% display:none ; opacity: 0;
1% display: block ; opacity: 0;
100% display: block ; opacity: 1;

ความคิดที่ดีฉันประสบความสำเร็จให้แสดงองค์ประกอบของฉันในระหว่างที่วางเมาส์เหนือด้วยโหมดเติมภาพเคลื่อนไหว แต่จากนั้นฉันวางเมาส์องค์ประกอบจะหายไป
Alexis Delrieu

2
คุณสามารถใช้โหมดเติม: ส่งต่อเพื่อคงการเปลี่ยนแปลงหลังจากภาพเคลื่อนไหวเสร็จสิ้น
Michael Mullany

13

วิธีแก้ปัญหานี้ใช้ได้ผล:

  1. กำหนด "คีย์เฟรม":

    @-webkit-keyframes fadeIn { 
      0% { opacity: 0; }
      20% { opacity: 0; }
      40% { opacity: 0.3; }
      60% { opacity: 0.5; }
      80% { opacity: 0.9; }
      100% { opacity: 1; }
    }
    
    @keyframes fadeIn {
      0% { opacity: 0; }
      20% { opacity: 0; }
      40% { opacity: 0.3; }
      60% { opacity: 0.5; }
      80% { opacity: 0.9; }
      100% { opacity: 1; }
    }
    
  2. ใช้ "คีย์เฟรม" นี้ใน "โฮเวอร์":

    div a span { 
      display: none;
    }
    
    div a:hover span {
      display: block;
    
      -webkit-animation-name: fadeIn;
      -webkit-animation-duration: 1s;
      animation-name: fadeIn;
      animation-duration: 1s;
    }
    

9

ฉันใช้สิ่งนี้เพื่อบรรลุมัน พวกเขาจางหายไป แต่ไม่มีที่ว่างเมื่อซ่อนอยู่สมบูรณ์แบบ!

.child {
    height: 0px;
    opacity: 0;
    visibility: hidden;
    transition: all .5s ease-in-out;
}

.parent:hover .child {
    height: auto;
    opacity: 1;
    visibility: visible;
}

6

ฉันเปลี่ยนไปเล็กน้อย แต่ผลลัพธ์ก็สวยงาม

.child {
    width: 0px;
    height: 0px;
    opacity: 0;
}

.parent:hover child {
    width: 150px;
    height: 300px;
    opacity: .9;
}

ขอบคุณทีมงานทุกคน


4
สิ่งนี้ไม่เหมาะกับโปรแกรมอ่านหน้าจอ: พวกเขาจะอ่านเนื้อหาต่อไป
ehdv

1
คุณสามารถเพิ่มvisibility: hidden;ไปที่. children / visibility:visible;to the hover และสิ่งนี้ควรแก้ไขปัญหาโปรแกรมอ่านหน้าจอ
csilk

6

มีอีกวิธีที่ดีในการทำสิ่งนี้โดยใช้ตัวชี้เหตุการณ์:

.child {
    opacity: 0;
    pointer-events: none;

    -webkit-transition: opacity 0.5s ease-in-out;
    -moz-transition: opacity 0.5s ease-in-out;
    transition: opacity 0.5s ease-in-out;
}

.parent:hover .child {
    opacity: 0.9;
    pointer-events: all;
}

ขออภัยสิ่งนี้ไม่รองรับใน IE10 และต่ำกว่า


4

ผมมีปัญหาเหมือนกัน. ฉันลองใช้ภาพเคลื่อนไหวแทนการเปลี่ยน - ตามที่ @MichaelMullany และ @Chris แนะนำ - แต่ใช้ได้กับเบราว์เซอร์ webkit เท่านั้นแม้ว่าฉันจะคัดลอกวางด้วยคำนำหน้า "-moz" และ "-o" ก็ตาม

ฉันสามารถแก้ไขปัญหาโดยใช้visibilityแทนdisplayไฟล์. สิ่งนี้ใช้ได้กับฉันเพราะองค์ประกอบลูกของฉันเป็นposition: absoluteดังนั้นการไหลของเอกสารจึงไม่ได้รับผลกระทบ อาจใช้ได้ผลกับคนอื่นด้วย

นี่คือลักษณะของรหัสเดิมเมื่อใช้โซลูชันของฉัน:

.child {
    position: absolute;
    opacity: 0;
    visibility: hidden;

    -webkit-transition: opacity 0.5s ease-in-out;
    -moz-transition: opacity 0.5s ease-in-out;
    transition: opacity 0.5s ease-in-out;
}

.parent:hover .child {
    position: relative;
    opacity: 0.9;
    visibility: visible;
}

หากคุณต้องวางเมาส์กลับไปที่เด็กในขณะที่กำลังเคลื่อนไหวโดยไม่อยู่ในมุมมองมันจะกลับเข้ามาใหม่เนื่องจากองค์ประกอบนั้นซ่อนอยู่เท่านั้น ค่อนข้างน่ารำคาญหากคุณกำลังเลื่อนเมาส์ไปรอบ ๆ สถานที่
adamj

4

หากคุณทริกเกอร์การเปลี่ยนแปลงด้วย JS สมมติว่าเมื่อคลิกมีวิธีแก้ปัญหาที่ดี

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

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

นี่คือตัวอย่าง JQuery:

    $('.child').css({"display":"block"});
    //now ask the browser what is the value of the display property
    $('.child').css("display"); //this will trigger the browser to apply the change. this costs one frame render
    //now a change to opacity will trigger the animation
    $('.child').css("opacity":100);

2
คำถามนี้ไม่ได้ติดแท็ก JavaScript หรือ jQuery
j08691

ฉันรู้ฉันเขียนเพื่ออธิบายเหตุผลที่เกิดขึ้น มันมีประโยชน์มากสำหรับฉันเมื่อฉันได้เรียนรู้เรื่องนี้และฉันหวังว่ามันจะช่วยคนอื่น ๆ ด้วย
daniel.sedlacek

2
Btw ค่า Opacity อยู่ระหว่าง 0 ถึง 1
Amr

2

สำหรับองค์ประกอบที่แน่นอนหรือคงที่คุณสามารถใช้ดัชนี z:

.item {
    position: absolute;
    z-index: -100;
}

.item:hover {
    z-index: 100;
}

องค์ประกอบอื่น ๆ ควรมีดัชนี z ระหว่าง -100 ถึง 100 ในขณะนี้


น่าเสียดายที่สกรูสัญลักษณ์ตัวบ่งชี้รหัสผ่าน KeePass บนtype=passwordฟิลด์ มองไม่เห็น
philk

1
เราช่วยหยุดใช้ตัวเลข z-index โดยพลการได้ไหม ที่นี่: z-index: 1; เทียบกับ z-index: -1 ก็ทำได้ดี การเลือกตัวเลข z-index ขนาดใหญ่ทำให้จัดการสิ่งต่างๆไม่ได้
dudewad

2

ฉันรู้ว่านี่ไม่ใช่วิธีแก้ปัญหาสำหรับคำถามของคุณเพราะคุณถาม

จอแสดงผล + ความทึบ

วิธีการของฉันช่วยแก้คำถามทั่วไป แต่บางทีนี่อาจเป็นปัญหาเบื้องหลังที่ควรแก้ไขโดยใช้displayร่วมกับopacity.

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

.child {
  left: -2000px;
  opacity: 0;
  visibility: hidden;
  transition: left 0s 0.8s, visibility 0s 0.8s, opacity 0.8s;
}

.parent:hover .child {
  left: 0;
  opacity: 1;
  visibility: visible;
  transition: left 0s, visibility 0s, opacity 0.8s;
}

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

ส่วนที่น่าสนใจคือคำจำกัดความการเปลี่ยนแปลงสองแบบที่แตกต่างกัน เมื่อตัวชี้เมาส์วางเมาส์เหนือ.parentองค์ประกอบ.childจะต้องวางองค์ประกอบทันทีจากนั้นความทึบจะเปลี่ยนไป:

transition: left 0s, visibility 0s, opacity 0.8s;

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

transition: left 0s 0.8s, visibility 0s 0.8s, opacity 0.8s;

การย้ายวัตถุออกไปจะเป็นทางเลือกที่ใช้ได้ในกรณีที่การตั้งค่าdisplay:noneจะไม่ทำให้เค้าโครงเสียหาย

ฉันหวังว่าฉันจะตอกตะปูบนหัวสำหรับคำถามนี้แม้ว่าฉันจะไม่ได้ตอบก็ตาม


ตัวกรองของ Microsoft นั้นเลิกใช้งานไปแล้วตั้งแต่ IE9 มีเหตุผลใดที่ทำให้คุณรู้สึกอยากเพิ่มคำตอบในปี 2559
TylerH

@TylerH มีผู้ใช้กี่คนที่ยินดีที่จะเข้าถึงคือคำถามของรสนิยม
Hannes Morgenstern

พิจารณาว่าเลิกใช้งานแล้วและ Microsoft ไม่รองรับ IE <11 อีกต่อไปการใช้คุณสมบัตินั้นจึงเป็นเรื่องที่น่าสงสัยที่สุด
TylerH

@TylerH เป็นเรื่องปกติที่จะต้องรองรับไคลเอนต์ที่ไม่ยอมหรือไม่สามารถอัพเกรดเป็นเบราว์เซอร์รุ่นใหม่ได้ ฉันมีธนาคารที่รู้จักกันดีในฐานะลูกค้าที่ยังใช้ IE6 และปฏิเสธที่จะอัปเกรดด้วย "เหตุผล"
Marcus Cunningham

@MarcusCunningham คำถามถูกแท็กด้วยcss3ซึ่งขัดขวางการใช้ IE6 (และ IE7 และ IE8) โดยสิ้นเชิง ในเบราว์เซอร์ OP ที่เร็วที่สุดที่เป็นไปได้คือการเขียนโค้ดตัวกรอง MS ในคำตอบนี้เลิกใช้แล้ว และสำหรับผู้อ่านในอนาคตก็ยิ่งไร้ประโยชน์เนื่องจากไม่ได้รับการสนับสนุนด้วยซ้ำ มีไม่มีอาร์กิวเมนต์สำหรับการรวมไว้ในคำตอบกับคำถามนี้ อย่างไรก็ตามมันเป็นประเด็นที่น่าสงสัยเนื่องจาก Hannes ได้ลบมันออกจากคำตอบของเขาแล้ว
TylerH

1

สิ่งหนึ่งที่ฉันทำคือตั้งค่าระยะขอบของสถานะเริ่มต้นเป็น "ระยะขอบซ้าย: -9999px" เพื่อไม่ให้ปรากฏบนหน้าจอจากนั้นรีเซ็ต "ระยะขอบซ้าย: 0" ในสถานะวางเมาส์เหนือ เก็บไว้เป็น "display: block" ในกรณีนั้น เคล็ดลับสำหรับฉัน :)

แก้ไข: บันทึกสถานะและไม่เปลี่ยนกลับไปเป็นสถานะโฮเวอร์ก่อนหน้า? ตกลงที่นี่เราต้องการ JS:

<style>
.hovered { 
    /* hover styles here */
}
</style>

<script type="text/javascript">
$('.link').hover(function() {
   var $link = $(this);
   if (!$link.hasclass('hovered')) { // check to see if the class was already given
        $(this).addClass('hovered');
   } 
});
</script>

ความคิดที่ดี แต่แล้วฉันก็
เลื่อนเมาส์ออก

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

ใช่ขอโทษ. ฉันต้องการบันทึกการจางหายในเมาส์เอาท์
Alexis Delrieu

ที่เปลี่ยนแปลงทุกอย่าง เกือบ. โดยพื้นฐานแล้วสิ่งที่คุณต้องการคือฟังก์ชัน JS ที่จะตรวจจับสถานะโฮเวอร์ตามที่ผู้ใช้รายอื่นระบุและเพิ่ม ... ดี ... ดูคำตอบที่อัปเดตของฉัน
Joshua

1

หากต้องการมีภาพเคลื่อนไหวทั้งสองวิธีบน HoverIn / Out ฉันทำวิธีนี้ หวังว่าจะช่วยให้ใครบางคน

@keyframes fadeOutFromBlock {
  0% {
    position: relative;
    opacity: 1;
    transform: translateX(0);
  }

  90% {
    position: relative;
    opacity: 0;
    transform: translateX(0);
  }

  100% {
    position: absolute;
    opacity: 0;
    transform: translateX(-999px);
  }
}

@keyframes fadeInFromNone {
  0% {
    position: absolute;
    opacity: 0;
    transform: translateX(-999px);
  }

  1% {
    position: relative;
    opacity: 0;
    transform: translateX(0);
  }

  100% {
    position: relative;
    opacity: 1;
    transform: translateX(0);
  }
}

.drafts-content {
  position: relative;
  opacity: 1;
  transform: translateX(0);
  animation: fadeInFromNone 1s ease-in;
  will-change: opacity, transform;

  &.hide-drafts {
    position: absolute;
    opacity: 0;
    transform: translateX(-999px);
    animation: fadeOutFromBlock 0.5s ease-out;
    will-change: opacity, transform;
  }
}

0

วิธีสร้างความสามารถในการเคลื่อนไหวด้วย CSS:
นี่คือรหัสของฉัน:
รหัส CSS

.item {   
    height:200px;
    width:200px;
    background:red;
    opacity:0;
    transition: opacity 1s ease-in-out;
}

.item:hover {
    opacity: 1;
}
code {
    background: linear-gradient(to right,#fce4ed,#ffe8cc);
}
<div class="item">

</div>
<p><code> move mouse over top of this text</code></p>

หรือตรวจสอบไฟล์สาธิตนี้

ฟังก์ชั่นโหวต () {
var vote = getElementById ("yourOpinion")
if (this.workWithYou):
โหวต + = 1};
ฮ่า ๆ


1
ไม่ตอบคำถามเนื่องจากdisplayทรัพย์สินถูกลบออกไป
Toast

-4

display:ไม่สามารถเปลี่ยนแปลงได้ คุณอาจจะต้องใช้ jQuery เพื่อทำสิ่งที่คุณต้องการทำ


4
คุณต้องหยุดสนับสนุน jQuery ทุกที่
Benjamin Gruenbaum

1
@BenjaminGruenbaum jQuery เป็นผู้ชายที่น่าทึ่ง มันยอดเยี่ยมและทำได้ทุกสิ่ง
Madara's Ghost
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.