\r\n```\r\n```ここに言語を入力\r\nconst buttonscroll = document.querySelector('.c-scroll-button');\r\nconst container = document.querySelector('.p-scrollbar');\r\n const caret = document.querySelector('.fa-chevron-right');\r\n const button = document.querySelector('.c-scroll-button');\r\n\r\nbuttonscroll.addEventListener('click', movement);\r\n\r\n\r\nfunction movement() {\r\nif (container.scrollLeft == 0) {\r\ncontainer.scrollLeft = container.scrollWidth;\r\n} else {\r\ncontainer.scrollLeft = 0;\r\n}\r\n}\r\n\r\n\r\nbutton.forEach((caret) => {\r\n button.addEventListener(\"click\", () => {\r\n if (button.type === \"caret\") {\r\n caret.classList.replace(\"fa-chevron-right\", \"fa-chevron-left\");\r\n } else {\r\n caret.classList.replace(\"fa-chevron-left\", \"fa-chevron-right\");\r\n }\r\n });\r\n});\r\n\r\n```\r\n\r\nサンプル\r\nhttps://codepen.io/boo-jp/pen/ZEJvPEV","answerCount":2,"upvoteCount":0,"datePublished":"2021-11-05T04:07:21.997Z","dateModified":"2022-01-12T10:55:45.698Z","suggestedAnswer":[{"@type":"Answer","text":"おそらく、`movement()`の挙動に合わせて、「ボタンを押すと右に動くときはボタン内に右矢印を表示、反対なら左矢印を表示したい」ということなんでしょう。こういう情報、質問文に書くべきだと思います。\r\n\r\nコード内の`buttonscroll`と`button`は同じもののはずで、すでに `movement()` がクリックで呼ばれるようになっているのですから、クラス変更も `movement()` の中でやればよいでしょう。\r\n\r\n* `container.scrollLeft = container.scrollWidth` を実行した場合は、それ以降は左にしか進めない → `fa-chevron-right` を `fa-chevron-left` に置き換える\r\n* `container.scrollLeft = 0` を実行した場合は、それ以降は右にしか進めない → `fa-chevron-left` を `fa-chevron-right` に置き換える\r\n\r\nクラスを置換する対象は押されたボタンではなく、ボタンの子供要素で複数あるので、`for (let caret of button.querySelectorAll('.fas')) {` などでループする必要がありますね。","dateModified":"2021-11-05T06:06:49.422Z","datePublished":"2021-11-05T05:32:20.848Z","upvoteCount":1,"url":"https://teratail.com/questions/367870#reply-499536","comment":[{"@type":"Comment","text":"for文はif文とはべつですかね?難しい。。\r\n function movement() {\r\n if (container.scrollLeft == 0) {\r\n container.scrollTo({\r\n left: container.scrollWidth,\r\n behavior: \"smooth\", //behaviowプロパティでスムースに動くようにできる\r\n });\r\n for (let caret of button.querySelectorAll('.fas')) {\r\n caret.classList.replace(\"fa-chevron-left\", \"fa-chevron-right\");\r\n }\r\n } else {\r\n container.scrollTo({\r\n left: 0,\r\n behavior: \"smooth\", //behaviowプロパティでスムースに動くようにできる\r\n });\r\n }\r\n}","datePublished":"2021-11-06T10:19:19.046Z","dateModified":"2021-11-06T10:19:33.206Z"},{"@type":"Comment","text":"else 側にも同じようなforループが必要です。","datePublished":"2021-11-06T10:34:08.897Z","dateModified":"2021-11-06T10:34:08.897Z"},{"@type":"Comment","text":"function movement() {\r\n if (container.scrollLeft == 0) {\r\n container.scrollTo({\r\n left: container.scrollWidth,\r\n behavior: \"smooth\",\r\n });\r\n for (let caret of button.querySelectorAll('.fas')) {\r\ncaret.classList.replace(\"fa-chevron-left\", \"fa-chevron-right\");\r\n}\r\n } else {\r\n container.scrollTo({\r\n left: 0,\r\n behavior: \"smooth\",\r\n });\r\n for (let caret of button.querySelectorAll('.fas')) {\r\n caret.classList.replace(\"fa-chevron-right\", \"fa-chevron-left\");\r\n}\r\n }\r\n}\r\n\r\n変化がないですね。。なんか間違ってます?","datePublished":"2021-11-06T12:08:53.132Z","dateModified":"2021-11-06T12:08:53.132Z"},{"@type":"Comment","text":"classList.replace()のパラメータが逆です。それ以外は大丈夫に見えます。","datePublished":"2021-11-06T13:28:59.205Z","dateModified":"2021-11-06T13:28:59.205Z"}]},{"@type":"Answer","text":"`const button = document.querySelector('.c-scroll-button')`とありますので、`button`はElement(またはnull)でしょう。\r\nElementには、forEachメソッドはないです。\r\n\r\n[NodeList.prototype.forEach() - Web API | MDN](https://developer.mozilla.org/ja/docs/Web/API/NodeList/forEach)\r\n\r\n`querySelectorAll`メソッドであれば、NodeListが返りますが、その場合は`button.addEventListener`でエラーになるはずです。\r\n問題がなければ、forEachを外してしまう方がわかりやすそうです。\r\n\r\nまずは、DevToolsの使い方を覚えて、エラーメッセージを確認できるようになった方がいいでしょう。\r\n\r\n---\r\n\r\nただ、`button.type === \"caret\"`については何をしたいのかがよくわかりませんでした。","dateModified":"2021-11-05T05:22:31.748Z","datePublished":"2021-11-05T05:21:18.417Z","upvoteCount":0,"url":"https://teratail.com/questions/367870#reply-499534","comment":[]}],"breadcrumb":{"@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"トップ","url":"https://teratail.com"},{"@type":"ListItem","position":2,"name":"JavaScriptに関する質問","url":"https://teratail.com/tags/JavaScript"},{"@type":"ListItem","position":3,"name":"JavaScript","url":"https://teratail.com/tags/JavaScript"}]}}}
現状
clickするとスクールバーが左右に移動する。
クリックイベントでreplaceでクラス名を変更したいのですが、うまくいかず。
スピードもtransitionをcssにつけてもだめで
レクチャーいただければ幸いです。
<div class="l-table">
<div class="js-scrollable p-scrollbar">
<table class="p-table-search-theme">
<thead class="has-background-thead">
<tr class="thead">
<th class="sorting th-first" rowspan="2">登録<br>番号</th>
<th class="sorting th-second" rowspan="2">登録<br>番号</th>
<th class="sorting th-third" rowspan="2">技術名称</th>
<th class="th-fourth" rowspan="2">技術名称</th>
<th class="th-fifth" colspan="2">技術名称 </th>
<th class="sorting th-seventh" rowspan="2">技術名称</th>
<th class="sorting th-eighth" rowspan="2">技術名称</th>
<th class="th-ninth" rowspan="2">カタログ・パンフレット</th>
</tr>
<tr>
<th class="sorting-sc">農業農村<br>設備事業</th>
<th class="sorting-sc">その他<br>事業</th>
</tr>
</thead>
<tbody>
<tr>
<td> 0 </td>
<td class="text-left"><a href="#"> 株</a>
</td>
<td class="text-left"><a href="#">text</a></td>
<td class="text-left">text
</td>
<td>12648 件</td>
<td>12648 件</td>
<td>2021年</td>
<td>2021年/01</td>
<td><span class="icon"><a href="#">リーフレット(cs-21)</a></span><span class="icon"><a href="#">製品カタログ(cs-21シリーズ)</a></span></td>
</tr>
<tr>
<td> 1 </td>
<td class="text-left"><a href="#"> 株</a>
</td>
<td class="text-left"><a href="#">text</a></td>
<td class="text-left">text
</td>
<td>12648 件</td>
<td>12648 件</td>
<td>2021年</td>
<td>2021年/01</td>
<td><span class="icon"><a href="#">リーフレット(cs-21)</a></span><span class="icon"><a href="#">製品カタログ(cs-21シリーズ)</a></span></td>
</tr>
<tr>
<td> 2 </td>
<td class="text-left"><a href="#"> 株</a>
</td>
<td class="text-left"><a href="#">text</a></td>
<td class="text-left">text
</td>
<td>12648 件</td>
<td>12648 件</td>
<td>2021年</td>
<td>2021年/01</td>
<td><span class="icon"><a href="#">リーフレット(cs-21)</a></span><span class="icon"><a href="#">製品カタログ(cs-21シリーズ)</a></span></td>
</tr>
<tr>
<td> 3 </td>
<td class="text-left"><a href="#"> 株</a>
</td>
<td class="text-left"><a href="#">text</a></td>
<td class="text-left">text
</td>
<td>12648 件</td>
<td>12648 件</td>
<td>2021年</td>
<td>2021年/01</td>
<td><span class="icon"><a href="#">リーフレット(cs-21)</a></span><span class="icon"><a href="#">製品カタログ(cs-21シリーズ)</a></span></td>
</tr>
<tr>
<td> 4 </td>
<td class="text-left"><a href="#"> 株</a>
</td>
<td class="text-left"><a href="#">text</a></td>
<td class="text-left">text
</td>
<td>12648 件</td>
<td>12648 件</td>
<td>2021年</td>
<td>2021年/01</td>
<td><span class="icon"><a href="#">リーフレット(cs-21)</a></span><span class="icon"><a href="#">製品カタログ(cs-21シリーズ)</a></span></td>
</tr>
<tr>
<td> 5 </td>
<td class="text-left"><a href="#"> 株</a>
</td>
<td class="text-left"><a href="#">text</a></td>
<td class="text-left">text
</td>
<td>12648 件</td>
<td>12648 件</td>
<td>2021年</td>
<td>2021年/01</td>
<td><span class="icon"><a href="#">リーフレット(cs-21)</a></span><span class="icon"><a href="#">製品カタログ(cs-21シリーズ)</a></span></td>
</tr>
</tbody>
</table>
<button type="button" class="c-scroll-button border-radius"><i class="fas fa-chevron-right"></i><i class="fas fa-chevron-right"></i></button>
</div>
</div>
<style>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0-beta2/css/all.min.css" integrity="sha512-YWzhKL2whUzgiheMoBFwW8CKV4qpHQAEuvilg9FAn5VJUDwKZZxkJNuGM4XkWuk94WCrrwslk8yWNGmY1EduTA==" crossorigin="anonymous" referrerpolicy="no-referrer" />
<link rel="stylesheet" href="https://unpkg.com/scroll-hint@1.0.0/css/scroll-hint.css">
</style>
<script src="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0-beta2/js/all.min.js" integrity="sha512-cyAbuGborsD25bhT/uz++wPqrh5cqPh1ULJz4NSpN9ktWcA6Hnh9g+CWKeNx2R0fgQt+ybRXdabSBgYXkQTTmA==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
const buttonscroll = document.querySelector('.c-scroll-button');
const container = document.querySelector('.p-scrollbar');
const caret = document.querySelector('.fa-chevron-right');
const button = document.querySelector('.c-scroll-button');
buttonscroll.addEventListener('click', movement);
function movement() {
if (container.scrollLeft == 0) {
container.scrollLeft = container.scrollWidth;
} else {
container.scrollLeft = 0;
}
}
button.forEach((caret) => {
button.addEventListener("click", () => {
if (button.type === "caret") {
caret.classList.replace("fa-chevron-right", "fa-chevron-left");
} else {
caret.classList.replace("fa-chevron-left", "fa-chevron-right");
}
});
});
サンプル
https://codepen.io/boo-jp/pen/ZEJvPEV
おそらく、movement()の挙動に合わせて、「ボタンを押すと右に動くときはボタン内に右矢印を表示、反対なら左矢印を表示したい」ということなんでしょう。こういう情報、質問文に書くべきだと思います。
コード内のbuttonscrollとbuttonは同じもののはずで、すでに movement() がクリックで呼ばれるようになっているのですから、クラス変更も movement() の中でやればよいでしょう。
container.scrollLeft = container.scrollWidth を実行した場合は、それ以降は左にしか進めない → fa-chevron-right を fa-chevron-left に置き換える
container.scrollLeft = 0 を実行した場合は、それ以降は右にしか進めない → fa-chevron-left を fa-chevron-right に置き換える
クラスを置換する対象は押されたボタンではなく、ボタンの子供要素で複数あるので、for (let caret of button.querySelectorAll('.fas')) { などでループする必要がありますね。
const button = document.querySelector('.c-scroll-button')とありますので、buttonはElement(またはnull)でしょう。
Elementには、forEachメソッドはないです。
NodeList.prototype.forEach() - Web API | MDN
querySelectorAllメソッドであれば、NodeListが返りますが、その場合はbutton.addEventListenerでエラーになるはずです。
問題がなければ、forEachを外してしまう方がわかりやすそうです。
まずは、DevToolsの使い方を覚えて、エラーメッセージを確認できるようになった方がいいでしょう。
ただ、button.type === "caret"については何をしたいのかがよくわかりませんでした。
15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.29%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる
質問する
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/11/06 10:19 編集
2021/11/06 10:34
2021/11/06 12:08
2021/11/06 13:28