จะมีการทำให้จุดไข่ปลาเคลื่อนไหวด้วยภาพเคลื่อนไหว CSS หรือไม่?


92

ฉันกำลังพยายามทำให้จุดไข่ปลาเคลื่อนไหวและสงสัยว่าเป็นไปได้ไหมกับภาพเคลื่อนไหว CSS ...

ดังนั้นมันอาจจะเป็นเช่นนั้น

Loading...
Loading..
Loading.
Loading...
Loading..

และโดยพื้นฐานแล้วก็เป็นเช่นนั้นต่อไป ความคิดใด ๆ ?

แก้ไข: ดังนี้http://playground.magicrising.de/demo/ellipsis.html


3
ภาพเคลื่อนไหวไม่ใช่การแปลงไม่ใช่การเปลี่ยน โปรดอย่าให้ทั้งสามคนปะปนกัน
BoltClock

ดูคำตอบของฉันสำหรับคำถามที่คล้ายกัน: stackoverflow.com/a/24349758/282729
feklee

คำตอบ:


88

แล้วคำตอบของ@ xecเวอร์ชันแก้ไขเล็กน้อย: http://codepen.io/thetallweeks/pen/yybGra

HTML

คลาสเดียวที่เพิ่มเข้าไปในองค์ประกอบ:

<div class="loading">Loading</div>

CSS

ภาพเคลื่อนไหวที่ใช้steps. ดูเอกสาร MDN

.loading:after {
  overflow: hidden;
  display: inline-block;
  vertical-align: bottom;
  -webkit-animation: ellipsis steps(4,end) 900ms infinite;      
  animation: ellipsis steps(4,end) 900ms infinite;
  content: "\2026"; /* ascii code for the ellipsis character */
  width: 0px;
}

@keyframes ellipsis {
  to {
    width: 20px;    
  }
}

@-webkit-keyframes ellipsis {
  to {
    width: 20px;    
  }
}

คำตอบของ @ xec มีผลต่อจุดต่างๆมากกว่าในขณะที่สิ่งนี้ทำให้จุดต่างๆปรากฏขึ้นทันที


1
ฉันหมายความว่าคุณตอบคำถามนี้ในอีก 3 ปีต่อมา แต่น่าจะดีกว่า
Rey

3
@ xckpd7 ใช่ แต่วันนี้ฉัน googled สิ่งนี้และเพิ่งพบคำตอบนี้ ดังนั้นไม่ได้มีไว้สำหรับ OP เท่านั้น แต่เป็นทรัพยากรสำหรับทุกคน!
Matt Parrilla

1
@MattParrilla ฉันเป็น OP และถ้าคุณสังเกตว่าฉันเปลี่ยนคำตอบฉันยอมรับคำตอบนี้ก่อนที่ฉันจะแสดงความคิดเห็นนั้น
Rey

10
หากคุณกำลังใช้สิ่งนี้กับข้อความที่อยู่กึ่งกลางหรือจัดชิดขวาขอแนะนำให้เพิ่มคำนำหน้าmargin-right(หรือช่องว่างภายใน?) ของ20pxและทำให้ข้อความเคลื่อนไหวใน0pxกรณีที่คุณไม่ต้องการให้ข้อความของคุณขยับระหว่างภาพเคลื่อนไหว
Kimball

1emแทนที่20pxอาจทำงานได้ดีกว่าสำหรับ CSS ในคำตอบนี้
Jeevan Takhar

56

คุณสามารถลองใช้animation-delay propertyและเวลาแต่ละอักขระจุดไข่ปลา ในกรณีนี้ฉันได้ใส่ตัวละครจุดไข่ปลาแต่ละตัว<span class>เพื่อที่ฉันจะได้เคลื่อนไหวแยกกัน

ฉันทำตัวอย่างซึ่งไม่สมบูรณ์แบบ แต่อย่างน้อยก็แสดงให้เห็นว่าฉันหมายถึงอะไร :)

รหัสจากตัวอย่างของฉัน:

HTML

Loading<span class="one">.</span><span class="two">.</span><span class="three">.</span>​

CSS

.one {
    opacity: 0;
    -webkit-animation: dot 1.3s infinite;
    -webkit-animation-delay: 0.0s;
    animation: dot 1.3s infinite;
    animation-delay: 0.0s;
}

.two {
    opacity: 0;
    -webkit-animation: dot 1.3s infinite;
    -webkit-animation-delay: 0.2s;
    animation: dot 1.3s infinite;
    animation-delay: 0.2s;
}

