Rethink buttons hover transitions
This commit is contained in:
@@ -2,19 +2,21 @@
|
|||||||
export let href = '#'
|
export let href = '#'
|
||||||
export let type = 'a'
|
export let type = 'a'
|
||||||
export let text = ''
|
export let text = ''
|
||||||
|
|
||||||
const hasSlot = arguments[1].$$slots !== undefined
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
{#if type === 'button'}
|
{#if type === 'button'}
|
||||||
<button class={$$props.class ? $$props.class : 'button'} class:button-icon={hasSlot} data-text={text} on:click>
|
<button class={$$props.class ? $$props.class : 'button'} on:click>
|
||||||
<slot></slot>
|
<slot></slot>
|
||||||
<span>{text}</span>
|
<div class="text" data-text={text}>
|
||||||
|
<span>{text}</span>
|
||||||
|
</div>
|
||||||
</button>
|
</button>
|
||||||
|
|
||||||
{:else}
|
{:else}
|
||||||
<a {href} class={$$props.class ? $$props.class : 'button'} class:button-icon={hasSlot} data-text={text} on:click>
|
<a {href} class={$$props.class ? $$props.class : 'button'} on:click>
|
||||||
<slot></slot>
|
<slot></slot>
|
||||||
<span>{text}</span>
|
<div class="text" data-text={text}>
|
||||||
|
<span>{text}</span>
|
||||||
|
</div>
|
||||||
</a>
|
</a>
|
||||||
{/if}
|
{/if}
|
||||||
|
|||||||
@@ -1,13 +1,13 @@
|
|||||||
<script>
|
<script>
|
||||||
import * as fn from '../functions'
|
import * as fn from '../functions'
|
||||||
|
|
||||||
export let href = ''
|
export let href = '/'
|
||||||
export let text = ''
|
export let text = ''
|
||||||
export let target = ''
|
export let target = ''
|
||||||
export let rel = ''
|
export let rel = ''
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<a {href} class="link-translate" {target} {rel}>
|
<a class="link-translate" {href} {target} {rel}>
|
||||||
<slot />
|
<slot />
|
||||||
<div class="text" data-text={text}>
|
<div class="text" data-text={text}>
|
||||||
<span>{text}</span>
|
<span>{text}</span>
|
||||||
|
|||||||
@@ -23,26 +23,29 @@
|
|||||||
font-size: rem(18px);
|
font-size: rem(18px);
|
||||||
}
|
}
|
||||||
|
|
||||||
span {
|
|
||||||
display: block;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Second text
|
// Second text
|
||||||
&:after {
|
.text {
|
||||||
opacity: 0;
|
span {
|
||||||
content: attr(data-text);
|
display: block;
|
||||||
position: absolute;
|
}
|
||||||
display: block;
|
|
||||||
text-align: center;
|
|
||||||
top: 50%;
|
|
||||||
left: 0;
|
|
||||||
right: 0;
|
|
||||||
transform: translateY(-120%);
|
|
||||||
}
|
|
||||||
|
|
||||||
span, &:after {
|
&:after {
|
||||||
transition: transform 275ms $ease-cubic, opacity 275ms $ease-cubic;
|
opacity: 0;
|
||||||
will-change: transform, opacity;
|
content: attr(data-text);
|
||||||
|
position: absolute;
|
||||||
|
display: block;
|
||||||
|
text-align: center;
|
||||||
|
top: 50%;
|
||||||
|
left: 0;
|
||||||
|
right: 0;
|
||||||
|
transform: translateY(-120%);
|
||||||
|
}
|
||||||
|
|
||||||
|
span, &:after {
|
||||||
|
transition: transform 275ms $ease-cubic, opacity 275ms $ease-cubic;
|
||||||
|
will-change: transform, opacity;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Disabled
|
// Disabled
|
||||||
@@ -60,7 +63,7 @@
|
|||||||
opacity: 0;
|
opacity: 0;
|
||||||
transform: translateY(100%);
|
transform: translateY(100%);
|
||||||
}
|
}
|
||||||
&:after {
|
.text:after {
|
||||||
opacity: 1;
|
opacity: 1;
|
||||||
transform: translateY(-50%);
|
transform: translateY(-50%);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -48,33 +48,30 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Text
|
// Text
|
||||||
|
.text {
|
||||||
|
position: relative;
|
||||||
|
overflow: hidden;
|
||||||
|
|
||||||
|
&:after {
|
||||||
|
content: attr(data-text);
|
||||||
|
opacity: 0;
|
||||||
|
display: block;
|
||||||
|
position: absolute;
|
||||||
|
top: 50%;
|
||||||
|
left: 0;
|
||||||
|
width: 100%;
|
||||||
|
transform: translateY(-120%);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
span {
|
span {
|
||||||
display: block;
|
display: block;
|
||||||
}
|
}
|
||||||
&:after {
|
span, .text:after {
|
||||||
opacity: 0;
|
|
||||||
content: attr(data-text);
|
|
||||||
position: absolute;
|
|
||||||
display: block;
|
|
||||||
top: 50%;
|
|
||||||
left: 0;
|
|
||||||
width: 100%;
|
|
||||||
transform: translateY(-120%);
|
|
||||||
}
|
|
||||||
span, &:after {
|
|
||||||
transition: transform 275ms $ease-cubic, opacity 275ms $ease-cubic;
|
transition: transform 275ms $ease-cubic, opacity 275ms $ease-cubic;
|
||||||
will-change: transform, opacity;
|
will-change: transform, opacity;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Button has an icon (offset the hovered text)
|
|
||||||
&-icon:after {
|
|
||||||
left: 13px;
|
|
||||||
|
|
||||||
@include breakpoint (sm) {
|
|
||||||
left: 19px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Hover
|
// Hover
|
||||||
&:hover {
|
&:hover {
|
||||||
color: #fff;
|
color: #fff;
|
||||||
@@ -86,15 +83,13 @@
|
|||||||
.anim {
|
.anim {
|
||||||
animation-play-state: running;
|
animation-play-state: running;
|
||||||
}
|
}
|
||||||
span {
|
.text {
|
||||||
opacity: 0;
|
span {
|
||||||
transform: translateY(100%);
|
opacity: 0;
|
||||||
}
|
transform: translateY(100%);
|
||||||
&:after {
|
}
|
||||||
opacity: 1;
|
&:after {
|
||||||
transform: translateY(-47%);
|
opacity: 1;
|
||||||
|
|
||||||
@include breakpoint (sm) {
|
|
||||||
transform: translateY(-50%);
|
transform: translateY(-50%);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user