1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 | /* 噗幣左邊對話框 */ .premium { /* 參數 */ --dialog-bottom: 2rem; /* 對話框距離底部高度 */ /* 游標移過去參數 */ --dialog-color: #E88D43; /* 對話框顏色 */ --dialog-font-color: #fff; /* 對話框文字顏色 */ --dialog-content: "歡迎光臨~"; /* 對話框文字內容 */ --dialog-width: calc(1rem * 5 + 1.5rem); /* 對話框寬度,推薦字數長度+1.5rem */ /* 點擊時參數 */ --dialog-active-color: #d74747; --dialog-active-font-color: #fff; --dialog-active-content: "唉唷!"; --dialog-active-width: calc(1rem * 3 + 1.5rem); } /* 初始(非 hover)狀態隱藏泡泡 */ .premium::before, .premium::after { opacity: 0; position: absolute; transform: translateX(calc(var(--width) * 1.1)) translateY(calc( var(--dialog-bottom) + var(--dialog-bottom) * .5)) scale(.2); transition: opacity 140ms ease, transform 180ms cubic-bezier(.2,.9,.2,1.2); } /* 左側對話框(膠囊) */ .premium::before { content: var(--dialog-content); right: calc(var(--width) + 4px); bottom: var(--dialog-bottom); z-index: 10; min-width: var(--dialog-width); max-block-size: 48px; /* 最大高度 */ box-sizing: border-box; overflow: hidden; /* 超出裁切,確保不超界 */ /* 文字排版 */ white-space: normal; /* 自動換行 */ word-break: break-word; /* 長字也可斷行 */ line-height: 1.2; font-size: 12px; font-weight: 600; /* 視覺(膠囊) */ padding: 6px 8px; border-radius: 999px; background-color: var(--dialog-color); color: var(--dialog-font-color); box-shadow: 0 2px 8px rgba(0,0,0,.25); } /* 小尾巴(朝向目標,置於膠囊右側中點) */ .premium::after { content: ""; right: calc(var(--width) + 4px); bottom: calc( var(--dialog-bottom) - 5px); width: 20px; height: 10px; clip-path: polygon(80% 0, 0 0, 100% 100%); background-color: var(--dialog-color); pointer-events: none; z-index: 11; } /* hover 時顯示 */ .premium:hover::before, .premium:hover::after { opacity: 1; transform: translateY(0) scale(1); } /* active 時顯示 */ .premium:active::before{ content: var(--dialog-active-content); min-width: var(--dialog-active-width)} .premium:active::before, .premium:active::after { opacity: 1; transform: translateY(0) scale(1); background-color: var(--dialog-active-color); color: var(--dialog-active-font-color); } |
Direct link: https://paste.plurk.com/show/YLqkLg2wfbTHx8nXuqqy