您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Tweetdeck buttons for tabbing left/right
- // ==UserScript==
- // @name Tweetdeck side-scrolling buttons
- // @namespace https://mileshouse.neocities.org/
- // @version 1.2
- // @description Tweetdeck buttons for tabbing left/right
- // @author You
- // @match https://tweetdeck.twitter.com/
- // @icon https://www.google.com/s2/favicons?sz=64&domain=tweetdeck.twitter.com
- // @grant GM_registerMenuCommand
- // @license MIT
- // ==/UserScript==
- setTimeout(function() { // 2 second pause before running so tweetdeck can load columns
- 'use strict';
- var scrollInterval;
- var distance = 0;
- var targetLoc,targetPixel;
- // targetLoc is the current column index to scroll to, targetPixel is the pixel location of that index
- // currLoc,currPixel same things but where the page is currently scrolled to
- var column = document.querySelector("section.column");
- var container = document.querySelector("#container")
- var width = parseInt(getComputedStyle(column).marginRight)+column.clientWidth; // width of columns;assumes all columns are same
- // * if someone has a custom css with variable column width there will be unexpected behavior
- // buttons html (.stream-item gives it coloration so it can be light/dark)
- var inject = '<div class="lr-scroller stream-item"><div class="scroller-left"><</div><div class="scroller-right">></div></div>';
- // css to use when flipped to top
- var topStyle = `
- .lr-scroller {
- height: 50px;
- width: 100%;
- z-index: 2;
- display: flex;
- left: 0px;
- position: sticky;
- }
- .scroller-left, .scroller-right {
- width: 50%;
- height: 100%;
- font-size: 3em;
- text-align: center;
- user-select: none;
- border-right: black 1px solid;
- }
- `;
- // css to use when flipped to bottom
- var bottomStyle = `
- .lr-scroller {
- height: 50px;
- width: 100%;
- z-index: 2;
- display: flex;
- left: 0px;
- position: fixed;
- bottom: 0;
- border-top: black 1px solid;
- }
- .scroller-left, .scroller-right {
- width: 50%;
- height: 100%;
- font-size: 3em;
- text-align: center;
- user-select: none;
- border-right: black 1px solid;
- }
- `;
- // insert the css and check the cookie for top/bottom
- var styleSheet = document.createElement("style");
- if (window.localStorage.sidescroll == "bottom") {
- styleSheet.innerText = bottomStyle;
- } else {
- styleSheet.innerText = topStyle;
- }
- document.head.appendChild(styleSheet);
- // insert the buttons html
- container.insertAdjacentHTML("afterbegin", inject);
- // events for clicking the buttons and scrolling on them
- document.querySelector(".scroller-left").addEventListener("click", function(){
- width = parseInt(getComputedStyle(column).marginRight)+column.clientWidth;
- getNextPos(-1);
- startScrolling();
- });
- document.querySelector(".scroller-right").addEventListener("click", function(){
- width = parseInt(getComputedStyle(column).marginRight)+column.clientWidth;
- getNextPos(1);
- startScrolling();
- });
- document.querySelector(".lr-scroller").addEventListener("wheel", function(e){
- if (e.deltaY < 0){ //scrolling up
- width = parseInt(getComputedStyle(column).marginRight)+column.clientWidth;
- getNextPos(-1);
- startScrolling();
- }
- else if (e.deltaY > 0) { //scrolling down
- width = parseInt(getComputedStyle(column).marginRight)+column.clientWidth;
- getNextPos(1);
- startScrolling();
- }
- });
- // updates the target to scroll to
- function getNextPos(x) {
- var currLoc;
- var maxLoc = Math.floor(container.scrollLeftMax/width)+1; // number of scrolling locations plus 1 for the right-most location
- //container.scrollLeft; // current scroll pixel
- currLoc = Math.ceil(container.scrollLeft/width); // index of column currently scrolled to
- if (targetLoc != null) { // if target already exists you need to use that as current location, so if you are clicking the buttons fast it can scroll fast
- currLoc = targetLoc;
- }
- targetLoc = Math.max(currLoc+x, 0); // new target index is left/right 1 index from current location and above 0
- targetLoc = Math.min(targetLoc, maxLoc); // also new target index can't overshoot right
- targetPixel = targetLoc*width; // new target in pixels
- targetPixel = Math.min(targetPixel,container.scrollLeftMax); // if right-most location, make the targ=scrollLeftMax
- // so it doesnt try to overshoot and make a yucky animation
- }
- // yeah we gay keep scrolling
- function startScrolling(){
- if (scrollInterval==null) { // only start new interval if its not already going
- scrollInterval = setInterval(function(){
- var currPixel = container.scrollLeft; // Current Pixel
- distance = targetPixel-currPixel;
- // messy line but it makes it scroll a minimum of 1 pixel unless it's zero
- // if you just do Math.ceil without the 2nd part it will round fractional negative values the wrong way,
- // which will make the interval never reach the terminate condition when it hits -0.
- // the distance/5 part makes it go 20% of the remaining distance per frame,
- // which makes it have a fast->slow smooth animation curve
- container.scrollBy(Math.ceil(Math.abs(distance)/5)*(distance/Math.abs(distance)), 0);
- if (currPixel==targetPixel) { // if reached target, end interval and unset targets
- clearInterval(scrollInterval);
- scrollInterval = null;
- targetLoc = null;
- targetPixel = null;
- }
- }, 1000/60); // interval for 60 fps (1 second divided by 60)
- }
- }
- // this puts the "Flip button" toggle option in the Tamper/Greasemonkey menu
- GM_registerMenuCommand("Flip buttons to top/bottom", function(){
- if (window.localStorage.sidescroll == "bottom") { // flip to top
- window.localStorage.sidescroll = "top"
- styleSheet.innerText = topStyle;
- } else { // flip to bottom
- window.localStorage.sidescroll = "bottom"
- styleSheet.innerText = bottomStyle;
- }
- });
- }, 2000);
QingJ © 2025
镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址