.three {
    opacity: 0;
    -webkit-animation: dot 1.3s infinite;
    -webkit-animation-delay: 0.3s;
    animation: dot 1.3s infinite;
    animation-delay: 0.3s;
}

@-webkit-keyframes dot {
    0% {
        opacity: 0;
    }
    50% {
        opacity: 0;
    }
    100% {
        opacity: 1;
    }
}

@keyframes dot {
    0% {
        opacity: 0;
    }
    50% {
        opacity: 0;
    }
    100% {
        opacity: 1;
    }
}

ฉันชอบไอเดียนี้และขยายความอีกเล็กน้อยเพื่อแสดง "marching elipses": jsfiddle.net/toddwprice/cRLMw
Todd Price

มันใช้ไม่ได้ (?) ดังนั้นฉันจึงเพิ่ม display: inline; แล้วก็จุด นี่เป็นวิธีการทำงานหรือไม่? jsfiddle.net/cRLMw/3
Christofer Vilander

4
ขออภัย @Christofer - ลืมบันทึกซออัพเดทของฉัน นี่เป็นอีกครั้ง: jsfiddle.net/toddwprice/cRLMw/8 นอกจากนี้นี่คือบทความที่ฉันเพิ่งอ่านซึ่งมีภาพเคลื่อนไหว CSS ที่น่าสนใจ: tympanus.net/Tutorials/LoadingAnimations/index4.html
ราคาทอดด์

การใช้ Firefox ฉันไม่สามารถลากได้หากเพียงแค่คลิกและลากภาพในภาพเดียว แต่ถ้าฉันคลิกที่ภาพก่อนแล้วคลิกและลากฉันไม่ได้รับการป้องกันจากการลาก
Sam Rueby

2
ฉันปรับแต่ง HTML และ CSS เล็กน้อยเพื่อใช้ <i> แท็ก ... jsfiddle.net/DkcD4/77
Adam Youngers

32

แม้แต่วิธีแก้ปัญหาที่ง่ายกว่าก็ใช้ได้ผลดี!

<style>
    .loading:after {
      display: inline-block;
      animation: dotty steps(1,end) 1s infinite;
      content: '';
    }

    @keyframes dotty {
        0%   { content: ''; }
        25%  { content: '.'; }
        50%  { content: '..'; }
        75%  { content: '...'; }
        100% { content: ''; }
    }
</style>
<div class="loading">Loading</div>

เพิ่งแก้ไขเนื้อหาด้วยภาพเคลื่อนไหวแทนที่จะซ่อนบางจุด ...

สาธิตที่นี่: https://jsfiddle.net/f6vhway2/1/


แก้ไข: ขอบคุณ@BradCollins ที่ชี้ให้เห็นว่านั่นcontentไม่ใช่คุณสมบัติที่เคลื่อนไหวได้

https://www.w3.org/TR/css3-transitions/#animatable-css

นี่คือโซลูชัน WebKit / Blink / Electron เท่านั้น (แต่ก็ใช้ได้ใน FF เวอร์ชันปัจจุบันเช่นกัน)


ฉันดูกระทู้นี้เมื่อสัปดาห์ที่แล้ว คำตอบง่ายๆที่ดี!
r8n5n

1
+1 contentสำหรับภาพเคลื่อนไหว เพื่อให้ได้จังหวะการเคลื่อนไหวที่steps(1)สม่ำเสมอคุณควรใช้และกำหนดคีย์เฟรมพิเศษหนึ่งเฟรม ฟังก์ชัน step จะกำหนดจำนวนขั้นตอนระหว่างคีย์เฟรมและเนื่องจากเรากำลังระบุแต่ละเฟรมเราจึงต้องการขั้นตอนเดียวระหว่างเฟรมเหล่านั้น codepen.io/anon/pen/VmEdXj
Jeff Camera

ในขณะที่ฉันชอบความสง่างามของโซลูชันนี้ แต่ควรสังเกตว่า IE11 และ (ณ วันที่เขียนนี้) Firefox ไม่รองรับการเคลื่อนไหวของcontentคุณสมบัติ (ไม่รู้เกี่ยวกับ Edge)
Brad Collins

@BradCollins ขอบคุณสำหรับสิ่งนี้! ฉันแก้ไขคำตอบแล้ว!
CodeBrauer

15

