diff --git a/src/client/app/desktop/views/components/post-form.vue b/src/client/app/desktop/views/components/post-form.vue
index aaec36ed3..ecb703818 100644
--- a/src/client/app/desktop/views/components/post-form.vue
+++ b/src/client/app/desktop/views/components/post-form.vue
@@ -11,7 +11,7 @@
 			<a @click="addVisibleUser">+ユーザーを追加</a>
 		</div>
 		<div class="hashtags" v-if="recentHashtags.length > 0">
-			<a v-for="tag in recentHashtags" @click="addTag(tag)">#{{ tag }}</a>
+			<a class="hashtag" v-for="tag in recentHashtags" @click="addTag(tag)">%fa:hashtag%{{ tag }}</a>
 		</div>
 		<input v-show="useCw" v-model="cw" placeholder="内容への注釈 (オプション)">
 		<textarea :class="{ with: (files.length != 0 || poll) }"
@@ -184,6 +184,22 @@ export default Vue.extend({
 			}
 
 			this.$nextTick(() => this.watch());
+
+			const hashtags = [...document.getElementsByClassName('hashtag')];
+			const hashtagsContainer = hashtags.parentElement;
+			let offsetX = 0
+			const update = () => {
+				if (hashtags[0].getBoundingClientRect().right <= hashtagsContainer.getBoundingClientRect().left) {
+					hashtags.push(hashtags.shift());
+					offsetX = 0;
+					hashtags.map(x => x.style.transform = 'translateX(0)');
+				} else {
+					offsetX--;
+					hashtags.map(x => x.style.transform = `translateX(${offsetX}px)`);
+				}
+				requestAnimationFrame(update);
+			};
+			update()
 		});
 	},
 
@@ -494,8 +510,38 @@ root(isDark)
 				color isDark ? #fff : #666
 
 		> .hashtags
+			margin 0 -16px 8px
+			overflow-x hidden
+			white-space nowrap
 			> *
-				margin-right 8px
+				background $theme-color
+				border-radius: 0 4px 4px 0
+				color isDark ? #282c37 : #fff8f6
+				margin-left 28px
+				white-space nowrap
+				&:hover
+					text-decoration none
+					background darken($theme-color, 10%)
+				&::before
+					background inherit
+					border-radius 4px 0
+					content ''
+					display inline-block
+					height 17.677669529663688110021109052621225982120898442212px
+					position absolute
+					right 100%
+					top 50%
+					transform translateY(-50%) translateX(50%) rotate(-45deg)
+					width 17.677669529663688110021109052621225982120898442212px
+				&::after
+					background isDark ? #282c37 : #fff8f6
+					border-radius 50%
+					content ''
+					height 4px
+					left -6.25px
+					position absolute
+					top 10px
+					width 4px
 
 		> .medias
 			margin 0
diff --git a/src/client/app/mobile/views/components/post-form.vue b/src/client/app/mobile/views/components/post-form.vue
index b04a1968d..b8edd57f7 100644
--- a/src/client/app/mobile/views/components/post-form.vue
+++ b/src/client/app/mobile/views/components/post-form.vue
@@ -40,7 +40,7 @@
 		</div>
 	</div>
 	<div class="hashtags" v-if="recentHashtags.length > 0">
-		<a v-for="tag in recentHashtags" @click="addTag(tag)">#{{ tag }}</a>
+		<a class="hashtag" v-for="tag in recentHashtags" @click="addTag(tag)">%fa:hashtag%{{ tag }}</a>
 	</div>
 </div>
 </template>
@@ -165,6 +165,22 @@ export default Vue.extend({
 		this.$nextTick(() => {
 			this.focus();
 		});
+
+		const hashtags = [...document.getElementsByClassName('hashtag')];
+		const hashtagsContainer = hashtags.parentElement;
+		let offsetX = 0
+		const update = () => {
+			if (hashtags[0].getBoundingClientRect().right <= hashtagsContainer.getBoundingClientRect().left) {
+				hashtags.push(hashtags.shift());
+				offsetX = 0;
+				hashtags.map(x => x.style.transform = 'translateX(0)');
+			} else {
+				offsetX -= .25;
+				hashtags.map(x => x.style.transform = `translateX(${offsetX}px)`);
+			}
+			requestAnimationFrame(update);
+		};
+		update()
 	},
 
 	methods: {
@@ -465,10 +481,35 @@ root(isDark)
 					box-shadow none
 
 	> .hashtags
-		margin 8px
-
+		margin 0 -16px 8px
+		overflow-x hidden
+		white-space nowrap
 		> *
-			margin-right 8px
+			background $theme-color
+			border-radius: 0 4px 4px 0
+			color isDark ? #282c37 : #fff8f6
+			margin-left 28px
+			white-space nowrap
+			&::before
+				background inherit
+				border-radius 4px 0
+				content ''
+				display inline-block
+				height 17.677669529663688110021109052621225982120898442212px
+				position absolute
+				right 100%
+				top 50%
+				transform translateY(-50%) translateX(50%) rotate(-45deg)
+				width 17.677669529663688110021109052621225982120898442212px
+			&::after
+				background isDark ? #282c37 : #fff8f6
+				border-radius 50%
+				content ''
+				height 4px
+				left -6.25px
+				position absolute
+				top 10px
+				width 4px
 
 .mk-post-form[data-darkmode]
 	root(true)