คำตอบสั้น ๆ คือ "ไม่จริง" อย่างไรก็ตามคุณสามารถเล่นกับความกว้างที่เคลื่อนไหวและส่วนเกินที่ซ่อนอยู่และอาจได้รับเอฟเฟกต์ที่ "ใกล้พอ" (รหัสด้านล่างปรับแต่งสำหรับ Firefox เท่านั้นเพิ่มคำนำหน้าผู้ขายตามต้องการ)

html

<div class="loading">Loading</div>

css

.loading:after {
    overflow: hidden;
    display: inline-block;
    vertical-align: bottom;
    -moz-animation: ellipsis 2s infinite;
    content: "\2026"; /* ascii code for the ellipsis character */
}
@-moz-keyframes ellipsis {
    from {
        width: 2px;
    }
    to {
        width: 15px;
    }
}

การสาธิต: http://jsfiddle.net/MDzsR/1/

แก้ไข

ดูเหมือนว่า Chrome จะมีปัญหาในการทำให้องค์ประกอบหลอกเคลื่อนไหว วิธีแก้ไขง่ายๆคือห่อจุดไข่ปลาในองค์ประกอบของมันเอง ตรวจสอบhttp://jsfiddle.net/MDzsR/4/


ไม่ทำงานใน Chromium (ใช่ฉันเปลี่ยนคำนำหน้าผู้ขายเป็น-webkitfrom -moz)
เดวิดกล่าวว่าคืนสถานะโมนิกา

@DavidThomas คุณพูดถูก - ทดสอบใน Chrome แล้วและดูเหมือนว่าจะมีปัญหากับองค์ประกอบหลอก คุณสามารถรวมจุดไข่ปลาในองค์ประกอบของมันเองและทำให้เคลื่อนไหวได้ (จะทำงานใน firefox ด้วย) jsfiddle.net/MDzsR/4
xec

1
ทางออกที่ดีจริงๆและสมบูรณ์แบบสำหรับแอป Firefox OS ที่ฉันกำลังพัฒนา ปรับแต่งนิดหน่อย: jsfiddle.net/feklee/x69uN
feklee

นี่คือเวอร์ชันที่ปรับปรุงแล้วซึ่งใช้งานได้บน Chrome และทำงานได้อย่างถูกต้องกับองค์ประกอบที่จัดชิดซ้าย (ไม่เปลี่ยนความกว้าง) นอกจากนี้ยังแสดงแต่ละจุดติดต่อกันโดยไม่มีสิ่งประดิษฐ์ที่เปิดเผยแบบเลื่อนนี้: jsfiddle.net/fze2qxsv
Aayla Secura

@AaylaSecura คำตอบที่ยอมรับมีวิธีแก้ปัญหาที่สะอาดกว่าโดยใช้ขั้นตอนแทนstackoverflow.com/a/28074607/833146
xec

3

การเพิ่มที่ล่าช้า แต่ฉันพบวิธีทำซึ่งรองรับข้อความที่อยู่กึ่งกลาง

<element>:after {
    content: '\00a0\00a0\00a0';
    animation: progress-ellipsis 5s infinite;
}

@keyframes progress-ellipsis {
    0% {
        content: '\00a0\00a0\00a0';
    }
    30% {
        content: '.\00a0\00a0';
    }
    60% {
        content: '..\00a0';
    }
    90% {
        content: '...';
    }
}

3

คุณสามารถเคลื่อนไหวได้clip(หรือดีกว่าclip-pathถ้าคุณไม่ต้องการการสนับสนุนจาก IE)

div {
  position: relative;
  display: inline-block;
  font-size: 1.4rem;
}

div:after {
  position: absolute;
  margin-left: .1rem;
  content: ' ...';
  display: inline-block;
  animation: loading steps(4) 2s infinite;
  clip: rect(auto, 0px, auto, auto);
}

@keyframes loading {
  to {
    clip: rect(auto, 20px, auto, auto);
  }
}
<div>Loading</div>


1

อันที่จริงมีวิธี CSS ที่แท้จริงในการทำเช่นนี้

ฉันได้รับตัวอย่างจาก CSS Tricks แต่ทำให้มันได้รับการสนับสนุนใน Internet Explorer ด้วย (ฉันได้ทดสอบใน 10+)

ตรวจสอบการสาธิต: http://jsfiddle.net/Roobyx/AT6v6/2/

HTML:

<h4 id="searching-ellipsis"> Searching
    <span>.</span>
    <span>.</span>
    <span>.</span>
</h4>

CSS:

@-webkit-keyframes opacity {
  0% {
    filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=100);
    opacity: 1;
  }
  100% {
    filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=0);
    opacity: 0;
  }
}

@-moz-keyframes opacity {
  0% {
    filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=100);
    opacity: 1;
  }

  100% {
    filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=0);
    opacity: 0;
  }
}

@-webkit-keyframes opacity {
  0% {
    filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=100);
    opacity: 1;
  }
  100% {
    filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=0);
    opacity: 0;
  }
}

@-moz-keyframes opacity {
  0% {
    filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=100);
    opacity: 1;
  }
  100% {
    filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=0);
    opacity: 0;
  }
}

@-o-keyframes opacity {
  0% {
    filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=100);
    opacity: 1;
  }
  100% {
    filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=0);
    opacity: 0;
  }
}

@keyframes opacity {
  0% {
    filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=100);
    opacity: 1;
  }
  100% {
    filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=0);
    opacity: 0;
  }
}
#searching-ellipsis span {
  -webkit-animation-name: opacity;
  -webkit-animation-duration: 1s;
  -webkit-animation-iteration-count: infinite;
  -moz-animation-name: opacity;
  -moz-animation-duration: 1s;
  -moz-animation-iteration-count: infinite;
  -ms-animation-name: opacity;
  -ms-animation-duration: 1s;
  -ms-animation-iteration-count: infinite;
}
#searching-ellipsis span:nth-child(2) {
  -webkit-animation-delay: 100ms;
  -moz-animation-delay: 100ms;
  -ms-animation-delay: 100ms;
  -o-animation-delay: 100ms;
  animation-delay: 100ms;
}
#searching-ellipsis span:nth-child(3) {
  -webkit-animation-delay: 300ms;
  -moz-animation-delay: 300ms;
  -ms-animation-delay: 300ms;
  -o-animation-delay: 300ms;
  animation-delay: 300ms;
}

คุณกำลังเพิ่มตัวกรองเฉพาะ IE ที่เป็นกรรมสิทธิ์ในคีย์เฟรมเฉพาะของ Mozilla และเฉพาะสำหรับ Webkit นี่เป็นการปรับปรุงวิธีแก้ปัญหาที่ยอมรับแล้วได้อย่างไร มันยังมีปัญหาเดียวกัน (ในเฟรม 4 และ 5 จะมองเห็นเฉพาะสองจุดสุดท้ายและสองจุดสุดท้ายตามลำดับซึ่งตรงข้ามกับสิ่งที่ระบุไว้ในคำถามซึ่งมี 3 สถานะซ้ำไม่ใช่ 5)
xec

คำถามเกี่ยวกับการสร้างจุดโหลดและมีเพียงตัวอย่างใกล้ ๆ เท่านั้นที่ไม่บังคับ สิ่งที่ฉันเพิ่มคือคำนำหน้าดังนั้น IE สามารถจดจำได้ดีขึ้นและแสดงผล
MRadev

3
-webkit-keyframesจะใช้กับ webkit เท่านั้นและภายในคุณจะมีรหัส IE เท่านั้น รหัสนี้ไม่ทำอะไรเลยนอกจากเปลืองเนื้อที่
xec

0

นี่คือวิธีแก้ปัญหาของฉันด้วย css บริสุทธิ์https://jsfiddle.net/pduc6jx5/1/ อธิบาย: https://medium.com/@lastseeds/create-text-ellipsis-animation-with-pure-css-7f61acee69cc

scss



.dot1 {
 animation: visibility 3s linear infinite;
}

@keyframes visibility {
 0% {
 opacity: 1;
 }
 65% {
 opacity: 1;
 }
 66% {
 opacity: 0;
 }
 100% {
 opacity: 0;
 }
}

.dot2 {
 animation: visibility2 3s linear infinite;
}

@keyframes visibility2 {
 0% {
  opacity: 0;
 }
 21% {
  opacity: 0;
 }
 22% {
  opacity: 1;
 }
 65% {
  opacity: 1;
 }
 66% {
  opacity: 0;
 }
 100% {
  opacity: 0;
 }
}

.dot3 {
 animation: visibility3 3s linear infinite;
}

@keyframes visibility3 {
 0% {
  opacity: 0;
 }
 43% {
  opacity: 0;
 }
 44% {
  opacity: 1;
 }
 65% {
  opacity: 1;
 }
 66% {
  opacity: 0;
 }
 100% {
  opacity: 0;
 }
}

html

Loading <span class="dot dot1">.</span><span class="dot dot2">.</span><span class="dot dot3">.</span>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.